diff options
author | Andy Schwerin <schwerin@10gen.com> | 2013-02-28 14:26:42 -0500 |
---|---|---|
committer | Dan Pasette <dan@10gen.com> | 2013-06-18 12:23:44 -0400 |
commit | aa2d926ae5a1cd8bc80bc843529bb1a1d7262b24 (patch) | |
tree | 9ee2e58a5631576dd36c06dfa2cc3ee5881e476b | |
parent | efe5ff8332c3c89e4d3bc9f3e180356aacd2d6f7 (diff) | |
download | mongo-aa2d926ae5a1cd8bc80bc843529bb1a1d7262b24.tar.gz |
Add StringData::rfind(char) const method.
-rw-r--r-- | src/mongo/base/string_data-inl.h | 12 | ||||
-rw-r--r-- | src/mongo/base/string_data.h | 1 | ||||
-rw-r--r-- | src/mongo/base/string_data_test.cpp | 16 |
3 files changed, 29 insertions, 0 deletions
diff --git a/src/mongo/base/string_data-inl.h b/src/mongo/base/string_data-inl.h index 9d6d024df9c..efad95154ea 100644 --- a/src/mongo/base/string_data-inl.h +++ b/src/mongo/base/string_data-inl.h @@ -90,6 +90,18 @@ namespace mongo { } + inline size_t StringData::rfind( char c, size_t fromPos ) const { + const size_t sz = size(); + if ( fromPos > sz ) + fromPos = sz; + + for ( const char* cur = _data + fromPos; cur > _data; --cur ) { + if ( *(cur - 1) == c ) + return (cur - _data) - 1; + } + return string::npos; + } + inline StringData StringData::substr( size_t pos, size_t n ) const { if ( pos > size() ) throw std::out_of_range( "out of range" ); diff --git a/src/mongo/base/string_data.h b/src/mongo/base/string_data.h index dca41fa1e9a..f764549f700 100644 --- a/src/mongo/base/string_data.h +++ b/src/mongo/base/string_data.h @@ -98,6 +98,7 @@ namespace mongo { size_t find( char c , size_t fromPos = 0 ) const; size_t find( const StringData& needle ) const; + size_t rfind( char c, size_t fromPos = string::npos ) const; /** * Returns true if 'prefix' is a substring of this instance, anchored at position 0. diff --git a/src/mongo/base/string_data_test.cpp b/src/mongo/base/string_data_test.cpp index c8ca72ca76c..bbd40011002 100644 --- a/src/mongo/base/string_data_test.cpp +++ b/src/mongo/base/string_data_test.cpp @@ -123,6 +123,22 @@ namespace { ASSERT_EQUALS( string("foo").find( "" ), StringData("foo").find( "" ) ); } + TEST(Rfind, Char1) { + ASSERT_EQUALS( string::npos, StringData( "foo" ).rfind( 'a' ) ); + + ASSERT_EQUALS( 0U, StringData( "foo" ).rfind( 'f' ) ); + ASSERT_EQUALS( 0U, StringData( "foo" ).rfind( 'f', 3 ) ); + ASSERT_EQUALS( 0U, StringData( "foo" ).rfind( 'f', 2 ) ); + ASSERT_EQUALS( 0U, StringData( "foo" ).rfind( 'f', 1 ) ); + ASSERT_EQUALS( string::npos, StringData( "foo", 0 ).rfind( 'f' ) ); + + ASSERT_EQUALS( 2U, StringData( "foo" ).rfind( 'o' ) ); + ASSERT_EQUALS( 2U, StringData( "foo", 3 ).rfind( 'o' ) ); + ASSERT_EQUALS( 1U, StringData( "foo", 2 ).rfind( 'o' ) ); + ASSERT_EQUALS( string::npos, StringData( "foo", 1 ).rfind( 'o' ) ); + ASSERT_EQUALS( string::npos, StringData( "foo", 0 ).rfind( 'o' ) ); + } + // this is to verify we match std::string void SUBSTR_TEST_HELP(StringData big, StringData small, size_t start, size_t len) { ASSERT_EQUALS(small.toString(), big.toString().substr(start, len)); |