2
0
mirror of https://github.com/boostorg/json.git synced 2026-01-19 04:12:14 +00:00

Refactor string

This commit is contained in:
Krystian Stasiowski
2020-02-03 20:14:46 -05:00
parent 87d13bcf2c
commit 75528587ff
7 changed files with 714 additions and 2107 deletions

View File

@@ -1500,7 +1500,7 @@ public:
{
string s(t.v1);
BOOST_TEST_THROWS(
(s.insert(1, "", s.max_size())),
(s.insert(1, s.max_size(), 'a')),
std::length_error);
}
}
@@ -1527,7 +1527,7 @@ public:
{
string s(t.v1);
BOOST_TEST_THROWS(
(s.insert(s.size() + 2, "*", 1)),
(s.insert(s.size() + 2, "*")),
std::out_of_range);
}
}
@@ -1537,17 +1537,17 @@ public:
fail_loop([&](storage_ptr const& sp)
{
string s(t.v1, sp);
s.insert(1, "*****", 3);
s.insert(1, "*****");
BOOST_TEST(s == std::string(
t.v1).insert(1, "*****", 3));
t.v1).insert(1, "*****"));
});
fail_loop([&](storage_ptr const& sp)
{
string s(t.v2, sp);
s.insert(1, "*****", 3);
s.insert(1, "*****");
BOOST_TEST(s == std::string(
t.v2).insert(1, "*****", 3));
t.v2).insert(1, "*****"));
});
}
@@ -1570,55 +1570,56 @@ public:
});
}
// insert(size_type, string const&, size_type, size_type)
{
fail_loop([&](storage_ptr const& sp)
{
string s(t.v1, sp);
s.insert(1, string(t.v2), 1, 3);
BOOST_TEST(s == std::string(
t.v1).insert(1, t.s2, 1, 3));
});
// KRYSTIAN These tests are superseded by the new string_view overloads
//// insert(size_type, string const&, size_type, size_type)
//{
// fail_loop([&](storage_ptr const& sp)
// {
// string s(t.v1, sp);
// s.insert(1, string(t.v2), 1, 3);
// BOOST_TEST(s == std::string(
// t.v1).insert(1, t.s2, 1, 3));
// });
fail_loop([&](storage_ptr const& sp)
{
string s(t.v2, sp);
s.insert(1, string(t.v1), 1, 3);
BOOST_TEST(s == std::string(
t.v2).insert(1, t.s1, 1, 3));
});
// fail_loop([&](storage_ptr const& sp)
// {
// string s(t.v2, sp);
// s.insert(1, string(t.v1), 1, 3);
// BOOST_TEST(s == std::string(
// t.v2).insert(1, t.s1, 1, 3));
// });
fail_loop([&](storage_ptr const& sp)
{
string s(t.v1, sp);
s.insert(1, string(t.v2), 1);
BOOST_TEST(s == std::string(
t.v1).insert(1, t.s2, 1, std::string::npos));
});
// fail_loop([&](storage_ptr const& sp)
// {
// string s(t.v1, sp);
// s.insert(1, string(t.v2), 1);
// BOOST_TEST(s == std::string(
// t.v1).insert(1, t.s2, 1, std::string::npos));
// });
fail_loop([&](storage_ptr const& sp)
{
string s(t.v2, sp);
s.insert(1, string(t.v1), 1);
BOOST_TEST(s == std::string(
t.v2).insert(1, t.s1, 1, std::string::npos));
});
}
// fail_loop([&](storage_ptr const& sp)
// {
// string s(t.v2, sp);
// s.insert(1, string(t.v1), 1);
// BOOST_TEST(s == std::string(
// t.v2).insert(1, t.s1, 1, std::string::npos));
// });
//}
// insert(const_iterator, char)
// insert(size_type, char)
{
fail_loop([&](storage_ptr const& sp)
{
string s(t.v1, sp);
BOOST_TEST(
*s.insert(s.begin()+2, '*') == '*');
s.insert(2, '*')[2] == '*');
});
fail_loop([&](storage_ptr const& sp)
{
string s(t.v2, sp);
BOOST_TEST(
*s.insert(s.begin()+2, '*') == '*');
s.insert(2, '*')[2] == '*');
});
}
@@ -1628,7 +1629,7 @@ public:
{
string s(t.v1, sp);
BOOST_TEST(string_view(
s.insert(s.begin()+2, 3, '*'), 5) ==
&(s.insert(2, 3, '*')[2]), 5) ==
"***cd");
});
@@ -1636,7 +1637,7 @@ public:
{
string s(t.v2, sp);
BOOST_TEST(string_view(
s.insert(s.begin()+2, 3, '*'), 5) ==
&(s.insert(2, 3, '*')[2]), 5) ==
"***CD");
});
}
@@ -1646,7 +1647,7 @@ public:
fail_loop([&](storage_ptr const& sp)
{
string s(t.v1, sp);
s.insert(s.begin()+2, t.s2.begin(), t.s2.end());
s.insert(2, t.s2.begin(), t.s2.end());
std::string cs(t.s1);
cs.insert(2, &t.s2[0], t.s2.size());
BOOST_TEST(s == cs);
@@ -1655,7 +1656,7 @@ public:
fail_loop([&](storage_ptr const& sp)
{
string s(t.v2, sp);
s.insert(s.begin()+2, t.s1.begin(), t.s1.end());
s.insert(2, t.s1.begin(), t.s1.end());
std::string cs(t.s2);
cs.insert(2, &t.s1[0], t.s1.size());
BOOST_TEST(s == cs);
@@ -1664,7 +1665,7 @@ public:
fail_loop([&](storage_ptr const& sp)
{
string s(t.v1, sp);
s.insert(s.begin()+2,
s.insert(2,
make_input_iterator(t.s2.begin()),
make_input_iterator(t.s2.end()));
std::string cs(t.s1);
@@ -1675,7 +1676,7 @@ public:
fail_loop([&](storage_ptr const& sp)
{
string s(t.v2, sp);
s.insert(s.begin()+2,
s.insert(2,
make_input_iterator(t.s1.begin()),
make_input_iterator(t.s1.end()));
std::string cs(t.s2);
@@ -1684,27 +1685,6 @@ public:
});
}
// insert(const_iterator, initializer_list)
{
fail_loop([&](storage_ptr const& sp)
{
string s(t.v1, sp);
s.insert(s.begin()+2, INIT2);
std::string cs(t.s1);
cs.insert(2, &t.s2[0], t.s2.size());
BOOST_TEST(s == cs);
});
fail_loop([&](storage_ptr const& sp)
{
string s(t.v2, sp);
s.insert(s.begin()+2, INIT1);
std::string cs(t.s2);
cs.insert(2, &t.s1[0], t.s1.size());
BOOST_TEST(s == cs);
});
}
// insert(const_iterator, string_view)
{
fail_loop([&](storage_ptr const& sp)
@@ -1731,7 +1711,7 @@ public:
fail_loop([&](storage_ptr const& sp)
{
string s(t.v1, sp);
s.insert(2, string_view(t.v2), 2, 3);
s.insert(2, string_view(t.v2).substr(2, 3));
std::string cs(t.v1);
cs.insert(2, t.s2, 2, 3);
BOOST_TEST(s == cs);
@@ -1740,7 +1720,7 @@ public:
fail_loop([&](storage_ptr const& sp)
{
string s(t.v2, sp);
s.insert(2, string_view(t.v1), 2, 3);
s.insert(2, string_view(t.v1).substr(2, 3));
std::string cs(t.v2);
cs.insert(2, t.s1, 2, 3);
BOOST_TEST(s == cs);
@@ -1902,7 +1882,7 @@ public:
});
}
// append(string)
// append(string_view)
{
fail_loop([&](storage_ptr const& sp)
{
@@ -1919,33 +1899,33 @@ public:
});
}
// append(string, size_type, size_type)
// append(string_view)
{
fail_loop([&](storage_ptr const& sp)
{
string s(t.v1, sp);
s.append(string(t.v2), 3);
s.append(string(t.v2).subview(3));
BOOST_TEST(s == t.s1 + t.s2.substr(3));
});
fail_loop([&](storage_ptr const& sp)
{
string s(t.v2, sp);
s.append(string(t.v1), 3);
s.append(string(t.v1).subview(3));
BOOST_TEST(s == t.s2 + t.s1.substr(3));
});
fail_loop([&](storage_ptr const& sp)
{
string s(t.v1, sp);
s.append(string(t.v2), 2, 3);
s.append(string(t.v2).subview(2, 3));
BOOST_TEST(s == t.s1 + t.s2.substr(2, 3));
});
fail_loop([&](storage_ptr const& sp)
{
string s(t.v2, sp);
s.append(string(t.v1), 2, 3);
s.append(string(t.v1).subview(2, 3));
BOOST_TEST(s == t.s2 + t.s1.substr(2, 3));
});
}
@@ -1967,40 +1947,6 @@ public:
});
}
// append(char const*, size_type)
{
fail_loop([&](storage_ptr const& sp)
{
string s(t.v1, sp);
s.append(t.s2.c_str(), 5);
BOOST_TEST(s == t.s1 + t.s2.substr(0, 5));
});
fail_loop([&](storage_ptr const& sp)
{
string s(t.v2, sp);
s.append(t.s1.c_str(), 5);
BOOST_TEST(s == t.s2 + t.s1.substr(0, 5));
});
}
// append(initializer_list)
{
fail_loop([&](storage_ptr const& sp)
{
string s(t.v1, sp);
s.append(INIT2);
BOOST_TEST(s == t.s1 + t.s2);
});
fail_loop([&](storage_ptr const& sp)
{
string s(t.v2, sp);
s.append(INIT1);
BOOST_TEST(s == t.s2 + t.s1);
});
}
// append(InputIt, InputIt)
{
fail_loop([&](storage_ptr const& sp)
@@ -2059,28 +2005,28 @@ public:
fail_loop([&](storage_ptr const& sp)
{
string s(t.v1, sp);
s.append(t.v2, 2);
s.append(t.v2.substr(2));
BOOST_TEST(s == t.s1 + t.s2.substr(2));
});
fail_loop([&](storage_ptr const& sp)
{
string s(t.v2, sp);
s.append(t.v1, 2);
s.append(t.v1.substr(2));
BOOST_TEST(s == t.s2 + t.s1.substr(2));
});
fail_loop([&](storage_ptr const& sp)
{
string s(t.v1, sp);
s.append(t.v2, 2, 3);
s.append(t.v2.substr(2, 3));
BOOST_TEST(s == t.s1 + t.s2.substr(2, 3));
});
fail_loop([&](storage_ptr const& sp)
{
string s(t.v2, sp);
s.append(t.v1, 2, 3);
s.append(t.v1.substr(2, 3));
BOOST_TEST(s == t.s2 + t.s1.substr(2, 3));
});
}
@@ -2144,23 +2090,6 @@ public:
});
}
// operator+=(initializer_list)
{
fail_loop([&](storage_ptr const& sp)
{
string s(t.v1, sp);
s += INIT2;
BOOST_TEST(s == t.s1 + t.s2);
});
fail_loop([&](storage_ptr const& sp)
{
string s(t.v2, sp);
s += INIT1;
BOOST_TEST(s == t.s2 + t.s1);
});
}
// operator+=(string_view)
{
fail_loop([&](storage_ptr const& sp)
@@ -2190,45 +2119,15 @@ public:
BOOST_TEST(v1.compare(string(t.v1)) == 0);
BOOST_TEST(v1.compare(string("bbbbbbb")) < 0);
// compare(size_type, size_type, string)
BOOST_TEST(v1.compare(2, 3, string("ccc")) > 0);
BOOST_TEST(v1.compare(2, 3, string("cde")) == 0);
BOOST_TEST(v1.compare(2, 3, string("eee")) < 0);
// compare(size_type, size_type, string, size_type, size_type)
BOOST_TEST(v1.compare(2, 3, string("bbbbb"), 1, 3) > 0);
BOOST_TEST(v1.compare(2, 3, string("bcdef"), 1, 3) == 0);
BOOST_TEST(v1.compare(2, 3, string("fffff"), 1, 3) < 0);
// compare(char const*)
BOOST_TEST(v1.compare("aaaaaaa") > 0);
BOOST_TEST(v1.compare(t.s1.c_str()) == 0);
BOOST_TEST(v1.compare("bbbbbbb") < 0);
// compare(size_type, size_type, char const*)
BOOST_TEST(v1.compare(2, 3, "ccc") > 0);
BOOST_TEST(v1.compare(2, 3, "cde") == 0);
BOOST_TEST(v1.compare(2, 3, "eee") < 0);
// compare(size_type, size_type, char const*, size_type)
BOOST_TEST(v1.compare(2, 4, "cccc", 4) > 0);
BOOST_TEST(v1.compare(2, 4, "cdef", 4) == 0);
BOOST_TEST(v1.compare(2, 4, "ffff", 4) < 0);
// compare(string_view s)
BOOST_TEST(v1.compare(string_view("aaaaaaa")) > 0);
BOOST_TEST(v1.compare(t.v1) == 0);
BOOST_TEST(v1.compare(string_view("bbbbbbb")) < 0);
// compare(size_type, size_type, string_view)
BOOST_TEST(v1.compare(2, 3, string_view("ccc")) > 0);
BOOST_TEST(v1.compare(2, 3, string_view("cde")) == 0);
BOOST_TEST(v1.compare(2, 3, string_view("eee")) < 0);
// compare(size_type, size_type, string_view, size_type, size_type)
BOOST_TEST(v1.compare(2, 3, string_view("bbbbb"), 1, 3) > 0);
BOOST_TEST(v1.compare(2, 3, string_view("bcdef"), 1, 3) == 0);
BOOST_TEST(v1.compare(2, 3, string_view("fffff"), 1, 3) < 0);
}
void
@@ -2290,6 +2189,184 @@ public:
void
testReplace()
{
test_vectors const t;
// replace(std::size_t, std::size_t, string_view)
{
// outside, shrink
fail_loop([&](storage_ptr const& sp)
{
std::string s1(t.v2.data(), t.v2.size());
string s2(t.v2, sp);
BOOST_TEST(s2.replace(0, 4, t.v2.substr(4, 2)) ==
s1.replace(0, 4, t.v2.data() + 4, 2));
});
// outside, grow
fail_loop([&](storage_ptr const& sp)
{
std::string s1(t.v2.data(), t.v2.size());
string s2(t.v2, sp);
BOOST_TEST(s2.replace(0, 1, t.v2.substr(0)) ==
s1.replace(0, 1, t.v2.data(), t.v2.size()));
});
// outside, same
fail_loop([&](storage_ptr const& sp)
{
std::string s1(t.v2.data(), t.v2.size());
string s2(t.v2, sp);
BOOST_TEST(s2.replace(0, 2, t.v2.substr(0, 2)) ==
s1.replace(0, 2, t.v2.data(), 2));
});
// inside, shrink
fail_loop([&](storage_ptr const& sp)
{
std::string s1(t.v2.data(), t.v2.size());
string s2(t.v2, sp);
BOOST_TEST(s2.replace(1, 4, s2.substr(4, 2)) ==
s1.replace(1, 4, s1.data() + 4, 2));
});
// inside, grow
fail_loop([&](storage_ptr const& sp)
{
std::string s1(t.v2.data(), t.v2.size());
string s2(t.v2, sp);
BOOST_TEST(s2.replace(1, 1, s2.substr(0)) ==
s1.replace(1, 1, s1.data(), s1.size()));
});
// inside, same
fail_loop([&](storage_ptr const& sp)
{
std::string s1(t.v2.data(), t.v2.size());
string s2(t.v2, sp);
BOOST_TEST(s2.replace(1, 2, s2.subview(0, 2)) ==
s1.replace(1, 2, s1.data(), 2));
});
}
// replace(const_iterator, const_iterator, string_view)
{
// outside, shrink
fail_loop([&](storage_ptr const& sp)
{
std::string s1(t.v2.data(), t.v2.size());
string s2(t.v2, sp);
BOOST_TEST(
s2.replace(
s2.begin(),
s2.begin() + 4,
t.v2.substr(4, 2)) ==
s1.replace(0,
4, t.v2.data() + 4,
2));
});
// outside, grow
fail_loop([&](storage_ptr const& sp)
{
std::string s1(t.v2.data(), t.v2.size());
string s2(t.v2, sp);
BOOST_TEST(
s2.replace(
s2.begin(),
s2.begin() + 1,
t.v2.substr(0)) ==
s1.replace(0,
1, t.v2.data(),
t.v2.size()));
});
// outside, same
fail_loop([&](storage_ptr const& sp)
{
std::string s1(t.v2.data(), t.v2.size());
string s2(t.v2, sp);
BOOST_TEST(
s2.replace(
s2.begin(),
s2.begin() + 2,
t.v2.substr(0, 2)) ==
s1.replace(
0, 2,
t.v2.data(),
2));
});
// inside, shrink
fail_loop([&](storage_ptr const& sp)
{
std::string s1(t.v2.data(), t.v2.size());
string s2(t.v2, sp);
BOOST_TEST(
s2.replace(
s2.begin() + 1,
s2.begin() + 5,
s2.substr(4, 2)) ==
s1.replace(
1, 4,
s1.data() + 4,
2));
});
// inside, grow
fail_loop([&](storage_ptr const& sp)
{
std::string s1(t.v2.data(), t.v2.size());
string s2(t.v2, sp);
BOOST_TEST(
s2.replace(
s2.begin() + 1,
s2.begin() + 2,
s2.substr(0)) ==
s1.replace(
1, 1,
s1.data(),
s1.size()));
});
// inside, same
fail_loop([&](storage_ptr const& sp)
{
std::string s1(t.v2.data(), t.v2.size());
string s2(t.v2, sp);
BOOST_TEST(
s2.replace(
s2.begin() + 1,
s2.begin() + 3,
s2.subview(0, 2)) ==
s1.replace(
1, 2,
s1.data(),
2));
});
}
// replace(std::size_t, std::size_t, std::size_t, char)
{
fail_loop([&](storage_ptr const& sp)
{
std::string s1(t.v2.data(), t.v2.size());
string s2(t.v2, sp);
BOOST_TEST(s2.replace(0, 4, 10, 'a') ==
s1.replace(0, 4, 10, 'a'));
});
}
// replace(const_iterator, const_iterator, std::size_t, char)
{
fail_loop([&](storage_ptr const& sp)
{
std::string s1(t.v2.data(), t.v2.size());
string s2(t.v2, sp);
BOOST_TEST(
s2.replace(s2.begin(), s2.begin() + 4, 10, 'a') ==
s1.replace(0, 4, 10, 'a'));
});
}
}
void
@@ -2299,13 +2376,13 @@ public:
string const s1 = t.v1;
string const s2 = t.v2;
// substr(size_type, size_type)
BOOST_TEST(s1.substr() == t.v1);
BOOST_TEST(s1.substr(1) == t.v1.substr(1));
BOOST_TEST(s1.substr(1, 3) == t.v1.substr(1, 3));
BOOST_TEST(s2.substr() == t.v2);
BOOST_TEST(s2.substr(1) == t.v2.substr(1));
BOOST_TEST(s2.substr(1, 3) == t.v2.substr(1, 3));
// subview(size_type, size_type)
BOOST_TEST(s1.subview() == t.v1);
BOOST_TEST(s1.subview(1) == t.v1.substr(1));
BOOST_TEST(s1.subview(1, 3) == t.v1.substr(1, 3));
BOOST_TEST(s2.subview() == t.v2);
BOOST_TEST(s2.subview(1) == t.v2.substr(1));
BOOST_TEST(s2.subview(1, 3) == t.v2.substr(1, 3));
}
void
@@ -2440,17 +2517,16 @@ public:
string const s1 = t.v1;
string const s2 = t.v2;
// find(string, size_type)
// find(string_view, size_type)
BOOST_TEST(s1.find(string("bcd")) == 1);
BOOST_TEST(s1.find(string("cde"), 1) == 2);
BOOST_TEST(s1.find(string("efg"), 5) == string::npos);
// find(char const*, size_type, size_type)
BOOST_TEST(s1.find("bcd*", 0, 3) == 1);
BOOST_TEST(s1.find("cde*", 1, 3) == 2);
BOOST_TEST(s1.find("efg*", 5, 3) == string::npos);
// find(char const*, size_type)
BOOST_TEST(s1.find("bcd", 0) == 1);
BOOST_TEST(s1.find("cde", 1) == 2);
BOOST_TEST(s1.find("efg", 5) == string::npos);
BOOST_TEST(s1.find(string_view("bcd")) == 1);
BOOST_TEST(s1.find(string_view("cde"), 1) == 2);
BOOST_TEST(s1.find(string_view("efg"), 5) == string::npos);
BOOST_TEST(s1.find("bcd", 0) == 1);
BOOST_TEST(s1.find("cde", 1) == 2);
BOOST_TEST(s1.find("efg", 5) == string::npos);
@@ -2459,11 +2535,6 @@ public:
BOOST_TEST(s1.find('b') == 1);
BOOST_TEST(s1.find('c', 1) == 2);
BOOST_TEST(s1.find('e', 5) == string::npos);
// find(T const, size_type pos)
BOOST_TEST(s1.find(string_view("bcd")) == 1);
BOOST_TEST(s1.find(string_view("cde"), 1) == 2);
BOOST_TEST(s1.find(string_view("efg"), 5) == string::npos);
}
void