Add wxConfig::Read(float *) overload.

This uses Read(double *) but casts the result to float after checking that it
is in the correct range.

Closes #12100.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@64428 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2010-05-29 10:35:38 +00:00
parent 84f4eef892
commit 384859f8c6
5 changed files with 81 additions and 1 deletions

View File

@@ -449,6 +449,7 @@ All:
- Added wxResourceTranslationsLoader for loading translations from Windows
resources.
- Added wxMessageQueue::Clear().
- Added wxConfig::Read(float *) overload (Terry Farnham).
Unix:

View File

@@ -181,6 +181,10 @@ public:
bool Read(const wxString& key, double* val) const;
bool Read(const wxString& key, double* val, double defVal) const;
// read a float
bool Read(const wxString& key, float* val) const;
bool Read(const wxString& key, float* val, float defVal) const;
// read a bool
bool Read(const wxString& key, bool* val) const;
bool Read(const wxString& key, bool* val, bool defVal) const;

View File

@@ -589,10 +589,33 @@ public:
*/
bool Read(const wxString& key, double* d,
double defaultVal) const;
/**
Reads a bool value, returning @true if the value was found. If the
Reads a float value, returning @true if the value was found.
With the second overload, if the value was not found, @a defaultVal is
used instead.
Notice that the value is read as a double but must be in a valid range
for floats for the function to return @true.
@since 2.9.1
@beginWxPerlOnly
Not supported by wxPerl.
@endWxPerlOnly
*/
//@{
bool Read(const wxString& key, float* f) const;
bool Read(const wxString& key, float* f, float defaultVal) const;
//@}
/**
Reads a float value, returning @true if the value was found. If the
value was not found, @a b is not changed.
@since 2.9.1
@beginWxPerlOnly
Not supported by wxPerl.
@endWxPerlOnly

View File

@@ -43,6 +43,7 @@
#include <stdlib.h>
#include <ctype.h>
#include <limits.h> // for INT_MAX
#include <float.h> // for FLT_MAX
// ----------------------------------------------------------------------------
// global and class static variables
@@ -180,6 +181,36 @@ bool wxConfigBase::Read(const wxString& key, int *pi, int defVal) const
return r;
}
// Read floats as doubles then just type cast it down.
bool wxConfigBase::Read(const wxString& key, float* val) const
{
wxCHECK_MSG( val, false, wxT("wxConfig::Read(): NULL parameter") );
double temp;
if ( !Read(key, &temp) )
return false;
wxCHECK_MSG( fabs(temp) <= FLT_MAX, false,
wxT("float overflow in wxConfig::Read") );
wxCHECK_MSG( (temp == 0.0) || (fabs(temp) >= FLT_MIN), false,
wxT("float underflow in wxConfig::Read") );
*val = static_cast<float>(temp);
return true;
}
bool wxConfigBase::Read(const wxString& key, float* val, float defVal) const
{
wxCHECK_MSG( val, false, wxT("wxConfig::Read(): NULL parameter") );
if ( Read(key, val) )
return true;
*val = defVal;
return false;
}
// the DoReadXXX() for the other types have implementation in the base class
// but can be overridden in the derived ones
bool wxConfigBase::DoReadBool(const wxString& key, bool* val) const

View File

@@ -82,6 +82,7 @@ private:
CPPUNIT_TEST( AddToExistingRoot );
CPPUNIT_TEST( ReadNonExistent );
CPPUNIT_TEST( ReadEmpty );
CPPUNIT_TEST( ReadFloat );
CPPUNIT_TEST_SUITE_END();
void Path();
@@ -105,6 +106,7 @@ private:
void AddToExistingRoot();
void ReadNonExistent();
void ReadEmpty();
void ReadFloat();
static wxString ChangePath(wxFileConfig& fc, const wxChar *path)
@@ -659,5 +661,24 @@ void FileConfigTestCase::ReadEmpty()
wxFileConfig fc(sis);
}
void FileConfigTestCase::ReadFloat()
{
static const char *confTest =
"x=1.234\n"
"y=-9876.5432\n"
"z=2e+308\n"
;
wxStringInputStream sis(confTest);
wxFileConfig fc(sis);
float f;
CPPUNIT_ASSERT( fc.Read("x", &f) );
CPPUNIT_ASSERT_EQUAL( 1.234f, f );
CPPUNIT_ASSERT( fc.Read("y", &f) );
CPPUNIT_ASSERT_EQUAL( -9876.5432f, f );
}
#endif // wxUSE_FILECONFIG