void null_tests ( const char *p ) { // All zero-length string-refs should be equal string_ref sr1; // NULL, 0 string_ref sr2 ( NULL, 0 ); string_ref sr3 ( p, 0 ); string_ref sr4 ( p ); sr4.clear (); BOOST_CHECK ( sr1 == sr2 ); BOOST_CHECK ( sr1 == sr3 ); BOOST_CHECK ( sr2 == sr3 ); BOOST_CHECK ( sr1 == sr4 ); }
void find ( const char *arg ) { string_ref sr1; string_ref sr2; const char *p; // Look for each character in the string(searching from the start) p = arg; sr1 = arg; while ( *p ) { string_ref::size_type pos = sr1.find(*p); BOOST_CHECK ( pos != string_ref::npos && ( pos <= ptr_diff ( p, arg ))); ++p; } // Look for each character in the string (searching from the end) p = arg; sr1 = arg; while ( *p ) { string_ref::size_type pos = sr1.rfind(*p); BOOST_CHECK ( pos != string_ref::npos && pos < sr1.size () && ( pos >= ptr_diff ( p, arg ))); ++p; } // Look for pairs on characters (searching from the start) sr1 = arg; p = arg; while ( *p && *(p+1)) { string_ref sr3 ( p, 2 ); string_ref::size_type pos = sr1.find ( sr3 ); BOOST_CHECK ( pos != string_ref::npos && pos <= static_cast<string_ref::size_type>( p - arg )); p++; } sr1 = arg; p = arg; // for all possible chars, see if we find them in the right place. // Note that strchr will/might do the _wrong_ thing if we search for NULL for ( int ch = 1; ch < 256; ++ch ) { string_ref::size_type pos = sr1.find(ch); const char *strp = std::strchr ( arg, ch ); BOOST_CHECK (( strp == NULL ) == ( pos == string_ref::npos )); if ( strp != NULL ) BOOST_CHECK ( ptr_diff ( strp, arg ) == pos ); } sr1 = arg; p = arg; // for all possible chars, see if we find them in the right place. // Note that strchr will/might do the _wrong_ thing if we search for NULL for ( int ch = 1; ch < 256; ++ch ) { string_ref::size_type pos = sr1.rfind(ch); const char *strp = std::strrchr ( arg, ch ); BOOST_CHECK (( strp == NULL ) == ( pos == string_ref::npos )); if ( strp != NULL ) BOOST_CHECK ( ptr_diff ( strp, arg ) == pos ); } // Find everything at the start p = arg; sr1 = arg; while ( !sr1.empty ()) { string_ref::size_type pos = sr1.find(*p); BOOST_CHECK ( pos == 0 ); sr1.remove_prefix (1); ++p; } // Find everything at the end sr1 = arg; p = arg + strlen ( arg ) - 1; while ( !sr1.empty ()) { string_ref::size_type pos = sr1.rfind(*p); BOOST_CHECK ( pos == sr1.size () - 1 ); sr1.remove_suffix (1); --p; } // Find everything at the start sr1 = arg; p = arg; while ( !sr1.empty ()) { string_ref::size_type pos = sr1.find_first_of(*p); BOOST_CHECK ( pos == 0 ); sr1.remove_prefix (1); ++p; } // Find everything at the end sr1 = arg; p = arg + strlen ( arg ) - 1; while ( !sr1.empty ()) { string_ref::size_type pos = sr1.find_last_of(*p); BOOST_CHECK ( pos == sr1.size () - 1 ); sr1.remove_suffix (1); --p; } // Basic sanity checking for "find_first_of / find_first_not_of" sr1 = arg; sr2 = arg; while ( !sr1.empty() ) { BOOST_CHECK ( sr1.find_first_of ( sr2 ) == 0 ); BOOST_CHECK ( sr1.find_first_not_of ( sr2 ) == string_ref::npos ); sr1.remove_prefix ( 1 ); } p = arg; sr1 = arg; while ( *p ) { string_ref::size_type pos1 = sr1.find_first_of(*p); string_ref::size_type pos2 = sr1.find_first_not_of(*p); BOOST_CHECK ( pos1 != string_ref::npos && pos1 < sr1.size () && pos1 <= ptr_diff ( p, arg )); if ( pos2 != string_ref::npos ) { for ( size_t i = 0 ; i < pos2; ++i ) BOOST_CHECK ( sr1[i] == *p ); BOOST_CHECK ( sr1 [ pos2 ] != *p ); } BOOST_CHECK ( pos2 != pos1 ); ++p; } // Basic sanity checking for "find_last_of / find_last_not_of" sr1 = arg; sr2 = arg; while ( !sr1.empty() ) { BOOST_CHECK ( sr1.find_last_of ( sr2 ) == ( sr1.size () - 1 )); BOOST_CHECK ( sr1.find_last_not_of ( sr2 ) == string_ref::npos ); sr1.remove_suffix ( 1 ); } p = arg; sr1 = arg; while ( *p ) { string_ref::size_type pos1 = sr1.find_last_of(*p); string_ref::size_type pos2 = sr1.find_last_not_of(*p); BOOST_CHECK ( pos1 != string_ref::npos && pos1 < sr1.size () && pos1 >= ptr_diff ( p, arg )); BOOST_CHECK ( pos2 == string_ref::npos || pos1 < sr1.size ()); if ( pos2 != string_ref::npos ) { for ( size_t i = sr1.size () -1 ; i > pos2; --i ) BOOST_CHECK ( sr1[i] == *p ); BOOST_CHECK ( sr1 [ pos2 ] != *p ); } BOOST_CHECK ( pos2 != pos1 ); ++p; } }