Revision of FString number input stream
This commit is contained in:
parent
5bb3f1ac9b
commit
8c434777bc
|
@ -1,3 +1,6 @@
|
||||||
|
2019-11-17 Markus Gans <guru.mail@muenster.de>
|
||||||
|
* Revision of FString number input stream
|
||||||
|
|
||||||
2019-11-16 Markus Gans <guru.mail@muenster.de>
|
2019-11-16 Markus Gans <guru.mail@muenster.de>
|
||||||
* New Widget class FSpinBox to provide spin boxes
|
* New Widget class FSpinBox to provide spin boxes
|
||||||
|
|
||||||
|
|
|
@ -253,7 +253,7 @@ void AttribDemo::printColorLine()
|
||||||
{
|
{
|
||||||
auto parent = static_cast<AttribDlg*>(getParent());
|
auto parent = static_cast<AttribDlg*>(getParent());
|
||||||
|
|
||||||
for (FColor color{0}; color < uInt(colors); color++)
|
for (FColor color{0}; color < FColor(colors); color++)
|
||||||
{
|
{
|
||||||
print() << FColorPair(color, parent->bgcolor) << " # ";
|
print() << FColorPair(color, parent->bgcolor) << " # ";
|
||||||
}
|
}
|
||||||
|
|
122
src/fstring.cpp
122
src/fstring.cpp
|
@ -244,88 +244,6 @@ FString& FString::operator << (const char c)
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
|
||||||
FString& FString::operator << (const sInt16 num)
|
|
||||||
{
|
|
||||||
FString numstr(FString().setNumber(num));
|
|
||||||
_insert (length, numstr.length, numstr.string);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
|
||||||
FString& FString::operator << (const uInt16 num)
|
|
||||||
{
|
|
||||||
FString numstr(FString().setNumber(num));
|
|
||||||
_insert (length, numstr.length, numstr.string);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
|
||||||
FString& FString::operator << (const sInt32 num)
|
|
||||||
{
|
|
||||||
FString numstr(FString().setNumber(num));
|
|
||||||
_insert (length, numstr.length, numstr.string);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
|
||||||
FString& FString::operator << (const sInt64 num)
|
|
||||||
{
|
|
||||||
FString numstr(FString().setNumber(num));
|
|
||||||
_insert (length, numstr.length, numstr.string);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
|
||||||
FString& FString::operator << (const uInt32 num)
|
|
||||||
{
|
|
||||||
FString numstr(FString().setNumber(num));
|
|
||||||
_insert (length, numstr.length, numstr.string);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
|
||||||
FString& FString::operator << (const uInt64 num)
|
|
||||||
{
|
|
||||||
FString numstr(FString().setNumber(num));
|
|
||||||
_insert (length, numstr.length, numstr.string);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
|
||||||
#if defined(__APPLE__) && defined(__MACH__)
|
|
||||||
FString& FString::operator << (const std::size_t num)
|
|
||||||
{
|
|
||||||
FString numstr(FString().setNumber(num));
|
|
||||||
_insert (length, numstr.length, numstr.string);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
|
||||||
FString& FString::operator << (const float num)
|
|
||||||
{
|
|
||||||
FString numstr(FString().setNumber(num));
|
|
||||||
_insert (length, numstr.length, numstr.string);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
|
||||||
FString& FString::operator << (const double num)
|
|
||||||
{
|
|
||||||
FString numstr(FString().setNumber(num));
|
|
||||||
_insert (length, numstr.length, numstr.string);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
|
||||||
FString& FString::operator << (const lDouble num)
|
|
||||||
{
|
|
||||||
FString numstr(FString().setNumber(num));
|
|
||||||
_insert (length, numstr.length, numstr.string);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
const FString& FString::operator >> (FString& s)
|
const FString& FString::operator >> (FString& s)
|
||||||
{
|
{
|
||||||
|
@ -856,30 +774,23 @@ FString& FString::setString (const FString& s)
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
FString& FString::setNumber (sInt64 num)
|
FString& FString::setNumber (sInt64 num)
|
||||||
{
|
{
|
||||||
bool neg{false};
|
|
||||||
wchar_t buf[30]{};
|
wchar_t buf[30]{};
|
||||||
wchar_t* s = &buf[29];
|
wchar_t* s = &buf[29];
|
||||||
|
uInt64 abs_num = static_cast<uInt64>(num);
|
||||||
|
|
||||||
if ( num < 0 )
|
if ( num < 0 )
|
||||||
{
|
abs_num = -num;
|
||||||
neg = true;
|
|
||||||
num = -num;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
neg = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
*s = '\0';
|
*s = '\0';
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
*--s = L"0123456789"[num % 10];
|
*--s = L"0123456789"[abs_num % 10];
|
||||||
num /= 10;
|
abs_num /= 10;
|
||||||
}
|
}
|
||||||
while ( num );
|
while ( abs_num );
|
||||||
|
|
||||||
if ( neg )
|
if ( num < 0 )
|
||||||
*--s = '-';
|
*--s = '-';
|
||||||
|
|
||||||
_assign (s);
|
_assign (s);
|
||||||
|
@ -938,37 +849,30 @@ FString& FString::setNumber (lDouble f_num, int precision)
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
FString& FString::setFormatedNumber (sInt64 num, char separator)
|
FString& FString::setFormatedNumber (sInt64 num, char separator)
|
||||||
{
|
{
|
||||||
bool neg{false};
|
|
||||||
int n{0};
|
int n{0};
|
||||||
wchar_t buf[30]{};
|
wchar_t buf[30]{};
|
||||||
wchar_t* s = &buf[29];
|
wchar_t* s = &buf[29];
|
||||||
|
uInt64 abs_num = static_cast<uInt64>(num);
|
||||||
|
|
||||||
if ( separator == 0 )
|
if ( separator == 0 )
|
||||||
separator = ' ';
|
separator = ' ';
|
||||||
|
|
||||||
if ( num < 0 )
|
if ( num < 0 )
|
||||||
{
|
abs_num = -num;
|
||||||
neg = true;
|
|
||||||
num = -num;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
neg = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
*s = L'\0';
|
*s = L'\0';
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
*--s = L"0123456789"[num % 10];
|
*--s = L"0123456789"[abs_num % 10];
|
||||||
num /= 10;
|
abs_num /= 10;
|
||||||
|
|
||||||
if ( num && ++n % 3 == 0 )
|
if ( abs_num && ++n % 3 == 0 )
|
||||||
*--s = separator;
|
*--s = separator;
|
||||||
}
|
}
|
||||||
while ( num );
|
while ( abs_num );
|
||||||
|
|
||||||
if ( neg )
|
if ( num < 0 )
|
||||||
*--s = '-';
|
*--s = '-';
|
||||||
|
|
||||||
_assign (s);
|
_assign (s);
|
||||||
|
|
|
@ -114,18 +114,11 @@ class FString
|
||||||
FString& operator << (fc::SpecialCharacter);
|
FString& operator << (fc::SpecialCharacter);
|
||||||
FString& operator << (const wchar_t);
|
FString& operator << (const wchar_t);
|
||||||
FString& operator << (const char);
|
FString& operator << (const char);
|
||||||
FString& operator << (const sInt16);
|
template <typename NumT
|
||||||
FString& operator << (const uInt16);
|
, typename std::enable_if< std::is_integral<NumT>::value
|
||||||
FString& operator << (const sInt32);
|
|| std::is_floating_point<NumT>::value
|
||||||
FString& operator << (const uInt32);
|
, NumT>::type* = nullptr >
|
||||||
FString& operator << (const sInt64);
|
FString& operator << (const NumT);
|
||||||
FString& operator << (const uInt64);
|
|
||||||
#if defined(__APPLE__) && defined(__MACH__)
|
|
||||||
FString& operator << (const std::size_t);
|
|
||||||
#endif
|
|
||||||
FString& operator << (const float);
|
|
||||||
FString& operator << (const double);
|
|
||||||
FString& operator << (const lDouble);
|
|
||||||
|
|
||||||
const FString& operator >> (FString&);
|
const FString& operator >> (FString&);
|
||||||
const FString& operator >> (std::wstring&);
|
const FString& operator >> (std::wstring&);
|
||||||
|
@ -291,8 +284,16 @@ class FString
|
||||||
|
|
||||||
// FString inline functions
|
// FString inline functions
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
inline const FString FString::getClassName()
|
template <typename NumT
|
||||||
{ return "FString"; }
|
, typename std::enable_if< std::is_integral<NumT>::value
|
||||||
|
|| std::is_floating_point<NumT>::value
|
||||||
|
, NumT>::type* = nullptr >
|
||||||
|
inline FString& FString::operator << (const NumT val)
|
||||||
|
{
|
||||||
|
FString numstr(FString().setNumber(val));
|
||||||
|
_insert (length, numstr.length, numstr.string);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
template <typename IndexT>
|
template <typename IndexT>
|
||||||
|
@ -368,6 +369,10 @@ inline bool FString::operator > (const CharT& s) const
|
||||||
return *this > tmp;
|
return *this > tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
inline const FString FString::getClassName()
|
||||||
|
{ return "FString"; }
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
inline bool FString::isNull() const
|
inline bool FString::isNull() const
|
||||||
{ return ! string; }
|
{ return ! string; }
|
||||||
|
|
|
@ -149,6 +149,7 @@ class FObjectTest : public CPPUNIT_NS::TestFixture
|
||||||
void childObjectTest();
|
void childObjectTest();
|
||||||
void widgetObjectTest();
|
void widgetObjectTest();
|
||||||
void removeParentTest();
|
void removeParentTest();
|
||||||
|
void setParentTest();
|
||||||
void addTest();
|
void addTest();
|
||||||
void delTest();
|
void delTest();
|
||||||
void iteratorTest();
|
void iteratorTest();
|
||||||
|
@ -167,6 +168,7 @@ class FObjectTest : public CPPUNIT_NS::TestFixture
|
||||||
CPPUNIT_TEST (childObjectTest);
|
CPPUNIT_TEST (childObjectTest);
|
||||||
CPPUNIT_TEST (widgetObjectTest);
|
CPPUNIT_TEST (widgetObjectTest);
|
||||||
CPPUNIT_TEST (removeParentTest);
|
CPPUNIT_TEST (removeParentTest);
|
||||||
|
CPPUNIT_TEST (setParentTest);
|
||||||
CPPUNIT_TEST (addTest);
|
CPPUNIT_TEST (addTest);
|
||||||
CPPUNIT_TEST (delTest);
|
CPPUNIT_TEST (delTest);
|
||||||
CPPUNIT_TEST (iteratorTest);
|
CPPUNIT_TEST (iteratorTest);
|
||||||
|
@ -319,6 +321,51 @@ void FObjectTest::removeParentTest()
|
||||||
delete obj; // also deletes the child object
|
delete obj; // also deletes the child object
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//----------------------------------------------------------------------
|
||||||
|
void FObjectTest::setParentTest()
|
||||||
|
{
|
||||||
|
// obj -> child
|
||||||
|
// => newobj -> child
|
||||||
|
|
||||||
|
auto obj = new finalcut::FObject();
|
||||||
|
auto child = new finalcut::FObject(obj);
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT ( obj->hasChildren() );
|
||||||
|
CPPUNIT_ASSERT ( obj->numOfChildren() == 1 );
|
||||||
|
CPPUNIT_ASSERT ( obj->isChild(child) );
|
||||||
|
CPPUNIT_ASSERT ( obj->isDirectChild(child) );
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT ( child->hasParent() );
|
||||||
|
CPPUNIT_ASSERT ( child->getParent() == obj );
|
||||||
|
|
||||||
|
auto newobj = new finalcut::FObject();
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT ( ! newobj->hasChildren() );
|
||||||
|
CPPUNIT_ASSERT ( newobj->numOfChildren() == 0 );
|
||||||
|
CPPUNIT_ASSERT ( ! newobj->isChild(child) );
|
||||||
|
CPPUNIT_ASSERT ( ! newobj->isDirectChild(child) );
|
||||||
|
|
||||||
|
child->setParent(newobj);
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT ( ! obj->hasChildren() );
|
||||||
|
CPPUNIT_ASSERT ( obj->numOfChildren() == 0 );
|
||||||
|
CPPUNIT_ASSERT ( ! obj->isChild(child) );
|
||||||
|
CPPUNIT_ASSERT ( ! obj->isDirectChild(child) );
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT ( newobj->hasChildren() );
|
||||||
|
CPPUNIT_ASSERT ( newobj->numOfChildren() == 1 );
|
||||||
|
CPPUNIT_ASSERT ( newobj->isChild(child) );
|
||||||
|
CPPUNIT_ASSERT ( newobj->isDirectChild(child) );
|
||||||
|
|
||||||
|
CPPUNIT_ASSERT ( child->hasParent() );
|
||||||
|
CPPUNIT_ASSERT ( child->getParent() != obj );
|
||||||
|
CPPUNIT_ASSERT ( child->getParent() == newobj );
|
||||||
|
|
||||||
|
delete obj;
|
||||||
|
delete child;
|
||||||
|
delete newobj; // also deletes the child object
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
void FObjectTest::addTest()
|
void FObjectTest::addTest()
|
||||||
{
|
{
|
||||||
|
|
|
@ -832,6 +832,18 @@ void FStringTest::streamInsertionTest()
|
||||||
out << char('A');
|
out << char('A');
|
||||||
CPPUNIT_ASSERT ( out == L"A" );
|
CPPUNIT_ASSERT ( out == L"A" );
|
||||||
|
|
||||||
|
out.clear();
|
||||||
|
out << sInt8(INT_LEAST8_MAX);
|
||||||
|
CPPUNIT_ASSERT ( out == L"127" );
|
||||||
|
|
||||||
|
out.clear();
|
||||||
|
out << sInt8(INT_LEAST8_MIN);
|
||||||
|
CPPUNIT_ASSERT ( out == L"-128" );
|
||||||
|
|
||||||
|
out.clear();
|
||||||
|
out << uInt8(UINT_LEAST8_MAX);
|
||||||
|
CPPUNIT_ASSERT ( out == L"255" );
|
||||||
|
|
||||||
out.clear();
|
out.clear();
|
||||||
out << sInt16(INT_LEAST16_MAX);
|
out << sInt16(INT_LEAST16_MAX);
|
||||||
CPPUNIT_ASSERT ( out == L"32767" );
|
CPPUNIT_ASSERT ( out == L"32767" );
|
||||||
|
@ -844,6 +856,38 @@ void FStringTest::streamInsertionTest()
|
||||||
out << uInt16(UINT_LEAST16_MAX);
|
out << uInt16(UINT_LEAST16_MAX);
|
||||||
CPPUNIT_ASSERT ( out == L"65535" );
|
CPPUNIT_ASSERT ( out == L"65535" );
|
||||||
|
|
||||||
|
out.clear();
|
||||||
|
out << sInt32(INT_LEAST32_MAX);
|
||||||
|
CPPUNIT_ASSERT ( out == L"2147483647" );
|
||||||
|
|
||||||
|
out.clear();
|
||||||
|
out << sInt32(INT_LEAST32_MIN);
|
||||||
|
CPPUNIT_ASSERT ( out == L"-2147483648" );
|
||||||
|
|
||||||
|
out.clear();
|
||||||
|
out << uInt32(UINT_LEAST32_MAX);
|
||||||
|
CPPUNIT_ASSERT ( out == L"4294967295" );
|
||||||
|
|
||||||
|
out.clear();
|
||||||
|
out << sInt64(INT_LEAST64_MAX);
|
||||||
|
CPPUNIT_ASSERT ( out == L"9223372036854775807" );
|
||||||
|
|
||||||
|
out.clear();
|
||||||
|
out << sInt64(INT_LEAST64_MIN);
|
||||||
|
CPPUNIT_ASSERT ( out == L"-9223372036854775808" );
|
||||||
|
|
||||||
|
out.clear();
|
||||||
|
out << uInt64(UINT_LEAST64_MAX);
|
||||||
|
CPPUNIT_ASSERT ( out == L"18446744073709551615" );
|
||||||
|
|
||||||
|
out.clear();
|
||||||
|
out << std::wint_t(WINT_MAX);
|
||||||
|
CPPUNIT_ASSERT ( out == L"4294967295" );
|
||||||
|
|
||||||
|
out.clear();
|
||||||
|
out << std::size_t(999999999);
|
||||||
|
CPPUNIT_ASSERT ( out == L"999999999" );
|
||||||
|
|
||||||
out.clear();
|
out.clear();
|
||||||
out << int(1234567);
|
out << int(1234567);
|
||||||
CPPUNIT_ASSERT ( out == L"1234567" );
|
CPPUNIT_ASSERT ( out == L"1234567" );
|
||||||
|
@ -1178,9 +1222,11 @@ void FStringTest::convertFromNumberTest()
|
||||||
constexpr uLong n10 = 12345678u;
|
constexpr uLong n10 = 12345678u;
|
||||||
constexpr sInt64 n11 = -12345678;
|
constexpr sInt64 n11 = -12345678;
|
||||||
constexpr uInt64 n12 = 12345678u;
|
constexpr uInt64 n12 = 12345678u;
|
||||||
constexpr float n13 = 1234.56f;
|
constexpr std::wint_t n13 = 12345678;
|
||||||
constexpr double n14 = 1234.5678;
|
constexpr std::size_t n14 = 12345678;
|
||||||
constexpr lDouble n15 = 12345.67890L;
|
constexpr float n15 = 1234.56f;
|
||||||
|
constexpr double n16 = 1234.5678;
|
||||||
|
constexpr lDouble n17 = 12345.67890L;
|
||||||
|
|
||||||
CPPUNIT_ASSERT ( finalcut::getPrecision<float>() == FLT_DIG );
|
CPPUNIT_ASSERT ( finalcut::getPrecision<float>() == FLT_DIG );
|
||||||
CPPUNIT_ASSERT ( finalcut::getPrecision<double>() == DBL_DIG );
|
CPPUNIT_ASSERT ( finalcut::getPrecision<double>() == DBL_DIG );
|
||||||
|
@ -1198,17 +1244,19 @@ void FStringTest::convertFromNumberTest()
|
||||||
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n10) == "12345678" );
|
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n10) == "12345678" );
|
||||||
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n11) == "-12345678" );
|
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n11) == "-12345678" );
|
||||||
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n12) == "12345678" );
|
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n12) == "12345678" );
|
||||||
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n13) == "1234.56" );
|
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n13) == "12345678" );
|
||||||
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n14) == "1234.5678" );
|
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n14) == "12345678" );
|
||||||
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n15) == "12345.6789" );
|
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n15) == "1234.56" );
|
||||||
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n13, 0) == "1e+03" );
|
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n16) == "1234.5678" );
|
||||||
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n14, 0) == "1e+03" );
|
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n17) == "12345.6789" );
|
||||||
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n15, 0) == "1e+04" );
|
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n15, 0) == "1e+03" );
|
||||||
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n13, 100)
|
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n16, 0) == "1e+03" );
|
||||||
== "1234.56005859375" );
|
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n17, 0) == "1e+04" );
|
||||||
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n14, 100)
|
|
||||||
== "1234.567800000000033833202905952930450439453125" );
|
|
||||||
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n15, 100)
|
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n15, 100)
|
||||||
|
== "1234.56005859375" );
|
||||||
|
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n16, 100)
|
||||||
|
== "1234.567800000000033833202905952930450439453125" );
|
||||||
|
CPPUNIT_ASSERT ( finalcut::FString().setNumber(n17, 100)
|
||||||
== "12345.67889999999999961488583721802569925785064697265625" );
|
== "12345.67889999999999961488583721802569925785064697265625" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue