Added missing substr() method needed by gtest.
Collapsed 3 copy constructors into one with default values for the
pos and n values. string(const string&, size_t pos=0, size_t n=npos)
Extra test for substr and the copy constructor.
diff --git a/include/string b/include/string
index f1cfe93..552c37b 100644
--- a/include/string
+++ b/include/string
@@ -61,17 +61,12 @@
// Constructors
string();
- string(const string& str);
-
// Construct a string from a source's substring.
// @param str The source string.
// @param pos The index of the character to start the copy at.
// @param n The number of characters to copy. Use string::npos for the
// remainder.
- string(const string& str, size_t pos, size_type n);
-
- // Same as above but implicitly copy from pos to the end of the str.
- string(const string& str, size_type pos);
+ string(const string& str, size_t pos = 0, size_type n = npos);
// Construct a string from a C string.
// @param str The source string, must be '\0' terminated.
@@ -241,6 +236,11 @@
// starting position.
size_type find(const value_type *str, size_type pos = 0) const;
+ // @return a substring of this one.
+ string substr(size_type pos = 0, size_type n = npos) const {
+ return string(*this, pos, n);
+ }
+
private:
bool SafeMalloc(size_type n);
void SafeRealloc(size_type n);
diff --git a/src/string.cpp b/src/string.cpp
index bb9e35a..b80fd78 100644
--- a/src/string.cpp
+++ b/src/string.cpp
@@ -136,12 +136,6 @@
mCapacity = 0;
}
-void string::Constructor(const value_type *str, size_type n)
-{
- Constructor(str, 0, n);
-}
-
-
void string::Constructor(const value_type *str, size_type pos, size_type n)
{
// Enough data and no overflow
@@ -174,40 +168,29 @@
ConstructEmptyString();
}
-string::string(const string& str)
-{
- Constructor(str.mData, str.mLength);
-}
-
string::string(const string& str, size_type pos, size_type n)
{
- if (pos < str.mLength && n <= (str.mLength - pos))
- {
- Constructor(str.mData + pos , n);
- }
- else
- {
- ConstructEmptyString();
- }
-}
-
-string::string(const string& str, size_type pos)
-{
if (pos < str.mLength)
{
- Constructor(str.mData, pos, str.mLength - pos);
+ if (npos == n)
+ {
+ Constructor(str.mData, pos , str.mLength - pos);
+ return;
+ }
+ else if (n <= (str.mLength - pos))
+ {
+ Constructor(str.mData, pos , n);
+ return;
+ }
}
- else
- {
- ConstructEmptyString();
- }
+ ConstructEmptyString();
}
string::string(const value_type *str)
{
if (NULL != str)
{
- Constructor(str, strlen(str));
+ Constructor(str, 0, strlen(str));
}
else
{
@@ -217,7 +200,14 @@
string::string(const value_type *str, size_type n)
{
- Constructor(str, n);
+ if (npos != n)
+ {
+ Constructor(str, 0, n);
+ }
+ else
+ {
+ ConstructEmptyString(); // standard requires we throw length_error here.
+ }
}
// Char repeat constructor.
@@ -230,7 +220,7 @@
{
if (begin < end)
{
- Constructor(begin, end - begin);
+ Constructor(begin, 0, end - begin);
}
else
{
@@ -455,7 +445,7 @@
string& string::assign(const string& str)
{
clear();
- Constructor(str.mData, str.mLength);
+ Constructor(str.mData, 0, str.mLength);
return *this;
}
@@ -480,7 +470,7 @@
return *this;
}
clear();
- Constructor(str, strlen(str));
+ Constructor(str, 0, strlen(str));
return *this;
}
@@ -491,7 +481,7 @@
return *this;
}
clear();
- Constructor(array, n);
+ Constructor(array, 0, n);
return *this;
}
@@ -529,10 +519,7 @@
{
return string::npos;
}
-
- const std::ptrdiff_t delta = idx - mData;
-
- return static_cast<size_type>(delta);
+ return static_cast<size_type>(idx - mData);
}
} // namespace std
diff --git a/tests/test_string.cpp b/tests/test_string.cpp
index bd69a46..ecff20e 100644
--- a/tests/test_string.cpp
+++ b/tests/test_string.cpp
@@ -96,7 +96,10 @@
string str2 (str1);
EXPECT_TRUE(str1.size() == 21);
- const string str3("scott mills cracks me up");
+ const char literal[] = "scott mills cracks me up";
+ const string str3(literal);
+ EXPECT_TRUE(str3 == literal);
+
string str4(str3, 12);
EXPECT_TRUE(strcmp("cracks me up", str4.c_str()) == 0);
@@ -115,6 +118,12 @@
string str9(str3, 24, 1);
EXPECT_TRUE(strcmp("", str9.c_str()) == 0);
+ string str10(str3, 0);
+ EXPECT_TRUE(strcmp(literal, str10.c_str()) == 0);
+
+ string str11(str3, 6);
+ EXPECT_TRUE(strcmp("mills cracks me up", str11.c_str()) == 0);
+
return true;
}
@@ -867,6 +876,32 @@
return true;
}
+bool testSubstr()
+{
+ const char literal[] = "basement jaxx";
+ const string str01(literal);
+ string str02;
+
+ str02 = str01.substr(0, 5);
+ EXPECT_TRUE(str02 == "basem");
+
+ str02 = str01.substr(0, 8);
+ EXPECT_TRUE(str02 == "basement");
+
+ str02 = str01.substr(0, string::npos);
+ EXPECT_TRUE(str02 == "basement jaxx");
+
+ str02 = str01.substr();
+ EXPECT_TRUE(str02 == "basement jaxx");
+
+ str02 = str01.substr(9);
+ EXPECT_TRUE(str02 == "jaxx");
+
+ str02 = str01.substr(9, string::npos);
+ EXPECT_TRUE(str02 == "jaxx");
+ return true;
+}
+
} // namespace android
int main(int argc, char **argv)
@@ -891,5 +926,6 @@
FAIL_UNLESS(testCapacity);
FAIL_UNLESS(testClear);
FAIL_UNLESS(testErase);
+ FAIL_UNLESS(testSubstr);
return kPassed;
}