Strings - Character mapping, conversion to upper/lowercase
This commit is contained in:
parent
fbff6e8352
commit
d823721fb2
3 changed files with 78 additions and 0 deletions
|
@ -65,6 +65,8 @@ double UTF8ToDouble( char const* input , uint32_t size ,
|
||||||
|
|
||||||
struct T_Character
|
struct T_Character
|
||||||
{
|
{
|
||||||
|
using F_Map = std::function< T_Character( T_Character ) >;
|
||||||
|
|
||||||
const uint32_t codepoint;
|
const uint32_t codepoint;
|
||||||
|
|
||||||
T_Character( ) noexcept;
|
T_Character( ) noexcept;
|
||||||
|
@ -240,6 +242,16 @@ class T_String
|
||||||
|
|
||||||
// ---------------------------------------------------------------------
|
// ---------------------------------------------------------------------
|
||||||
|
|
||||||
|
// Generate a string using a function that transforms characters
|
||||||
|
T_String mapped( T_Character::F_Map f ) const noexcept;
|
||||||
|
|
||||||
|
// Convert the string to uppercase
|
||||||
|
T_String toUpper( ) const noexcept;
|
||||||
|
// Convert the string to lowercase
|
||||||
|
T_String toLower( ) const noexcept;
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------
|
||||||
|
|
||||||
bool equals( T_String const& other ) const;
|
bool equals( T_String const& other ) const;
|
||||||
bool equals( char const* string ) const;
|
bool equals( char const* string ) const;
|
||||||
|
|
||||||
|
|
|
@ -1447,6 +1447,33 @@ T_String T_String::trim( ) const noexcept
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
T_String T_String::mapped( T_Character::F_Map f ) const noexcept
|
||||||
|
{
|
||||||
|
T_StringIterator it{ *this };
|
||||||
|
T_StringBuilder sb;
|
||||||
|
while ( !it.atEnd( ) ) {
|
||||||
|
sb << f( it );
|
||||||
|
it.next( );
|
||||||
|
}
|
||||||
|
return std::move( sb );
|
||||||
|
}
|
||||||
|
|
||||||
|
T_String T_String::toUpper( ) const noexcept
|
||||||
|
{
|
||||||
|
return mapped( [](auto c){
|
||||||
|
return c.toUpper( );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
T_String T_String::toLower( ) const noexcept
|
||||||
|
{
|
||||||
|
return mapped( [](auto c){
|
||||||
|
return c.toLower( );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
int32_t T_String::compare( T_String const& other ) const
|
int32_t T_String::compare( T_String const& other ) const
|
||||||
{
|
{
|
||||||
if ( this == &other || data_ == other.data_ ) {
|
if ( this == &other || data_ == other.data_ ) {
|
||||||
|
|
|
@ -126,6 +126,10 @@ class StringsTest : public CppUnit::TestFixture
|
||||||
CPPUNIT_TEST( testToSignedLeadingWhitespaceOnly );
|
CPPUNIT_TEST( testToSignedLeadingWhitespaceOnly );
|
||||||
|
|
||||||
CPPUNIT_TEST( testToDouble );
|
CPPUNIT_TEST( testToDouble );
|
||||||
|
|
||||||
|
CPPUNIT_TEST( testMapped );
|
||||||
|
CPPUNIT_TEST( testToUpper );
|
||||||
|
CPPUNIT_TEST( testToLower );
|
||||||
CPPUNIT_TEST_SUITE_END( );
|
CPPUNIT_TEST_SUITE_END( );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -249,6 +253,10 @@ public:
|
||||||
void testToSignedLeadingWhitespaceOnly( );
|
void testToSignedLeadingWhitespaceOnly( );
|
||||||
|
|
||||||
void testToDouble( );
|
void testToDouble( );
|
||||||
|
|
||||||
|
void testMapped( );
|
||||||
|
void testToUpper( );
|
||||||
|
void testToLower( );
|
||||||
};
|
};
|
||||||
CPPUNIT_TEST_SUITE_REGISTRATION( StringsTest );
|
CPPUNIT_TEST_SUITE_REGISTRATION( StringsTest );
|
||||||
|
|
||||||
|
@ -1182,3 +1190,34 @@ void StringsTest::testToDouble( )
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef M_CHECK_
|
#undef M_CHECK_
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void StringsTest::testMapped( )
|
||||||
|
{
|
||||||
|
const T_String test{ "thisisatest" };
|
||||||
|
const T_String expected{ "uijtjtbuftu" };
|
||||||
|
const T_String result{ test.mapped( [](auto c){
|
||||||
|
return c + 1;
|
||||||
|
} ) };
|
||||||
|
CPPUNIT_ASSERT_EQUAL( test.length( ) , result.length( ) );
|
||||||
|
CPPUNIT_ASSERT( result.equals( expected ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void StringsTest::testToUpper( )
|
||||||
|
{
|
||||||
|
const T_String test{ "This IS a test, 123" };
|
||||||
|
const T_String expected{ "THIS IS A TEST, 123" };
|
||||||
|
const T_String result{ test.toUpper( ) };
|
||||||
|
CPPUNIT_ASSERT_EQUAL( test.length( ) , result.length( ) );
|
||||||
|
CPPUNIT_ASSERT( result.equals( expected ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
void StringsTest::testToLower( )
|
||||||
|
{
|
||||||
|
const T_String test{ "This IS a test, 123" };
|
||||||
|
const T_String expected{ "this is a test, 123" };
|
||||||
|
const T_String result{ test.toLower( ) };
|
||||||
|
CPPUNIT_ASSERT_EQUAL( test.length( ) , result.length( ) );
|
||||||
|
CPPUNIT_ASSERT( result.equals( expected ) );
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue