summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Schwerin <schwerin@10gen.com>2013-02-28 14:26:42 -0500
committerDan Pasette <dan@10gen.com>2013-06-18 12:23:44 -0400
commitaa2d926ae5a1cd8bc80bc843529bb1a1d7262b24 (patch)
tree9ee2e58a5631576dd36c06dfa2cc3ee5881e476b
parentefe5ff8332c3c89e4d3bc9f3e180356aacd2d6f7 (diff)
downloadmongo-aa2d926ae5a1cd8bc80bc843529bb1a1d7262b24.tar.gz
Add StringData::rfind(char) const method.
-rw-r--r--src/mongo/base/string_data-inl.h12
-rw-r--r--src/mongo/base/string_data.h1
-rw-r--r--src/mongo/base/string_data_test.cpp16
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));