You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by an...@apache.org on 2006/05/15 10:14:32 UTC
svn commit: r406581 [1/3] - /incubator/stdcxx/trunk/tests/strings/
Author: antonp
Date: Mon May 15 01:14:29 2006
New Revision: 406581
URL: http://svn.apache.org/viewcvs?rev=406581&view=rev
Log:
2006-05-15 Anton Pevtsov <an...@moscow.vdiweb.com>
* 21.string.copy.cpp: Converted to simplified format
(MemFun, run_test): removed as obsolete
(test_copy): Updated to use test driver features.
* 21.string.replace.cpp (test_replace_range): Added res_len
paramter, fixed bug with incorrect expected result string length.
(test_replace): Updated cal to test_replace_range, fixed bug
with agruments for the rw_match call.
* 21.string.append.cpp: Replaced LSTR, LLEN, and LPAR in test
cases with strings containing the '<char>@<count>' directive(s).
Corrected errors in expected results involving said strings
revealed by the use of the more flexible/reliable directives.
* 21.string.assing.cpp: Same
* 21.string.compare.cpp: Same
* 21.string.copy.cpp: Same
* 21.string.erase.cpp: Same
* 21.string.find.cpp: Same
* 21.string.find.first.not.of.cpp: Same
* 21.string.find.first.of.cpp: Same
* 21.string.find.last.not.of.cpp: Same
* 21.string.find.last.of.cpp: Same
* 21.string.insert.cpp: Same
* 21.string.op.plus.equal.cpp: Same
* 21.string.rfind.cpp: Same
* 21.string.substr.cpp: Same
Modified:
incubator/stdcxx/trunk/tests/strings/21.string.append.cpp
incubator/stdcxx/trunk/tests/strings/21.string.assign.cpp
incubator/stdcxx/trunk/tests/strings/21.string.compare.cpp
incubator/stdcxx/trunk/tests/strings/21.string.copy.cpp
incubator/stdcxx/trunk/tests/strings/21.string.erase.cpp
incubator/stdcxx/trunk/tests/strings/21.string.find.cpp
incubator/stdcxx/trunk/tests/strings/21.string.find.first.not.of.cpp
incubator/stdcxx/trunk/tests/strings/21.string.find.first.of.cpp
incubator/stdcxx/trunk/tests/strings/21.string.find.last.not.of.cpp
incubator/stdcxx/trunk/tests/strings/21.string.find.last.of.cpp
incubator/stdcxx/trunk/tests/strings/21.string.insert.cpp
incubator/stdcxx/trunk/tests/strings/21.string.op.plus.equal.cpp
incubator/stdcxx/trunk/tests/strings/21.string.replace.cpp
incubator/stdcxx/trunk/tests/strings/21.string.rfind.cpp
incubator/stdcxx/trunk/tests/strings/21.string.substr.cpp
Modified: incubator/stdcxx/trunk/tests/strings/21.string.append.cpp
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/strings/21.string.append.cpp?rev=406581&r1=406580&r2=406581&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/strings/21.string.append.cpp (original)
+++ incubator/stdcxx/trunk/tests/strings/21.string.append.cpp Mon May 15 01:14:29 2006
@@ -27,21 +27,17 @@
#include <string> // for string
#include <stdexcept> // for out_of_range, length_error
-
#include <cstddef> // for size_t
#include <21.strings.h> // for StringMembers
#include <alg_test.h> // for InputIter
#include <driver.h> // for rw_test()
-#include <rw_char.h> // for rw_widen()
+#include <rw_char.h> // for rw_expand()
#include <rw_new.h> // for bad_alloc, replacement operator new
-
/**************************************************************************/
// for convenience and brevity
-#define LSTR StringMembers::long_string
-#define LLEN StringMembers::long_string_len
#define Append(which) StringMembers::append_ ## which
typedef StringMembers::OverloadId OverloadId;
@@ -103,8 +99,9 @@
TEST ("\0ab\0\0c", "e\0", "\0ab\0\0ce", 0),
TEST ("abcdefghij", "abcdefghij", "abcdefghijabcdefghij", 0),
- TEST ("", LSTR, LSTR, 0),
- TEST (LSTR, "", LSTR, 0),
+ TEST ("", "x@4096", "x@4096", 0),
+ TEST ("x@4096", "", "x@4096", 0),
+ TEST ("x@4096", "x@4096", "x@8192", 0),
TEST ("", 0, "", 0),
TEST ("abc", 0, "abcabc", 0),
@@ -112,7 +109,7 @@
TEST ("\0\0abc", 0, "\0\0abc", 0),
TEST ("abc\0\0", 0, "abc\0\0abc", 0),
- TEST ("", LSTR, LSTR, -1),
+ TEST ("", "x@4096", "x@4096", -1),
TEST ("last", "test", "lasttest", 0)
};
@@ -166,8 +163,9 @@
TEST ("ab\0\0c\0", "\0e", "ab\0\0c\0\0e", 0),
TEST ("abcdefghij", "abcdefghij", "abcdefghijabcdefghij", 0),
- TEST ("", LSTR, LSTR, 0),
- TEST (LSTR, "", LSTR, 0),
+ TEST ("", "x@4096", "x@4096", 0),
+ TEST ("x@4096", "", "x@4096", 0),
+ TEST ("x@4096", "x@4096", "x@8192", 0),
TEST ("", 0, "", 0),
TEST ("abc", 0, "abcabc", 0),
@@ -175,7 +173,7 @@
TEST ("\0\0abc", 0, "\0\0abc\0\0abc", 0),
TEST ("abc\0\0", 0, "abc\0\0abc\0\0", 0),
- TEST ("", LSTR, LSTR, -1),
+ TEST ("", "x@4096", "x@4096", -1),
TEST ("last", "test", "lasttest", 0)
};
@@ -236,11 +234,13 @@
TEST ("a\0bc", 0, 2, "a\0bca\0", 0),
TEST ("\0abc\0\0", 0, 1, "\0abc\0\0\0", 0),
TEST ("a\0bc\0\0", 0, 3, "a\0bc\0\0a\0b", 0),
+ TEST ("a@4096", 0, 1111, "a@5207", 0),
+ TEST ("b@4096", 0, 2222, "b@6318", 0),
- TEST ("", LSTR, LLEN - 1, LSTR, 0),
- TEST (LSTR, "", 0, LSTR, 0),
+ TEST ("", "x@4096", 4096, "x@4096", 0),
+ TEST ("x@4096", "", 0, "x@4096", 0),
- TEST ("", LSTR, LLEN - 1, LSTR, -1),
+ TEST ("", "x@4096", 4096, "x@4096", -1),
TEST ("last", "test", 4, "lasttest", 0)
};
@@ -315,14 +315,18 @@
TEST ("a\0bc\0\0", 0, 3, 9, "a\0bc\0\0c\0\0", 0),
TEST ("abcdef", 0, 1, 2, "abcdefbc", 0),
- TEST ("", LSTR, 0, LLEN, LSTR, 0),
- TEST (LSTR, "", 0, 0, LSTR, 0),
+ TEST ("a@1000", "b@1000", 0, 999, "a@1000b@999", 0),
+ TEST ("a@1000", "b@1001", 0, 1000, "a@1000b@1000", 0),
+ TEST ("a@1000", "b@1002", 0, 102, "a@1000b@102", 0),
+ TEST ("", "x@4096", 0, 4096, "x@4096", 0),
+ TEST ("x@4096", "", 0, 0, "x@4096", 0),
+ TEST ("x@4096", "a@4096", 100, 10, "x@4096a@10", 0),
TEST ("", "\0", 2, 0, "", 1),
TEST ("", "a", 2, 0, "", 1),
- TEST ("", LSTR,LLEN + 10, 0, "", 1),
+ TEST ("", "x@4096", 4106, 0, "", 1),
- TEST (LSTR, 0, 0, 0, LSTR, -1),
+ TEST ("x@4096", 0, 0, 0, "x@4096", -1),
TEST ("last", "test", 0, 4, "lasttest", 0)
};
@@ -380,10 +384,10 @@
TEST ("\0ab\0\0c", 3, '\0', "\0ab\0\0c\0\0\0", 0),
TEST ("a\0bc\0\0", 2, 'a', "a\0bc\0\0aa", 0),
- TEST ("", LLEN - 1, 'x', LSTR, 0),
- TEST (LSTR, 0, 'x', LSTR, 0),
+ TEST ("", 4096, 'x', "x@4096", 0),
+ TEST ("x@4096", 0, 'x', "x@4096", 0),
- TEST ("", LLEN - 1, 'x', LSTR, -1),
+ TEST ("", 4096, 'x', "x@4096", -1),
TEST ("last", 4, 't', "lasttttt", 0)
};
@@ -391,8 +395,11 @@
/**************************************************************************/
template <class charT, class Traits, class Iterator>
-void test_append_range (charT *wstr,
- charT *wsrc,
+void test_append_range (const charT *wstr,
+ std::size_t wstr_len,
+ const charT *warg,
+ std::size_t warg_len,
+ std::size_t res_len,
Traits*,
const Iterator &it,
const TestCase &tcase)
@@ -404,17 +411,25 @@
const char* const itname =
tcase.arg ? type_name (it, (charT*)0) : "basic_string::iterator";
- /* const */ String s_str (wstr, tcase.str_len);
- const String s_arg (wsrc, tcase.arg_len);
-
- std::size_t off_last = tcase.off + tcase.size;
+ // compute the size of the controlled sequence and the size
+ // of the sequence denoted by the argument keeping in mind
+ // that the latter may refer to the former
+ const std::size_t size1 = wstr_len;
+ const std::size_t size2 = tcase.arg ? warg_len : size1;
+
+ // construct the string object to be modified
+ String s_str (wstr, size1);
+
+ // compute the offset and the extent (the number of elements)
+ // of the second range into the argument of the function call
+ const std::size_t off =
+ std::size_t (tcase.off) < size2 ? std::size_t (tcase.off) : size2;
+ const std::size_t ext =
+ off + tcase.size < size2 ? std::size_t (tcase.size) : size2 - off;
if (tcase.arg) {
- if (off_last > s_arg.size ())
- off_last = s_arg.size ();
-
- const charT* const beg = wsrc + tcase.off;
- const charT* const end = wsrc + off_last;
+ const charT* const beg = warg + off;
+ const charT* const end = beg + ext;
const Iterator first (beg, beg, end);
const Iterator last (end, beg, end);
@@ -422,18 +437,18 @@
s_str.append (first, last);
}
else {
- const StringIter first (s_str.begin () + tcase.off);
- const StringIter last (s_str.size () < off_last ?
- s_str.end ()
- : s_str.begin () + off_last);
+ // self-referential modification (appending a range
+ // of elements with a subrange of its own elements)
+ const StringIter first (s_str.begin () + off);
+ const StringIter last (first + ext);
s_str.append (first, last);
}
- const std::size_t match =
- rw_match (tcase.res, s_str.c_str(), tcase.nres);
+ // detrmine whether the produced sequence matches the exepceted result
+ const std::size_t match = rw_match (tcase.res, s_str.data (), tcase.nres);
- rw_assert (match == tcase.nres, 0, tcase.line,
+ rw_assert (match == res_len, 0, tcase.line,
"line %d. %{$FUNCALL} expected %{#*s}, got %{/*.*Gs}, "
"difference at offset %zu for %s",
__LINE__, int (tcase.nres), tcase.res,
@@ -444,15 +459,18 @@
/**************************************************************************/
template <class charT, class Traits>
-void test_append_range (charT* wstr,
- charT* wsrc,
+void test_append_range (const charT *wstr,
+ std::size_t wstr_len,
+ const charT *warg,
+ std::size_t warg_len,
+ std::size_t res_len,
Traits*,
const TestCase &tcase)
{
if (tcase.bthrow) // this method doesn't throw
return;
- test_append_range (wstr, wsrc, (Traits*)0,
+ test_append_range (wstr, wstr_len, warg, warg_len, res_len, (Traits*)0,
InputIter<charT>(0, 0, 0), tcase);
// there is no need to call test_append_range
@@ -460,13 +478,13 @@
if (0 == tcase.arg)
return;
- test_append_range (wstr, wsrc, (Traits*)0,
+ test_append_range (wstr, wstr_len, warg, warg_len, res_len, (Traits*)0,
ConstFwdIter<charT>(0, 0, 0), tcase);
- test_append_range (wstr, wsrc, (Traits*)0,
+ test_append_range (wstr, wstr_len, warg, warg_len, res_len, (Traits*)0,
ConstBidirIter<charT>(0, 0, 0), tcase);
- test_append_range (wstr, wsrc, (Traits*)0,
+ test_append_range (wstr, wstr_len, warg, warg_len, res_len, (Traits*)0,
ConstRandomAccessIter<charT>(0, 0, 0), tcase);
}
@@ -478,36 +496,64 @@
const TestCase &tcase)
{
typedef std::allocator<charT> Allocator;
- typedef std::basic_string <charT, Traits, Allocator> TestString;
- typedef typename TestString::iterator StringIter;
- typedef typename TestString::const_iterator ConstStringIter;
+ typedef std::basic_string <charT, Traits, Allocator> String;
+ typedef typename String::iterator StringIter;
+ typedef typename UserTraits<charT>::MemFun UTMemFun;
+
+ static const std::size_t BUFSIZE = 256;
- typedef typename UserTraits<charT>::MemFun UTMemFun;
+ static charT wstr_buf [BUFSIZE];
+ static charT warg_buf [BUFSIZE];
- static charT wstr [LLEN];
- static charT wsrc [LLEN];
+ std::size_t str_len = sizeof wstr_buf / sizeof *wstr_buf;
+ std::size_t arg_len = sizeof warg_buf / sizeof *warg_buf;
- rw_widen (wstr, tcase.str, tcase.str_len);
- rw_widen (wsrc, tcase.arg, tcase.arg_len);
+ charT* wstr = rw_expand (wstr_buf, tcase.str, tcase.str_len, &str_len);
+ charT* warg = rw_expand (warg_buf, tcase.arg, tcase.arg_len, &arg_len);
+
+ static charT wres_buf [BUFSIZE];
+ std::size_t res_len = sizeof wres_buf / sizeof *wres_buf;
+ charT* wres = rw_expand (wres_buf, tcase.res, tcase.nres, &res_len);
// special processing for append_range to exercise all iterators
if (Append (range) == which) {
- test_append_range (wstr, wsrc, (Traits*)0, tcase);
+ test_append_range (wstr, str_len, warg, arg_len,
+ res_len, (Traits*)0, tcase);
+ if (wstr != wstr_buf)
+ delete[] wstr;
+
+ if (warg != warg_buf)
+ delete[] warg;
+
+ if (wres != wres_buf)
+ delete[] wres;
+
return;
}
- /* const */ TestString s_str (wstr, tcase.str_len);
- const TestString s_arg (wsrc, tcase.arg_len);
+ // construct the string object to be modified
+ // and the (possibly unused) argument string
+ /* const */ String s_str (wstr, str_len);
+ const String s_arg (warg, arg_len);
+
+ if (wstr != wstr_buf)
+ delete[] wstr;
+
+ if (warg != warg_buf)
+ delete[] warg;
+
+ wstr = 0;
+ warg = 0;
- std::size_t res_off = 0;
+ std::size_t res_off = 0;
// save the state of the string object before the call
// to detect wxception safety violations (changes to
// the state of the object after an exception)
const StringState str_state (rw_get_string_state (s_str));
- const charT* const ptr_arg = tcase.arg ? wsrc : s_str.c_str ();
- const TestString& str_arg = tcase.arg ? s_arg : s_str;
+ const charT* const ptr_arg = tcase.arg ? s_arg.c_str () : s_str.c_str ();
+ const String& str_arg = tcase.arg ? s_arg : s_str;
std::size_t total_length_calls = 0;
std::size_t n_length_calls = 0;
@@ -541,8 +587,12 @@
#else // if defined (_RWSTD_NO_EXCEPTIONS)
- if (tcase.bthrow)
- return;
+ if (tcase.bthrow) {
+ if (wres != wres_buf)
+ delete[] wres;
+
+ return;
+ }
#endif // _RWSTD_NO_EXCEPTIONS
@@ -550,7 +600,7 @@
switch (which) {
case Append (ptr): {
- const TestString& s_res = s_str.append (ptr_arg);
+ const String& s_res = s_str.append (ptr_arg);
res_off = &s_res - &s_str;
if (rg_calls)
n_length_calls = rg_calls [UTMemFun::length];
@@ -558,19 +608,19 @@
}
case Append (str): {
- const TestString& s_res = s_str.append (str_arg);
+ const String& s_res = s_str.append (str_arg);
res_off = &s_res - &s_str;
break;
}
case Append (ptr_size): {
- const TestString& s_res = s_str.append (ptr_arg, tcase.size);
+ const String& s_res = s_str.append (ptr_arg, tcase.size);
res_off = &s_res - &s_str;
break;
}
case Append (str_size_size): {
- const TestString& s_res =
+ const String& s_res =
s_str.append (str_arg, tcase.off, tcase.size);
res_off = &s_res - &s_str;
break;
@@ -578,7 +628,7 @@
case Append (size_val): {
const charT ch (make_char (char (tcase.val), (charT*)0));
- const TestString& s_res = s_str.append (tcase.size, ch);
+ const String& s_res = s_str.append (tcase.size, ch);
res_off = &s_res - &s_str;
break;
}
@@ -593,21 +643,21 @@
"offset is %zu", __LINE__, res_off);
// verify that strings are of equal length
- rw_assert (tcase.nres == s_str.size (), 0, tcase.line,
+ rw_assert (res_len == s_str.size (), 0, tcase.line,
"line %d. %{$FUNCALL} expected %{#*s}, "
"length %zu, got %{/*.*Gs}, length %zu",
__LINE__, int (tcase.nres), tcase.res,
- tcase.nres, int (sizeof (charT)),
+ res_len, int (sizeof (charT)),
int (s_str.size ()), s_str.c_str (), s_str.size ());
- if (tcase.nres == s_str.size ()) {
+ if (res_len == s_str.size ()) {
// if the result length matches the expected length
// (and only then), also verify that the modified
// string matches the expected result
const std::size_t match =
- rw_match (tcase.res, s_str.c_str(), tcase.nres);
+ rw_match (tcase.res, s_str.c_str (), tcase.nres);
- rw_assert (match == tcase.nres, 0, tcase.line,
+ rw_assert (match == res_len, 0, tcase.line,
"line %d. %{$FUNCALL} expected %{#*s}, "
"got %{/*.*Gs}, difference at offset %zu",
__LINE__, int (tcase.nres), tcase.res,
@@ -699,6 +749,9 @@
#endif // _RWSTD_NO_REPLACEABLE_NEW_DELETE
*pst->throw_at_calls_ [0] = std::size_t (-1);
+
+ if (wres != wres_buf)
+ delete[] wres;
}
/**************************************************************************/
Modified: incubator/stdcxx/trunk/tests/strings/21.string.assign.cpp
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/strings/21.string.assign.cpp?rev=406581&r1=406580&r2=406581&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/strings/21.string.assign.cpp (original)
+++ incubator/stdcxx/trunk/tests/strings/21.string.assign.cpp Mon May 15 01:14:29 2006
@@ -32,15 +32,12 @@
#include <21.strings.h> // for StringMembers
#include <alg_test.h> // for InputIter
#include <driver.h> // for rw_test()
-#include <rw_char.h> // for rw_widen()
+#include <rw_char.h> // for rw_expand()
#include <rw_new.h> // for bad_alloc, replacement operator new
/**************************************************************************/
// for convenience and brevity
-
-#define LSTR StringMembers::long_string
-#define LLEN StringMembers::long_string_len
#define Assign(which) StringMembers::assign_ ## which
typedef StringMembers::OverloadId AssignOverload;
@@ -96,16 +93,18 @@
TEST ("a\0b\0\0c", "e\0", "e", 0),
TEST ("\0ab\0\0c", "e\0", "e", 0),
- TEST ("", LSTR, LSTR, 0),
- TEST (LSTR, "", "", 0),
+ TEST ("", "x@4096", "x@4096", 0),
+ TEST ("x@4096", "", "", 0),
+ TEST ("a@4096", "b@4096", "b@4096", 0),
TEST ("", 0, "", 0),
TEST ("abc", 0, "abc", 0),
TEST ("a\0\0bc", 0, "a", 0),
TEST ("\0\0abc", 0, "", 0),
TEST ("abc\0\0", 0, "abc", 0),
+ TEST ("x@4096", 0, "x@4096", 0),
- TEST ("", LSTR, LSTR, -1),
+ TEST ("", "x@4096", "x@4096", -1),
TEST ("last", "test", "test", 0)
};
@@ -160,14 +159,16 @@
TEST ("e\0\0", "\0ab\0\0c", "\0ab\0\0c", 0),
TEST ("\0e", "ab\0\0c\0", "ab\0\0c\0", 0),
- TEST ("", LSTR, LSTR, 0),
- TEST (LSTR, "", "", 0),
+ TEST ("", "x@4096", "x@4096", 0),
+ TEST ("x@4096", "", "", 0),
+ TEST ("a@4096", "b@4096", "b@4096", 0),
TEST ("", 0, "", 0),
TEST ("abc", 0, "abc", 0),
TEST ("a\0\0bc", 0, "a\0\0bc", 0),
TEST ("\0\0abc", 0, "\0\0abc", 0),
TEST ("abc\0\0", 0, "abc\0\0", 0),
+ TEST ("x@4096", 0, "x@4096", 0),
TEST ("last", "test", "test", 0)
};
@@ -230,15 +231,17 @@
TEST ("\0abc\0\0", 0, 1, "\0", 0),
TEST ("a\0bc\0\0", 0, 3, "a\0b", 0),
TEST ("a\0bc\0\0", 0, 6, "a\0bc\0\0", 0),
+ TEST ("x@4096", 0, 2048, "x@2048", 0),
- TEST ("", LSTR, LLEN - 1, LSTR, 0),
- TEST ("abcd", LSTR, 0, "", 0),
- TEST (LSTR, LSTR, 0, "", 0),
- TEST (LSTR, LSTR, 1, "x", 0),
- TEST (LSTR, "", 0, "", 0),
+ TEST ("", "x@4096", 4096, "x@4096", 0),
+ TEST ("abcd", "x@4096", 0, "", 0),
+ TEST ("x@4096", "x@4096", 0, "", 0),
+ TEST ("x@4096", "x@4096", 1, "x", 0),
+ TEST ("x@4096", "", 0, "", 0),
+ TEST ("a@4096", "b@4096", 2048, "b@2048", 0),
TEST ("", "", -1, "", 2),
- TEST ("", LSTR, LLEN - 1, LSTR, -1),
+ TEST ("", "x@4096", 4096, "x@4096", -1),
TEST ("last", "test", 4, "test", 0)
};
@@ -313,18 +316,21 @@
TEST ("a\0bc\0\0", 0, 1, 3, "\0bc", 0),
TEST ("a\0bc\0\0", 0, 0, 9, "a\0bc\0\0", 0),
TEST ("abcdef", 0, 1, 2, "bc", 0),
+ TEST ("x@4096", 0, 1, 2, "xx", 0),
- TEST (LSTR, "", 0, 0, "", 0),
- TEST ("", LSTR, 9, 2, "xx", 0),
- TEST ("", LSTR, 9, 0, "", 0),
- TEST ("abc", LSTR, 2, 1, "x", 0),
- TEST (LSTR, LSTR, 2, 3, "xxx", 0),
- TEST ("", LSTR, 0, LLEN, LSTR, 0),
+ TEST ("x@4096", "", 0, 0, "", 0),
+ TEST ("", "x@4096", 9, 2, "xx", 0),
+ TEST ("", "x@4096", 9, 0, "", 0),
+ TEST ("abc", "x@4096", 2, 1, "x", 0),
+ TEST ("x@4096", "x@4096", 2, 3, "xxx", 0),
+ TEST ("", "x@4096", 0, 4096, "x@4096", 0),
+ TEST ("", "x@4096", 100, 2000, "x@2000", 0),
TEST ("", "\0", 2, 0, "", 1),
TEST ("", "a", 2, 0, "", 1),
- TEST ("", LSTR,LLEN + 10, 0, "", 1),
- TEST ("", LSTR, 0, LLEN - 1, LSTR, -1),
+ TEST ("", "x@4096", 4106, 0, "", 1),
+
+ TEST ("", "x@4096", 0, 4096, "x@4096", -1),
TEST ("last", "test", 0, 4, "test", 0)
};
@@ -378,11 +384,11 @@
TEST ("\0ab\0\0c", 3, '\0', "\0\0\0", 0),
TEST ("a\0bc\0\0", 2, 'a', "aa", 0),
- TEST ("", LLEN - 1, 'x', LSTR, 0),
- TEST (LSTR, 0, 'x', "", 0),
+ TEST ("", 4096, 'x', "x@4096", 0),
+ TEST ("x@4096", 0, 'x', "", 0),
TEST ("", -1, 'x', "", 2),
- TEST ("", LLEN - 1, 'x', LSTR, -1),
+ TEST ("", 4096, 'x', "x@4096", -1),
TEST ("last", 4, 't', "tttt", 0)
};
@@ -390,8 +396,11 @@
/**************************************************************************/
template <class charT, class Traits, class Iterator>
-void test_assign_range (charT *wstr,
- charT *wsrc,
+void test_assign_range (const charT *wstr,
+ std::size_t wstr_len,
+ const charT *warg,
+ std::size_t warg_len,
+ std::size_t res_len,
Traits*,
const Iterator &it,
const TestCase &tcase)
@@ -403,36 +412,44 @@
const char* const itname =
tcase.arg ? type_name (it, (charT*)0) : "basic_string::iterator";
- /* const */ String s_str (wstr, tcase.str_len);
- const String s_arg (wsrc, tcase.arg_len);
-
- std::size_t off_last = tcase.off + tcase.size;
+ // compute the size of the controlled sequence and the size
+ // of the sequence denoted by the argument keeping in mind
+ // that the latter may refer to the former
+ const std::size_t size1 = wstr_len;
+ const std::size_t size2 = tcase.arg ? warg_len : size1;
+
+ // construct the string object to be modified
+ String s_str (wstr, size1);
+
+ // compute the offset and the extent (the number of elements)
+ // of the second range into the argument of the function call
+ const std::size_t off =
+ std::size_t (tcase.off) < size2 ? std::size_t (tcase.off) : size2;
+ const std::size_t ext =
+ off + tcase.size < size2 ? std::size_t (tcase.size) : size2 - off;
if (tcase.arg) {
- if (off_last > s_arg.size ())
- off_last = s_arg.size ();
+ const charT* const beg = warg + off;
+ const charT* const end = beg + ext;
- const Iterator
- first (wsrc + tcase.off, wsrc + tcase.off, wsrc + off_last);
- const Iterator
- last (wsrc + off_last, wsrc + tcase.off, wsrc + off_last);
+ const Iterator first (beg, beg, end);
+ const Iterator last (end, beg, end);
s_str.assign (first, last);
}
else {
-
- const StringIter first (s_str.begin () + tcase.off);
- const StringIter last (off_last > s_str.size () ?
- s_str.end ()
- : s_str.begin () + off_last);
+ // self-referential modification (appending a range
+ // of elements with a subrange of its own elements)
+ const StringIter first (s_str.begin () + off);
+ const StringIter last (first + ext);
s_str.assign (first, last);
}
- const std::size_t match =
- rw_match (tcase.res, s_str.c_str(), tcase.nres);
+ // detrmine whether the produced sequence matches the exepceted result
+ const std::size_t match = rw_match (tcase.res, s_str.data (), tcase.nres);
- rw_assert (match == tcase.nres, 0, tcase.line,
+ rw_assert (match == res_len, 0, tcase.line,
"line %d. %{$FUNCALL} expected %{#*s}, got %{/*.*Gs}, "
"difference at off %zu for %s",
__LINE__, int (tcase.nres), tcase.res,
@@ -443,15 +460,18 @@
/**************************************************************************/
template <class charT, class Traits>
-void test_assign_range (charT *wstr,
- charT *wsrc,
+void test_assign_range (const charT *wstr,
+ std::size_t wstr_len,
+ const charT *warg,
+ std::size_t warg_len,
+ std::size_t res_len,
Traits*,
const TestCase &tcase)
{
if (tcase.bthrow) // this method doesn't throw
return;
- test_assign_range (wstr, wsrc, (Traits*)0,
+ test_assign_range (wstr, wstr_len, warg, warg_len, res_len, (Traits*)0,
InputIter<charT>(0, 0, 0), tcase);
// there is no need to call test_assign_range
@@ -459,13 +479,13 @@
if (0 == tcase.arg)
return;
- test_assign_range (wstr, wsrc, (Traits*)0,
+ test_assign_range (wstr, wstr_len, warg, warg_len, res_len, (Traits*)0,
ConstFwdIter<charT>(0, 0, 0), tcase);
- test_assign_range (wstr, wsrc, (Traits*)0,
+ test_assign_range (wstr, wstr_len, warg, warg_len, res_len, (Traits*)0,
ConstBidirIter<charT>(0, 0, 0), tcase);
- test_assign_range (wstr, wsrc, (Traits*)0,
+ test_assign_range (wstr, wstr_len, warg, warg_len, res_len, (Traits*)0,
ConstRandomAccessIter<charT>(0, 0, 0), tcase);
}
@@ -477,26 +497,55 @@
const TestCase &tcase)
{
typedef std::allocator<charT> Allocator;
- typedef std::basic_string <charT, Traits, Allocator> TestString;
- typedef typename TestString::iterator StringIter;
- typedef typename TestString::const_iterator ConstStringIter;
+ typedef std::basic_string <charT, Traits, Allocator> String;
+ typedef typename String::iterator StringIter;
+ typedef typename UserTraits<charT>::MemFun UTMemFun;
+
+ static const std::size_t BUFSIZE = 256;
+
+ static charT wstr_buf [BUFSIZE];
+ static charT warg_buf [BUFSIZE];
- typedef typename UserTraits<charT>::MemFun UTMemFun;
+ std::size_t str_len = sizeof wstr_buf / sizeof *wstr_buf;
+ std::size_t arg_len = sizeof warg_buf / sizeof *warg_buf;
- static charT wstr [LLEN];
- static charT wsrc [LLEN];
+ charT* wstr = rw_expand (wstr_buf, tcase.str, tcase.str_len, &str_len);
+ charT* warg = rw_expand (warg_buf, tcase.arg, tcase.arg_len, &arg_len);
- rw_widen (wstr, tcase.str, tcase.str_len);
- rw_widen (wsrc, tcase.arg, tcase.arg_len);
+ static charT wres_buf [BUFSIZE];
+ std::size_t res_len = sizeof wres_buf / sizeof *wres_buf;
+ charT* wres = rw_expand (wres_buf, tcase.res, tcase.nres, &res_len);
// special processing for assign_range to exercise all iterators
if (Assign (range) == which) {
- test_assign_range (wstr, wsrc, (Traits*)0, tcase);
+ test_assign_range (wstr, str_len, warg, arg_len,
+ res_len, (Traits*)0, tcase);
+
+ if (wstr != wstr_buf)
+ delete[] wstr;
+
+ if (warg != warg_buf)
+ delete[] warg;
+
+ if (wres != wres_buf)
+ delete[] wres;
+
return;
}
- /* const */ TestString s_str (wstr, tcase.str_len);
- const TestString s_arg (wsrc, tcase.arg_len);
+ // construct the string object to be modified
+ // and the (possibly unused) argument string
+ /* const */ String s_str (wstr, str_len);
+ const String s_arg (warg, arg_len);
+
+ if (wstr != wstr_buf)
+ delete[] wstr;
+
+ if (warg != warg_buf)
+ delete[] warg;
+
+ wstr = 0;
+ warg = 0;
std::size_t res_off = 0;
std::size_t size = tcase.size >= 0 ? tcase.size : s_str.max_size () + 1;
@@ -507,8 +556,8 @@
const StringState str_state (rw_get_string_state (s_str));
// first function argument
- const charT* const arg_ptr = tcase.arg ? wsrc : s_str.c_str ();
- const TestString& arg_str = tcase.arg ? s_arg : s_str;
+ const charT* const arg_ptr = tcase.arg ? s_arg.c_str () : s_str.c_str ();
+ const String& arg_str = tcase.arg ? s_arg : s_str;
std::size_t total_length_calls = 0;
std::size_t n_length_calls = 0;
@@ -542,15 +591,19 @@
#else // if defined (_RWSTD_NO_EXCEPTIONS)
- if (tcase.bthrow)
- return;
+ if (tcase.bthrow) {
+ if (wres != wres_buf)
+ delete[] wres;
+
+ return;
+ }
#endif // _RWSTD_NO_EXCEPTIONS
try {
switch (which) {
case Assign (ptr): {
- const TestString& s_res = s_str.assign (arg_ptr);
+ const String& s_res = s_str.assign (arg_ptr);
res_off = &s_res - &s_str;
if (rg_calls)
n_length_calls = rg_calls [UTMemFun::length];
@@ -558,19 +611,19 @@
}
case Assign (str): {
- const TestString& s_res = s_str.assign (arg_str);
+ const String& s_res = s_str.assign (arg_str);
res_off = &s_res - &s_str;
break;
}
case Assign (ptr_size): {
- const TestString& s_res = s_str.assign (arg_ptr, size);
+ const String& s_res = s_str.assign (arg_ptr, size);
res_off = &s_res - &s_str;
break;
}
case Assign (str_size_size): {
- const TestString& s_res =
+ const String& s_res =
s_str.assign (arg_str, tcase.off, size);
res_off = &s_res - &s_str;
break;
@@ -578,7 +631,7 @@
case Assign (size_val): {
const charT val = make_char (char (tcase.val), (charT*)0);
- const TestString& s_res = s_str.assign (size, val);
+ const String& s_res = s_str.assign (size, val);
res_off = &s_res - &s_str;
break;
}
@@ -594,21 +647,21 @@
"offset is %zu", __LINE__, res_off);
// verfiy that strings length are equal
- rw_assert (tcase.nres == s_str.size (), 0, tcase.line,
+ rw_assert (res_len == s_str.size (), 0, tcase.line,
"line %d. %{$FUNCALL}: expected %{#*s} with length "
"%zu, got %{/*.*Gs} with length %zu", __LINE__,
- int (tcase.nres), tcase.res, tcase.nres,
+ int (tcase.nres), tcase.res, res_len,
int (sizeof (charT)), int (s_str.size ()),
s_str.c_str (), s_str.size ());
- if (tcase.nres == s_str.size ()) {
+ if (res_len == s_str.size ()) {
// if the result length matches the expected length
// (and only then), also verify that the modified
// string matches the expected result
const std::size_t match =
rw_match (tcase.res, s_str.c_str(), tcase.nres);
- rw_assert (match == tcase.nres, 0, tcase.line,
+ rw_assert (match == res_len, 0, tcase.line,
"line %d. %{$FUNCALL}: expected %{#*s}, "
"got %{/*.*Gs}, difference at off %zu",
__LINE__, int (tcase.nres), tcase.res,
@@ -702,6 +755,9 @@
#endif // _RWSTD_NO_EXCEPTIONS
*pst->throw_at_calls_ [0] = std::size_t (-1);
+
+ if (wres != wres_buf)
+ delete[] wres;
}
/**************************************************************************/
Modified: incubator/stdcxx/trunk/tests/strings/21.string.compare.cpp
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/strings/21.string.compare.cpp?rev=406581&r1=406580&r2=406581&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/strings/21.string.compare.cpp (original)
+++ incubator/stdcxx/trunk/tests/strings/21.string.compare.cpp Mon May 15 01:14:29 2006
@@ -31,14 +31,12 @@
#include <21.strings.h> // for StringMembers
#include <driver.h> // for rw_assert()
-#include <rw_char.h> // for rw_widen()
+#include <rw_char.h> // for rw_expand()
/**************************************************************************/
// for convenience and brevity
#define NPOS _RWSTD_SIZE_MAX
-#define LSTR StringMembers::long_string
-#define LLEN StringMembers::long_string_len
#define Compare(which) StringMembers::compare_ ## which
typedef StringMembers::OverloadId OverloadId;
@@ -111,11 +109,15 @@
TEST ("ab\0", "abc\0\0\0", NPOS, 0),
TEST ("\0ab", "e\0ab\0\0c", NPOS, 0),
- TEST (LSTR, LSTR, 0, 0),
- TEST ("xx", LSTR, NPOS, 0),
- TEST (LSTR, "xxxxxx", 1, 0),
- TEST ("a\0b", LSTR, NPOS, 0),
- TEST (LSTR, "a\0b", 1, 0),
+ TEST ("x@4096", "x@4096", 0, 0),
+ TEST ("xx", "x@4096", NPOS, 0),
+ TEST ("x@4096", "xxxxxx", 1, 0),
+ TEST ("a\0b", "x@4096", NPOS, 0),
+ TEST ("x@4096", "a\0b", 1, 0),
+
+ TEST ("a@2048b@2048", "a@2048b@2047", 1, 0),
+ TEST ("a@2048b@2048", "a@2048b@2047c", NPOS, 0),
+ TEST ("a@2048cb@2047", "a@2048cb@2047", 0, 0),
TEST ("last", "last", 0, 0)
};
@@ -182,11 +184,15 @@
TEST ("bb\0", "ab\0\0\0c", 1, 0),
TEST ("\0ac", "\0abe\0\0c", 1, 0),
- TEST (LSTR, LSTR, 0, 0),
- TEST ("xx", LSTR, NPOS, 0),
- TEST (LSTR, "xxxxxx", 1, 0),
- TEST ("a\0b", LSTR, NPOS, 0),
- TEST (LSTR, "a\0b", 1, 0),
+ TEST ("x@4096", "x@4096", 0, 0),
+ TEST ("xx", "x@4096", NPOS, 0),
+ TEST ("x@4096", "xxxxxx", 1, 0),
+ TEST ("a\0b", "x@4096", NPOS, 0),
+ TEST ("x@4096", "a\0b", 1, 0),
+
+ TEST ("a@2048b@2048", "a@2048b@2047", 1, 0),
+ TEST ("a@2048b@2048", "a@2048b@2047c", NPOS, 0),
+ TEST ("a@2048cb@2047", "a@2048cb@2047", 0, 0),
TEST ("last", "last", 0, 0)
};
@@ -267,19 +273,19 @@
TEST ("\0eb", 0, 5, "e\0ab\0\0c", NPOS, 0),
TEST ("\0eb", 1, 5, "e\0ab\0\0c", 1, 0),
- TEST (LSTR, 0, LLEN - 1, LSTR, 0, 0),
- TEST (LSTR, 1, LLEN - 1, LSTR, NPOS, 0),
- TEST ("xx", 0, 2, LSTR, NPOS, 0),
- TEST (LSTR, 0, LLEN - 1, "xxxxx", 1, 0),
- TEST (LSTR, 2, 5, "xxxxx", 0, 0),
- TEST (LSTR, 5, 2, "xxxxx", NPOS, 0),
- TEST ("a\0x", 0, 3, LSTR, NPOS, 0),
- TEST (LSTR, 0, 10, "x\0b", 1, 0),
- TEST (LSTR, 0, 1, "x\0b", 0, 0),
+ TEST ("x@4096", 0, 4096, "x@4096", 0, 0),
+ TEST ("x@4096", 1, 4096, "x@4096", NPOS, 0),
+ TEST ("xx", 0, 2, "x@4096", NPOS, 0),
+ TEST ("x@4096", 0, 4096, "xxxxx", 1, 0),
+ TEST ("x@4096", 2, 5, "xxxxx", 0, 0),
+ TEST ("x@4096", 5, 2, "xxxxx", NPOS, 0),
+ TEST ("a\0x", 0, 3, "x@4096", NPOS, 0),
+ TEST ("x@4096", 0, 10, "x\0b", 1, 0),
+ TEST ("x@4096", 0, 1, "x\0b", 0, 0),
TEST ("\0", 2, 0, "", 1, 1),
TEST ("a", 10, 0, "", 1, 1),
- TEST (LSTR, LLEN + 10, 0, "", 1, 1),
+ TEST ("x@4096", 4106, 0, "", 1, 1),
TEST ("last", 0, 4, "last", 0, 0)
};
@@ -372,19 +378,20 @@
TEST ("abc\0\0\0", 2, 5, "abc\0\0", 1, 0),
TEST ("e\0ag\0\0c", 3, 6, "e\0ab\0\0c", 1, 0),
- TEST (LSTR, 0, LLEN - 1, LSTR, 0, 0),
- TEST (LSTR, 1, LLEN - 1, LSTR, NPOS, 0),
- TEST ("xx", 0, 2, LSTR, NPOS, 0),
- TEST (LSTR, 0, LLEN - 1, "xxxxx", 1, 0),
- TEST (LSTR, 2, 5, "xxxxx", 0, 0),
- TEST (LSTR, 5, 2, "xxxxx", NPOS, 0),
- TEST ("a\0x", 0, 3, LSTR, NPOS, 0),
- TEST (LSTR, 0, 10, "x\0b", 1, 0),
- TEST (LSTR, 0, 1, "x\0b", NPOS, 0),
+ TEST ("x@4096", 0, 4096, "x@4096", 0, 0),
+ TEST ("x@4096", 1, 4096, "x@4096", NPOS, 0),
+ TEST ("xx", 0, 2, "x@4096", NPOS, 0),
+ TEST ("x@4096", 0, 4096, "xxxxx", 1, 0),
+ TEST ("x@4096", 2, 5, "xxxxx", 0, 0),
+ TEST ("x@4096", 5, 2, "xxxxx", NPOS, 0),
+ TEST ("a\0x", 0, 3, "x@4096", NPOS, 0),
+ TEST ("x@4096", 0, 10, "x\0b", 1, 0),
+ TEST ("x@4096", 0, 1, "x\0b", NPOS, 0),
+ TEST ("a@4096\0", 4096, 1, "\0", 0, 0),
TEST ("\0", 2, 0, "", 1, 1),
TEST ("a", 10, 0, "", 1, 1),
- TEST (LSTR, LLEN + 10, 0, "", 1, 1),
+ TEST ("x@4096", 4106, 0, "", 1, 1),
TEST ("last", 0, 4, "last", 0, 0)
};
@@ -496,21 +503,23 @@
TEST ("e\0ag\0\0c", 3, 6, "e\0ab\0\0c", 7, 1, 0),
TEST ("abc\0\0\0", 2, 5, "c\0\0ab", 4, NPOS, 0),
- TEST (LSTR, 0, LLEN - 1, LSTR, LLEN - 1, 0, 0),
- TEST (LSTR, 1, LLEN - 1, LSTR, LLEN - 1, NPOS, 0),
- TEST (LSTR, 1, LLEN - 1, LSTR, LLEN - 4, 1, 0),
- TEST ("xx", 0, 2, LSTR, LLEN - 4, NPOS, 0),
- TEST (LSTR, 0, LLEN - 1, "xxxxx", 5, 1, 0),
- TEST (LSTR, LLEN - 6, 5, "xxxxx", 5, 0, 0),
- TEST (LSTR, 2, 5, "xxxxx", 5, 0, 0),
- TEST (LSTR, 5, 2, "xxxxx", 3, NPOS, 0),
- TEST ("a\0x", 0, 3, LSTR, 10, NPOS, 0),
- TEST (LSTR, 0, 10, "x\0b", 2, 1, 0),
- TEST (LSTR, 0, 1, "x\0b", 2, NPOS, 0),
+ TEST ("x@4096", 0, 4096, "x@4096", 4096, 0, 0),
+ TEST ("x@4096", 1, 4096, "x@4096", 4096, NPOS, 0),
+ TEST ("x@4096", 1, 4096, "x@4096", 4092, 1, 0),
+ TEST ("xx", 0, 2, "x@4096", 4092, NPOS, 0),
+ TEST ("x@4096", 0, 4096, "xxxxx", 5, 1, 0),
+ TEST ("x@4096", 4090, 5, "xxxxx", 5, 0, 0),
+ TEST ("x@4096", 2, 5, "xxxxx", 5, 0, 0),
+ TEST ("x@4096", 5, 2, "xxxxx", 3, NPOS, 0),
+ TEST ("a\0x", 0, 3, "x@4096", 10, NPOS, 0),
+ TEST ("x@4096", 0, 10, "x\0b", 2, 1, 0),
+ TEST ("x@4096", 0, 1, "x\0b", 2, NPOS, 0),
+
+ TEST ("a@4096\0", 4096, 1, "\0b", 1, 0, 0),
TEST ("\0", 2, 0, "", 0, 1, 1),
TEST ("a", 10, 0, "", 0, 1, 1),
- TEST (LSTR, LLEN + 10, 0, "", 0, 1, 1),
+ TEST ("x@4096", 4106, 0, "", 0, 1, 1),
TEST ("last", 0, 4, "last", 4, 0, 0)
};
@@ -656,31 +665,31 @@
TEST ("e\0ag\0\0c", 3, 6, "e\0ab\0\0c", 0, 7, 1, 0),
TEST ("abc\0\0\0", 2, 5, "c\0\0ab", 0, 4, NPOS, 0),
- TEST (LSTR, 0, LLEN - 1, LSTR, 0, LLEN - 1, 0, 0),
- TEST (LSTR, 1, LLEN - 1, LSTR, 0, LLEN - 1, NPOS, 0),
- TEST (LSTR, 1, LLEN - 1, LSTR, 0, LLEN - 4, 1, 0),
- TEST (LSTR, 1, LLEN - 6, LSTR, 2, LLEN - 6, 0, 0),
- TEST (LSTR, 1, LLEN + 6, LSTR, 2, LLEN + 6, 1, 0),
- TEST ("xx", 0, 2, LSTR, 0, LLEN - 4, NPOS, 0),
- TEST ("xx", 0, 2, LSTR, LLEN - 6,
- 2, 0, 0),
- TEST (LSTR, 0, LLEN - 1, "xxxxx", 0, 5, 1, 0),
- TEST (LSTR, LLEN - 6, 5, "xxxxx", 0, 5, 0, 0),
- TEST (LSTR, 2, 5, "xxxxx", 0, 5, 0, 0),
- TEST (LSTR, 5, 2, "xxxxx", 0, 3, NPOS, 0),
- TEST ("a\0x", 0, 3, LSTR, 0, 10, NPOS, 0),
- TEST ("a\0x", 2, 1, LSTR, LLEN - 2,
- 1, 0, 0),
- TEST (LSTR, 0, 10, "x\0b", 0, 2, 1, 0),
- TEST (LSTR, 0, 1, "x\0b", 0, 2, NPOS, 0),
+ TEST ("x@4096", 0, 4096, "x@4096", 0, 4096, 0, 0),
+ TEST ("x@4096", 1, 4096, "x@4096", 0, 4096, NPOS, 0),
+ TEST ("x@4096", 1, 4096, "x@4096", 0, 4092, 1, 0),
+ TEST ("x@4096", 1, 4090, "x@4096", 2, 4090, 0, 0),
+ TEST ("x@4096", 1, 4102, "x@4096", 2, 4102, 1, 0),
+ TEST ("xx", 0, 2, "x@4096", 0, 4092, NPOS, 0),
+ TEST ("xx", 0, 2, "x@4096", 4090, 2, 0, 0),
+ TEST ("x@4096", 0, 4096, "xxxxx", 0, 5, 1, 0),
+ TEST ("x@4096", 4090, 5, "xxxxx", 0, 5, 0, 0),
+ TEST ("x@4096", 2, 5, "xxxxx", 0, 5, 0, 0),
+ TEST ("x@4096", 5, 2, "xxxxx", 0, 3, NPOS, 0),
+ TEST ("a\0x", 0, 3, "x@4096", 0, 10, NPOS, 0),
+ TEST ("a\0x", 2, 1, "x@4096", 4095, 1, 0, 0),
+ TEST ("x@4096", 0, 10, "x\0b", 0, 2, 1, 0),
+ TEST ("x@4096", 0, 1, "x\0b", 0, 2, NPOS, 0),
+
+ TEST ("a@4096\0", 4096, 1, "b\0", 1, 1, 0, 0),
TEST ("\0", 2, 0, "", 0, 0, 1, 1),
TEST ("a", 10, 0, "", 0, 0, 1, 1),
- TEST (LSTR, LLEN + 10, 0, "", 0, 0, 1, 1),
+ TEST ("x@4096", 4106, 0, "", 0, 0, 1, 1),
TEST ("", 0, 0, "\0", 2, 0, 1, 2),
TEST ("", 0, 0, "a", 10, 0, 1, 2),
- TEST ("", 0, 0, LSTR, LLEN + 10, 0, 1, 2),
+ TEST ("", 0, 0, "x@4096", 4106, 0, 1, 2),
TEST ("last", 0, 4, "last", 0, 4, 0, 0)
};
@@ -693,19 +702,33 @@
const TestCase &tcase)
{
typedef std::allocator<charT> Allocator;
- typedef std::basic_string <charT, Traits, Allocator> TestString;
- typedef typename TestString::const_iterator ConstStringIter;
+ typedef std::basic_string <charT, Traits, Allocator> String;
+ typedef typename UserTraits<charT>::MemFun UTMemFun;
+
+ static const std::size_t BUFSIZE = 256;
+
+ static charT wstr_buf [BUFSIZE];
+ static charT warg_buf [BUFSIZE];
+
+ std::size_t str_len = sizeof wstr_buf / sizeof *wstr_buf;
+ std::size_t arg_len = sizeof warg_buf / sizeof *warg_buf;
+
+ charT* wstr = rw_expand (wstr_buf, tcase.str, tcase.str_len, &str_len);
+ charT* warg = rw_expand (warg_buf, tcase.arg, tcase.arg_len, &arg_len);
- typedef typename UserTraits<charT>::MemFun UTMemFun;
+ // construct the string object to be modified
+ // and the (possibly unused) argument string
+ /* const */ String s_str (wstr, str_len);
+ const String s_arg (warg, arg_len);
- static charT wstr [LLEN];
- static charT warg [LLEN];
+ if (wstr != wstr_buf)
+ delete[] wstr;
- rw_widen (wstr, tcase.str, tcase.str_len);
- rw_widen (warg, tcase.arg, tcase.arg_len);
+ if (warg != warg_buf)
+ delete[] warg;
- /* const */ TestString s_str (wstr, tcase.str_len);
- const TestString s_arg (warg, tcase.arg_len);
+ wstr = 0;
+ warg = 0;
// save the state of the string object before the call
// to detect wxception safety violations (changes to
@@ -715,8 +738,8 @@
int res = 0;
// string function argument
- const charT* const arg_ptr = tcase.arg ? warg : s_str.c_str ();
- const TestString& arg_str = tcase.arg ? s_arg : s_str;
+ const charT* const arg_ptr = tcase.arg ? s_arg.c_str () : s_str.c_str ();
+ const String& arg_str = tcase.arg ? s_arg : s_str;
std::size_t total_compare_calls = 0;
std::size_t n_compare_calls = 0;
Modified: incubator/stdcxx/trunk/tests/strings/21.string.copy.cpp
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/strings/21.string.copy.cpp?rev=406581&r1=406580&r2=406581&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/strings/21.string.copy.cpp (original)
+++ incubator/stdcxx/trunk/tests/strings/21.string.copy.cpp Mon May 15 01:14:29 2006
@@ -31,15 +31,13 @@
#include <21.strings.h> // for StringMembers
#include <driver.h> // for rw_assert()
-#include <rw_char.h> // for rw_widen()
+#include <rw_char.h> // for rw_expand()
/**************************************************************************/
// for convenience and brevity
#define NPOS _RWSTD_SIZE_MAX
-#define LSTR StringMembers::long_string
-#define LLEN StringMembers::long_string_len
#define Copy(which) StringMembers::copy_ ## which
typedef StringMembers::OverloadId OverloadId;
@@ -91,7 +89,9 @@
TEST ("\0ab\0\0\0c\0", 5, "\0ab\0\0"),
TEST ("\0\0ab\0\0c\0", 6, "\0\0ab\0\0"),
- TEST ("last", 4, "last")
+ TEST ("x@4096", 4096, "x@4096"),
+
+ TEST ("last", 4, "last")
};
/**************************************************************************/
@@ -147,13 +147,13 @@
TEST ("\0\0ab\0\0c\0", 6, 0, "\0\0ab\0\0", 0),
TEST ("\0\0ab\0\0c\0", 4, 1, "\0ab\0", 0),
- TEST (LSTR, LLEN - 1, 0, LSTR, 0),
- TEST (LSTR, 2, 1, "xx", 0),
- TEST (LSTR, LLEN - 1, LLEN - 2, "x", 0),
-
- TEST ("\0", 0, 2, "", 1),
- TEST ("a", 0, 10, "", 1),
- TEST (LSTR, 0, LLEN + 10, "", 1),
+ TEST ("x@4096", 4096, 0, "x@4096", 0),
+ TEST ("x@4096", 2, 1, "xx", 0),
+ TEST ("x@4096", 4096, 4095, "x", 0),
+
+ TEST ("\0", 0, 2, "", 1),
+ TEST ("a", 0, 10, "", 1),
+ TEST ("x@4096", 0, 4106, "", 1),
TEST ("last", 4, 0, "last", 0)
};
@@ -166,16 +166,28 @@
const TestCase &tcase)
{
typedef std::allocator<charT> Allocator;
- typedef std::basic_string <charT, Traits, Allocator> TestString;
+ typedef std::basic_string <charT, Traits, Allocator> String;
+
+ static const std::size_t BUFSIZE = 256;
+
+ static charT wstr_buf [BUFSIZE];
+ std::size_t str_len = sizeof wstr_buf / sizeof *wstr_buf;
+ charT* wstr = rw_expand (wstr_buf, tcase.str, tcase.str_len, &str_len);
+
+ static charT wres_buf [BUFSIZE];
+ std::size_t res_len = sizeof wres_buf / sizeof *wres_buf;
+ charT* wres = rw_expand (wres_buf, tcase.res, tcase.nres, &res_len);
- static charT wstr [LLEN];
+ // construct the string object
+ const String str (wstr, str_len);
- // construct strings
- rw_widen (wstr, tcase.str, tcase.str_len);
- const TestString str (wstr, tcase.str_len);
+ if (wstr != wstr_buf)
+ delete[] wstr;
+
+ wstr = 0;
const std::size_t min_len =
- tcase.str_len < std::size_t (tcase.size) ? tcase.str_len : tcase.size;
+ str_len < std::size_t (tcase.size) ? str_len : tcase.size;
std::size_t res = 0;
@@ -199,8 +211,12 @@
#else // if defined (_RWSTD_NO_EXCEPTIONS)
- if (tcase.bthrow)
+ if (tcase.bthrow) {
+ if (wres != wres_buf)
+ delete[] wres;
+
return;
+ }
#endif // _RWSTD_NO_EXCEPTIONS
@@ -221,12 +237,12 @@
}
// verify the returned value
- rw_assert (res == tcase.nres, 0, tcase.line,
+ rw_assert (res == res_len, 0, tcase.line,
"line %d. %{$FUNCALL} == %zu, got %zu",
- __LINE__, tcase.nres, res);
+ __LINE__, res_len, res);
const std::size_t match = rw_match (tcase.res, s_res, tcase.nres);
- bool success = match == tcase.nres;
+ bool success = match == res_len;
rw_assert (success, 0, tcase.line,
"line %d. %{$FUNCALL} expected %{#*s}, "
@@ -278,6 +294,9 @@
}
#endif // _RWSTD_NO_EXCEPTIONS
+
+ if (wres != wres_buf)
+ delete[] wres;
delete[] s_res;
}
Modified: incubator/stdcxx/trunk/tests/strings/21.string.erase.cpp
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/strings/21.string.erase.cpp?rev=406581&r1=406580&r2=406581&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/strings/21.string.erase.cpp (original)
+++ incubator/stdcxx/trunk/tests/strings/21.string.erase.cpp Mon May 15 01:14:29 2006
@@ -31,16 +31,12 @@
#include <21.strings.h> // for StringMembers
#include <driver.h> // for rw_test()
-#include <rw_char.h> // for rw_widen()
+#include <rw_char.h> // for rw_expand()
+#include <rw_new.h> // for bad_alloc, replacement operator new
-#ifndef _RWSTD_NO_REPLACEABLE_NEW_DELETE
- // disabled for compilers such as IBM VAC++ or MSVC
- // that can't reliably replace the operators
-# include <rw_new.h> // for bad_alloc, replacement operator new
-#else
-# include <new> // for bad_alloc
-#endif // _RWSTD_NO_REPLACEABLE_NEW_DELETE
+/**************************************************************************/
+// for convenience and brevity
#define Erase(which) StringMembers::erase_ ## which
typedef StringMembers::OverloadId OverloadId;
@@ -48,12 +44,6 @@
typedef StringMembers::Test Test;
typedef StringMembers::Function MemFun;
-/**************************************************************************/
-
-// for convenience and brevity
-#define LSTR StringMembers::long_string
-#define LLEN StringMembers::long_string_len
-
static const char* const exceptions[] = {
"unknown exception", "out_of_range", "length_error",
"bad_alloc", "exception"
@@ -84,7 +74,7 @@
TEST ("a\0b\0\0c", ""),
TEST ("a\0bc\0\0", ""),
- TEST (LSTR, ""),
+ TEST ("x@4096", ""),
TEST ("last", "")
};
@@ -138,12 +128,13 @@
TEST ("a", 3, "a", 1),
TEST ("t\0 s", 5, "t\0 s", 1),
TEST ("ab\0c\0\0", 10, "ab\0c\0\0", 1),
- TEST (LSTR, LLEN + 10, LSTR, 1),
+ TEST ("x@4096", 4106, "x@4096", 1),
- TEST (LSTR, 0, "", 0),
- TEST (LSTR, 1, "x", 0),
- TEST (LSTR, 4, "xxxx", 0),
- TEST (LSTR, LLEN - 1, LSTR, 0),
+ TEST ("x@4096", 0, "", 0),
+ TEST ("x@4096", 1, "x", 0),
+ TEST ("x@4096", 4, "xxxx", 0),
+ TEST ("x@4096", 4096, "x@4096", 0),
+ TEST ("x@2048y@2048", 2048,"x@2048", 0),
TEST ("last test", 4, "last", 0)
};
@@ -217,18 +208,19 @@
TEST ("a", 0, 3, "", 0),
TEST ("t\0 s", 0, 9, "", 0),
TEST ("ab\0c\0\0", 0, 10, "", 0),
- TEST (LSTR, 0, LLEN + 9, "", 0),
+ TEST ("x@4096", 0, 4105, "", 0),
TEST ("a", 3, 1, "a", 1),
TEST ("t\0 s", 5, 1, "t\0 s", 1),
TEST ("ab\0c\0\0", 10, 1, "ab\0c\0\0", 1),
- TEST (LSTR, LLEN + 10, 1, LSTR, 1),
+ TEST ("x@4096", 4106, 1, "x@4096", 1),
- TEST (LSTR, 0, LLEN - 1, "", 0),
- TEST (LSTR, 1, LLEN - 2, "x", 0),
- TEST (LSTR, 4, LLEN - 5, "xxxx", 0),
- TEST (LSTR, 4, LLEN - 7, "xxxxxx", 0),
- TEST (LSTR, LLEN - 1, LLEN - 1, LSTR, 0),
+ TEST ("x@4096", 0, 4096, "", 0),
+ TEST ("x@4096", 1, 4095, "x", 0),
+ TEST ("x@4096", 4, 4092, "xxxx", 0),
+ TEST ("x@4096", 4, 4090, "xxxxxx", 0),
+ TEST ("x@4096", 4096, 4096, "x@4096", 0),
+ TEST ("x@2048y@2048", 1, 4094, "xy", 0),
TEST ("last test", 4, 1, "lasttest", 0)
};
@@ -274,17 +266,12 @@
TEST ("\0ab\0\0c", 2, "\0a\0\0c"),
TEST ("ab\0c\0\0", 5, "ab\0c\0"),
-#undef TEST
-#define TEST(str, off, res, res_len) { \
- __LINE__, off, -1, -1, -1, -1, str, sizeof str - 1, \
- 0, 0, res, res_len, 0 }
-
- TEST (LSTR, LLEN - 2, (LSTR + 1), LLEN - 2),
- TEST (LSTR, LLEN - 9, (LSTR + 1), LLEN - 2),
- TEST (LSTR, 0, (LSTR + 1), LLEN - 2),
- TEST (LSTR, 9, (LSTR + 1), LLEN - 2),
+ TEST ("x@4096y", 4096, "x@4096"),
+ TEST ("x@4096", 4088, "x@4095"),
+ TEST ("ax@4096", 0, "x@4096"),
+ TEST ("x@4096", 9, "x@4095"),
- TEST ("last test", 4, "lasttest", 8)
+ TEST ("last test", 4, "lasttest")
};
/**************************************************************************/
@@ -296,34 +283,60 @@
const TestCase &cs)
{
typedef std::allocator<charT> Allocator;
- typedef std::basic_string <charT, Traits, Allocator> TestString;
- typedef typename TestString::iterator StringIter;
- typedef typename TestString::const_iterator ConstStringIter;
+ typedef std::basic_string <charT, Traits, Allocator> String;
+ typedef typename String::iterator StringIter;
+ typedef typename String::const_iterator ConstStringIter;
const bool use_iters = Erase (iter) <= which;
if (use_iters && cs.bthrow)
return;
- static charT wstr [LLEN];
+ static const std::size_t BUFSIZE = 256;
- rw_widen (wstr, cs.str, cs.str_len);
+ static charT wstr_buf [BUFSIZE];
+ std::size_t str_len = sizeof wstr_buf / sizeof *wstr_buf;
+ charT* wstr = rw_expand (wstr_buf, cs.str, cs.str_len, &str_len);
+
+ static charT wres_buf [BUFSIZE];
+ std::size_t res_len = sizeof wres_buf / sizeof *wres_buf;
+ charT* wres = rw_expand (wres_buf, cs.res, cs.nres, &res_len);
+
+ static char wres_charbuf [BUFSIZE];
+ char* res_char = 0;
+ if (use_iters) {
+ std::size_t res_charlen = sizeof wres_charbuf / sizeof *wres_charbuf;
+ res_char = rw_expand (wres_charbuf, cs.res, cs.nres, &res_charlen);
+ }
- TestString s_str (wstr, cs.str_len);
+ // construct the string object to be modified
+ // and the (possibly unused) argument string
+ /* const */ String s_str (wstr, str_len);
+
+ if (wstr != wstr_buf)
+ delete[] wstr;
+
+ wstr = 0;
+
+ // save the state of the string object before the call
+ // to detect wxception safety violations (changes to
+ // the state of the object after an exception)
+ const StringState str_state (rw_get_string_state (s_str));
std::size_t res_off = 0;
StringIter res_iter = s_str.begin ();
- int first = use_iters ? cs.off : cs.str_len + 1;
- int last = use_iters ? cs.off + cs.size : cs.str_len + 1;
-
- StringIter it_first (std::size_t (first) >= s_str.size () ?
- s_str.end () : s_str.begin () + first);
- StringIter it_last (std::size_t (last) >= s_str.size () ?
- s_str.end () : s_str.begin () + last);
-
- const std::size_t size = s_str.size ();
- const std::size_t capacity = s_str.capacity ();
- const ConstStringIter sbegin = s_str.begin ();
+ // compute the offset and the extent (the number of elements)
+ // of the first range into the string object being modified
+ const std::size_t size1 = str_len;
+ const std::size_t off1 =
+ std::size_t (cs.off) < size1 ? std::size_t (cs.off) : size1;
+ const std::size_t ext1 =
+ off1 + cs.size < size1 ? cs.size : size1 - off1;
+
+ // create a pair of iterators into the string object being
+ // modified (used only by the iterator overloads)
+ const StringIter it_first (s_str.begin () + off1);
+ const StringIter it_last (it_first + ext1);
#ifndef _RWSTD_NO_EXCEPTIONS
@@ -336,26 +349,30 @@
#else // if defined (_RWSTD_NO_EXCEPTIONS)
- if (cs.bthrow)
+ if (cs.bthrow) {
+ if (wres != wres_buf)
+ delete[] wres;
+
return;
+ }
#endif // _RWSTD_NO_EXCEPTIONS
try {
switch (which) {
case Erase (void): {
- const TestString& s_res = s_str.erase ();
+ const String& s_res = s_str.erase ();
res_off = &s_res - &s_str;
break;
}
case Erase (size): {
- const TestString& s_res = s_str.erase (cs.off);
+ const String& s_res = s_str.erase (cs.off);
res_off = &s_res - &s_str;
break;
}
case Erase (size_size): {
- const TestString& s_res = s_str.erase (cs.off, cs.size);
+ const String& s_res = s_str.erase (cs.off, cs.size);
res_off = &s_res - &s_str;
break;
}
@@ -391,35 +408,35 @@
"difference with begin is %td",
__LINE__, res_iter - begin);
- if (std::size_t (cs.off) >= cs.nres) {
+ if (std::size_t (cs.off) >= res_len) {
rw_assert (res_iter == end, 0, cs.line,
"line %d. %{$FUNCALL} != end()", __LINE__);
}
else {
const std::size_t match =
- rw_match (cs.res + cs.off, &(*res_iter), 1);
+ rw_match (res_char + cs.off, &(*res_iter), 1);
rw_assert (1 == match, 0, cs.line,
- "line %d. %{$FUNCALL} == %#c, got %#c",
- __LINE__, cs.res[cs.off], *res_iter);
+ "line %d. %{$FUNCALL} == %{#c}, got %{#c}",
+ __LINE__, res_char[cs.off], *res_iter);
}
}
// verfiy that strings length are equal
- rw_assert (cs.nres == s_str.size (), 0, cs.line,
+ rw_assert (res_len == s_str.size (), 0, cs.line,
"line %d. %{$FUNCALL} expected %{#*s} with length "
"%zu, got %{/*.*Gs} with length %zu",
__LINE__, int (cs.nres), cs.res,
- cs.nres, int (sizeof (charT)),
+ res_len, int (sizeof (charT)),
int (s_str.size ()), s_str.c_str (), s_str.size ());
- if (cs.nres == s_str.size ()) {
+ if (res_len == s_str.size ()) {
// if the result length matches the expected length
// (and only then), also verify that the modified
// string matches the expected result
const std::size_t match =
rw_match (cs.res, s_str.c_str(), cs.nres);
- rw_assert (match == cs.nres, 0, cs.line,
+ rw_assert (match == res_len, 0, cs.line,
"line %d. %{$FUNCALL} expected %{#*s}, "
"got %{/*.*Gs}, difference at offset %zu",
__LINE__, int (cs.nres), cs.res,
@@ -452,32 +469,20 @@
__LINE__, 0 != expected, expected, caught);
}
- if (caught) {
- // verify that an exception thrown during allocation
- // didn't cause a change in the state of the object
+#endif // _RWSTD_NO_EXCEPTIONS
- rw_assert (s_str.size () == size, 0, cs.line,
- "line %d: %{$FUNCALL}: size unexpectedly changed "
- "from %zu to %zu after an exception",
- __LINE__, size, s_str.size ());
-
- rw_assert (s_str.capacity () == capacity, 0, cs.line,
- "line %d: %{$FUNCALL}: capacity unexpectedly "
- "changed from %zu to %zu after an exception",
- __LINE__, capacity, s_str.capacity ());
-
- rw_assert (s_str.begin () == sbegin, 0, cs.line,
- "line %d: %{$FUNCALL}: begin() unexpectedly "
- "changed from after an exception by %d",
- __LINE__, s_str.begin () - sbegin);
+ if (caught) {
+ // verify that an exception thrown during allocation
+ // didn't cause a change in the state of the object
+ str_state.assert_equal (rw_get_string_state (s_str),
+ __LINE__, cs.line, caught);
}
-#else // if defined (_RWSTD_NO_EXCEPTIONS)
+ if (res_char != wres_charbuf)
+ delete[] res_char;
- _RWSTD_UNUSED (size);
- _RWSTD_UNUSED (capacity);
-
-#endif // _RWSTD_NO_EXCEPTIONS
+ if (wres != wres_buf)
+ delete[] wres;
}
/**************************************************************************/
Modified: incubator/stdcxx/trunk/tests/strings/21.string.find.cpp
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/strings/21.string.find.cpp?rev=406581&r1=406580&r2=406581&view=diff
==============================================================================
--- incubator/stdcxx/trunk/tests/strings/21.string.find.cpp (original)
+++ incubator/stdcxx/trunk/tests/strings/21.string.find.cpp Mon May 15 01:14:29 2006
@@ -31,15 +31,12 @@
#include <21.strings.h> // for StringMembers
#include <driver.h> // for rw_assert()
-#include <rw_char.h> // for rw_widen()
+#include <rw_char.h> // for rw_expand()
/**************************************************************************/
// for convenience and brevity
-
#define NPOS _RWSTD_SIZE_MAX
-#define LSTR StringMembers::long_string
-#define LLEN StringMembers::long_string_len
#define Find(which) StringMembers::find_ ## which
typedef StringMembers::OverloadId OverloadId;
@@ -117,17 +114,17 @@
TEST ("aaaaaaaaaa", "aaaaaaaaa", 0),
TEST ("aaaaaaaaa", "aaaaaaaaaa", NPOS),
- TEST (LSTR, "", 0),
- TEST (LSTR, "a", NPOS),
- TEST (LSTR, "x", 0),
- TEST (LSTR, "xxx", 0),
- TEST (LSTR, "xxa", NPOS),
- TEST ("abc", LSTR, NPOS),
- TEST ("xxxxxxxxxx", LSTR, NPOS),
+ TEST ("x@4096", "", 0),
+ TEST ("x@4096", "a", NPOS),
+ TEST ("x@4096", "x", 0),
+ TEST ("x@4096", "xxx", 0),
+ TEST ("x@4096", "xxa", NPOS),
+ TEST ("abc", "x@4096", NPOS),
+ TEST ("xxxxxxxxxx", "x@4096", NPOS),
TEST ("abcdefghij", 0, 0),
TEST ("\0cb\0\0ge", 0, 0),
- TEST (LSTR, 0, 0),
+ TEST ("x@4096", 0, 0),
TEST ("last test", "test", 5)
};
@@ -202,17 +199,17 @@
TEST ("aaaaaaaaaa", "aaaaaaaaa", 0),
TEST ("aaaaaaaaa", "aaaaaaaaaa", NPOS),
- TEST (LSTR, "", 0),
- TEST (LSTR, "a", NPOS),
- TEST (LSTR, "x", 0),
- TEST (LSTR, "xxx", 0),
- TEST (LSTR, "xxa", NPOS),
- TEST ("abc", LSTR, NPOS),
- TEST ("xxxxxxxxxx", LSTR, NPOS),
+ TEST ("x@4096", "", 0),
+ TEST ("x@4096", "a", NPOS),
+ TEST ("x@4096", "x", 0),
+ TEST ("x@4096", "xxx", 0),
+ TEST ("x@4096", "xxa", NPOS),
+ TEST ("abc", "x@4096", NPOS),
+ TEST ("xxxxxxxxxx", "x@4096", NPOS),
TEST ("abcdefghij", 0, 0),
TEST ("\0cb\0\0ge", 0, 0),
- TEST (LSTR, 0, 0),
+ TEST ("x@4096", 0, 0),
TEST ("last test", "test", 5)
};
@@ -293,22 +290,22 @@
TEST ("aaaaaaaaaa", "aaaaaaaaa", 2, NPOS),
TEST ("aaaaaaaaa", "aaaaaaaaaa", 0, NPOS),
- TEST (LSTR, "", 0, 0),
- TEST (LSTR, "a", 0, NPOS),
- TEST (LSTR, "x", 0, 0),
- TEST (LSTR, "xxx", 10, 10),
- TEST (LSTR, "xxa", 10, NPOS),
- TEST ("abc", LSTR, 2, NPOS),
- TEST ("xxxxxxxxxx", LSTR, 0, NPOS),
+ TEST ("x@4096", "", 0, 0),
+ TEST ("x@4096", "a", 0, NPOS),
+ TEST ("x@4096", "x", 0, 0),
+ TEST ("x@4096", "xxx", 10, 10),
+ TEST ("x@4096", "xxa", 10, NPOS),
+ TEST ("abc", "x@4096", 2, NPOS),
+ TEST ("xxxxxxxxxx", "x@4096", 0, NPOS),
- TEST (LSTR, "xxx", LLEN - 4, LLEN - 4),
- TEST (LSTR, "xxx", LLEN - 3, NPOS),
+ TEST ("x@4096", "xxx", 4092, 4092),
+ TEST ("x@4096", "xxx", 4094, NPOS),
TEST ("abcdefghij", 0, 0, 0),
TEST ("abcdefghij", 0, 1, NPOS),
TEST ("\0cb\0\0ge", 0, 5, 5),
- TEST (LSTR, 0, 0, 0),
- TEST (LSTR, 0, 1, NPOS),
+ TEST ("x@4096", 0, 0, 0),
+ TEST ("x@4096", 0, 1, NPOS),
TEST ("", "", 1, NPOS),
TEST ("abcdefghij", "abc", 10, NPOS),
@@ -410,27 +407,27 @@
TEST ("aaaaaaaaa", "aaaaaaaaaa", 0, 10, NPOS),
TEST ("aaaaaaaaa", "aaaaaaaaaa", 0, 7, 0),
- TEST (LSTR, "", 0, 0, 0),
- TEST (LSTR, "a", 0, 1, NPOS),
- TEST (LSTR, "x", 0, 1, 0),
- TEST (LSTR, "xxx", 10, 3, 10),
- TEST (LSTR, "xxa", 10, 3, NPOS),
- TEST (LSTR, "xxa", 10, 2, 10),
- TEST ("abc", LSTR, 2, 10, NPOS),
- TEST ("xxxxxxxxxx", LSTR, 0, LLEN - 1, NPOS),
- TEST ("xxxxxxxxxx", LSTR, 2, 4, 2),
-
- TEST (LSTR, "xxx", LLEN - 4, 3, LLEN - 4),
- TEST (LSTR, "xxx", LLEN - 3, 3, NPOS),
- TEST (LSTR, "xxx", LLEN - 3, 2, LLEN - 3),
-
- TEST ("abcdefghij", 0, 0, 9, 0),
- TEST ("abcdefghij", 0, 1, 9, NPOS),
- TEST ("\0cb\0\0ge", 0, 5, 7, NPOS),
- TEST ("\0cb\0ge\0", 0, 6, 1, 6),
- TEST (LSTR, 0, 0, LLEN - 1, 0),
- TEST (LSTR, 0, 1, LLEN - 1, NPOS),
- TEST (LSTR, 0, 5, LLEN - 6, 5),
+ TEST ("x@4096", "", 0, 0, 0),
+ TEST ("x@4096", "a", 0, 1, NPOS),
+ TEST ("x@4096", "x", 0, 1, 0),
+ TEST ("x@4096", "xxx", 10, 3, 10),
+ TEST ("x@4096", "xxa", 10, 3, NPOS),
+ TEST ("x@4096", "xxa", 10, 2, 10),
+ TEST ("abc", "x@4096", 2, 10, NPOS),
+ TEST ("xxxxxxxxxx", "x@4096", 0, 4096, NPOS),
+ TEST ("xxxxxxxxxx", "x@4096", 2, 4, 2),
+
+ TEST ("x@4096", "xxx", 4093, 3, 4093),
+ TEST ("x@4096", "xxx", 4094, 3, NPOS),
+ TEST ("x@4096", "xxx", 4094, 2, 4094),
+
+ TEST ("abcdefghij", 0, 0, 9, 0),
+ TEST ("abcdefghij", 0, 1, 9, NPOS),
+ TEST ("\0cb\0\0ge", 0, 5, 7, NPOS),
+ TEST ("\0cb\0ge\0", 0, 6, 1, 6),
+ TEST ("x@4096", 0, 0, 4096, 0),
+ TEST ("x@4096", 0, 1, 4096, NPOS),
+ TEST ("x@4096", 0, 5, 4091, 5),
TEST ("", "", 1, 0, NPOS),
TEST ("abcdefghij", "abc", 10, 3, NPOS),
@@ -439,8 +436,8 @@
// excercise strictly undefined behavior
TEST ("", "cba", 0, -1, NPOS),
TEST ("abcdefghij", "cba", 0, -1, NPOS),
- TEST (LSTR, "xxx", 0, -1, NPOS),
- TEST ("abcdefghij", LSTR, 0, -1, NPOS),
+ TEST ("x@4096", "xxx", 0, -1, NPOS),
+ TEST ("abcdefghij", "x@4096", 0, -1, NPOS),
TEST ("last test", "test", 0, 4, 5)
};
@@ -517,23 +514,23 @@
TEST ("aaaaaaaaaa", "aaaaaaaaa", 2, NPOS),
TEST ("aaaaaaaaa", "aaaaaaaaaa", 0, NPOS),
- TEST (LSTR, "", 0, 0),
- TEST (LSTR, "a", 0, NPOS),
- TEST (LSTR, "x", 0, 0),
- TEST (LSTR, "xxx", 10, 10),
- TEST (LSTR, "xxa", 10, NPOS),
- TEST ("abc", LSTR, 2, NPOS),
- TEST ("xxxxxxxxxx", LSTR, 0, NPOS),
+ TEST ("x@4096", "", 0, 0),
+ TEST ("x@4096", "a", 0, NPOS),
+ TEST ("x@4096", "x", 0, 0),
+ TEST ("x@4096", "xxx", 10, 10),
+ TEST ("x@4096", "xxa", 10, NPOS),
+ TEST ("abc", "x@4096", 2, NPOS),
+ TEST ("xxxxxxxxxx", "x@4096", 0, NPOS),
- TEST (LSTR, "xxx", LLEN - 4, LLEN - 4),
- TEST (LSTR, "xxx", LLEN - 3, NPOS),
+ TEST ("x@4096", "xxx", 4093, 4093),
+ TEST ("x@4096", "xxx", 4094, NPOS),
TEST ("abcdefghij", 0, 0, 0),
TEST ("abcdefghij", 0, 1, NPOS),
TEST ("\0cb\0\0ge", 0, 5, NPOS),
TEST ("\0cb\0\0ge", 0, 0, 0),
- TEST (LSTR, 0, 0, 0),
- TEST (LSTR, 0, 1, NPOS),
+ TEST ("x@4096", 0, 0, 0),
+ TEST ("x@4096", 0, 1, NPOS),
TEST ("", "", 1, NPOS),
TEST ("abcdefghij", "abc", 10, NPOS),
@@ -577,9 +574,9 @@
TEST ("\0cbge\0\0", 'b', 2),
TEST ("\0cbge\0\0", 'a', NPOS),
- TEST (LSTR, 'x', 0),
- TEST (LSTR, '\0', NPOS),
- TEST (LSTR, 'a', NPOS),
+ TEST ("x@4096", 'x', 0),
+ TEST ("x@4096", '\0', NPOS),
+ TEST ("x@4096", 'a', NPOS),
TEST ("last test", 't', 3)
};
@@ -628,12 +625,13 @@
TEST ("\0bgeb\0\0", 'b', 2, 4),
TEST ("\0cbge\0\0", 'a', 1, NPOS),
- TEST (LSTR, 'x', 0, 0),
- TEST (LSTR, 'x', 5, 5),
- TEST (LSTR, '\0', 0, NPOS),
- TEST (LSTR, 'a', 3, NPOS),
- TEST (LSTR, 'x', LLEN - 1, NPOS),
- TEST (LSTR, 'x', LLEN - 2, LLEN - 2),
+ TEST ("x@4096", 'x', 0, 0),
+ TEST ("x@4096", 'x', 5, 5),
+ TEST ("x@4096", '\0', 0, NPOS),
+ TEST ("x@2048\0xxx",'\0', 0, 2048),
+ TEST ("x@4096", 'a', 3, NPOS),
+ TEST ("x@4096", 'x', 4096, NPOS),
+ TEST ("x@4096", 'x', 4095, 4095),
TEST ("last test", 't', 0, 3)
};
@@ -646,17 +644,31 @@
const TestCase &tcase)
{
typedef std::allocator<charT> Allocator;
- typedef std::basic_string <charT, Traits, Allocator> TestString;
- typedef typename TestString::const_iterator ConstStringIter;
+ typedef std::basic_string <charT, Traits, Allocator> String;
+
+ static const std::size_t BUFSIZE = 256;
+
+ static charT wstr_buf [BUFSIZE];
+ static charT warg_buf [BUFSIZE];
+
+ std::size_t str_len = sizeof wstr_buf / sizeof *wstr_buf;
+ std::size_t arg_len = sizeof warg_buf / sizeof *warg_buf;
+
+ charT* wstr = rw_expand (wstr_buf, tcase.str, tcase.str_len, &str_len);
+ charT* warg = rw_expand (warg_buf, tcase.arg, tcase.arg_len, &arg_len);
+
+ // construct the string object and the argument string
+ const String s_str (wstr, str_len);
+ const String s_arg (warg, arg_len);
- static charT wstr [LLEN];
- static charT warg [LLEN];
+ if (wstr != wstr_buf)
+ delete[] wstr;
- rw_widen (wstr, tcase.str, tcase.str_len);
- rw_widen (warg, tcase.arg, tcase.arg_len);
+ if (warg != warg_buf)
+ delete[] warg;
- const TestString s_str (wstr, tcase.str_len);
- const TestString s_arg (warg, tcase.arg_len);
+ wstr = 0;
+ warg = 0;
// save the state of the string object before the call
// to detect wxception safety violations (changes to
@@ -664,10 +676,11 @@
const StringState str_state (rw_get_string_state (s_str));
std::size_t res = 0;
- std::size_t exp_res = NPOS != tcase.nres ? tcase.nres : TestString::npos;
+ std::size_t exp_res = NPOS != tcase.nres ? tcase.nres : String::npos;
- const charT* const ptr_arg = tcase.arg ? warg : s_str.c_str ();
- const TestString& str_arg = tcase.arg ? s_arg : s_str;
+ // string function argument
+ const charT* const arg_ptr = tcase.arg ? s_arg.c_str () : s_str.c_str ();
+ const String& arg_str = tcase.arg ? s_arg : s_str;
const charT arg_val = make_char (char (tcase.val), (charT*)0);
std::size_t size = tcase.size >= 0 ? tcase.size : s_arg.max_size () + 1;
@@ -688,27 +701,27 @@
try {
switch (which) {
case Find (ptr): {
- res = s_str.find (ptr_arg);
+ res = s_str.find (arg_ptr);
break;
}
case Find (str): {
- res = s_str.find (str_arg);
+ res = s_str.find (arg_str);
break;
}
case Find (ptr_size): {
- res = s_str.find (ptr_arg, tcase.off);
+ res = s_str.find (arg_ptr, tcase.off);
break;
}
case Find (ptr_size_size): {
- res = s_str.find (ptr_arg, tcase.off, size);
+ res = s_str.find (arg_ptr, tcase.off, size);
break;
}
case Find (str_size): {
- res = s_str.find (str_arg, tcase.off);
+ res = s_str.find (arg_str, tcase.off);
break;
}
@@ -732,7 +745,7 @@
"line %d. %{$FUNCALL} == %{?}%zu%{;}%{?}npos%{;}, "
"got %{?}%zu%{;}%{?}npos%{;}",
__LINE__, NPOS != tcase.nres, exp_res, NPOS == tcase.nres,
- TestString::npos != res, res, TestString::npos == res);
+ String::npos != res, res, String::npos == res);
}
#ifndef _RWSTD_NO_EXCEPTIONS