27#ifndef RW_21_STRINGS_H_INCLUDED
28#define RW_21_STRINGS_H_INCLUDED
268 MEMBER_1 (find_first_of, cstr, cptr),
270 MEMBER_1 (find_first_of, cstr, cstr),
284 MEMBER_1 (find_last_of, cstr, cptr),
286 MEMBER_1 (find_last_of, cstr, cstr),
300 MEMBER_1 (find_first_not_of, cstr, cptr),
302 MEMBER_1 (find_first_not_of, cstr, cstr),
316 MEMBER_1 (find_last_not_of, cstr, cptr),
318 MEMBER_1 (find_last_not_of, cstr, cstr),
566static const _RWSTD_SIZE_T
567NPOS = _RWSTD_SIZE_MAX;
650template <
class charT>
655 enum { BUFSIZE = 256 };
660 charT str_buf_ [BUFSIZE];
661 charT arg_buf_ [BUFSIZE];
662 charT res_buf_ [BUFSIZE];
669 typedef _RWSTD_SIZE_T SizeType;
723 if (
str_ != str_buf_)
725 if (
arg_ != arg_buf_)
727 if (
res_ != res_buf_)
745 int assert_equal (
const StringState&,
int,
int,
const char*)
const;
750template <
class String>
755 str.data (),
str.size (),
str.capacity ()
765template <
class String>
790#ifndef _RWSTD_NO_DEBUG_ITER
810 return str.rbegin ();
815 return str.rbegin ();
820 RW_ASSERT (!
"logic error: should be never called");
827#define Disabled(which) \
828 StringIds::opt_memfun_disabled [which & ~StringIds::fid_mask]
831#ifndef _RWSTD_NO_WCHAR_T
832# define TEST_DISPATCH(Alloc, fname, func, tcase) \
833 if (StringIds::DefaultTraits == func.traits_id_) { \
834 if (StringIds::Char == func.char_id_) \
835 fname (char (), (std::char_traits<char>*)0, \
836 (Alloc<char>*)0, func, tcase); \
837 else if (StringIds::WChar == func.char_id_) \
838 fname (wchar_t (), (std::char_traits<wchar_t>*)0, \
839 (Alloc<wchar_t>*)0, func, tcase); \
842 "%{$CLASS} tests not implemented"); \
845 if (StringIds::Char == func.char_id_) \
846 fname (char (), (UserTraits<char>*)0, \
847 (Alloc<char>*)0, func, tcase); \
848 else if (StringIds::WChar == func.char_id_) \
849 fname (wchar_t (), (UserTraits<wchar_t>*)0, \
850 (Alloc<wchar_t>*)0, func, tcase); \
852 fname (UserChar (), (UserTraits<UserChar>*)0, \
853 (Alloc<UserChar>*)0, func, tcase); \
858# define TEST_DISPATCH(Alloc, fname, func, tcase) \
859 if (StringIds::DefaultTraits == func.traits_id_) { \
860 if (StringIds::Char == func.char_id_) \
861 fname (char (), (std::char_traits<char>*)0, \
862 (Alloc<char>*)0, func, tcase); \
863 else if (StringIds::WChar == func.char_id_) \
864 RW_ASSERT (!"logic error: wchar_t disabled"); \
867 "%{$CLASS} tests not implemented"); \
871 if (StringIds::Char == func.char_id_) \
872 fname (char (), (UserTraits<char>*)0, \
873 (Alloc<char>*)0, func, tcase); \
874 else if (StringIds::WChar == func.char_id_) \
875 RW_ASSERT (!"logic error: wchar_t disabled"); \
876 else if (StringIds::UChar == func.char_id_) \
877 fname (UserChar (), (UserTraits<UserChar>*)0, \
878 (Alloc<UserChar>*)0, func, tcase); \
885#define DEFINE_STRING_TEST_DISPATCH(fname) \
887 fname (const StringFunc &func, \
888 const StringTestCase &tcase) { \
889 if (StringIds::DefaultAlloc == func.alloc_id_) { \
890 TEST_DISPATCH (std::allocator, fname, func, tcase); \
892 else if (StringIds::UserAlloc == func.alloc_id_) { \
893 TEST_DISPATCH (UserAlloc, fname, func, tcase); \
896 RW_ASSERT (!"logic error: bad allocator"); \
897 } typedef void rw_unused_typedef
900#define TFUNC(charT, Traits, Allocator) \
901 void (*)(charT*, Traits<charT>*, Allocator<charT>*, \
902 const StringTestCaseData<charT>&)
904#define TFUNC_ADDR(fname, charT, Traits, Allocator) \
905 (VoidFunc*)(TFUNC (charT, Traits, Allocator)) \
906 &fname<charT, Traits<charT>, Allocator<charT> >
908#ifndef _RWSTD_NO_WCHAR_T
909# define DEFINE_STRING_TEST_FUNCTIONS(fname) \
910 static VoidFunc* const fname ## _func_array [] = { \
911 TFUNC_ADDR (fname, char, std::char_traits, std::allocator), \
912 TFUNC_ADDR (fname, char, std::char_traits, UserAlloc), \
913 TFUNC_ADDR (fname, char, UserTraits, std::allocator), \
914 TFUNC_ADDR (fname, char, UserTraits, UserAlloc), \
916 TFUNC_ADDR (fname, wchar_t, std::char_traits, std::allocator), \
917 TFUNC_ADDR (fname, wchar_t, std::char_traits, UserAlloc), \
918 TFUNC_ADDR (fname, wchar_t, UserTraits, std::allocator), \
919 TFUNC_ADDR (fname, wchar_t, UserTraits, UserAlloc), \
923 TFUNC_ADDR (fname, UserChar, UserTraits, std::allocator), \
924 TFUNC_ADDR (fname, UserChar, UserTraits, UserAlloc) \
928# define DEFINE_STRING_TEST_FUNCTIONS(fname) \
929 static VoidFunc* const fname ## _func_array [] = { \
930 TFUNC_ADDR (fname, char, std::char_traits, std::allocator), \
931 TFUNC_ADDR (fname, char, std::char_traits, UserAlloc), \
932 TFUNC_ADDR (fname, char, UserTraits, std::allocator), \
933 TFUNC_ADDR (fname, char, UserTraits, UserAlloc), \
942 TFUNC_ADDR (fname, UserChar, UserTraits, std::allocator), \
943 TFUNC_ADDR (fname, UserChar, UserTraits, UserAlloc) \
char * append(char *dst, const char *src)
#define _RWSTD_CONST_CAST(T, x)
StringTestCaseData(const StringFunc &func, const StringTestCase &tcase)
const StringTestCase & tcase_
_TEST_EXPORT char * rw_expand(char *, const char *, _RWSTD_SIZE_T=_RWSTD_SIZE_MAX, _RWSTD_SIZE_T *=0)
#define NON_MEMBER_3(f, a, b, c)
_TEST_EXPORT void rw_setvars(const StringFunc &, const StringTestCase *=0)
void StringTestFunc(const StringFunc &, const StringTestCase &)
StringState rw_get_string_state(const String &str)
_TEST_EXPORT int rw_run_string_test(int, char **, const char *, const char *, StringTestFunc *, const StringTest *, _RWSTD_SIZE_T)
String::iterator StringIter
static StringIter begin(String &str, StringIter *)
static StringPtr begin(String &str, StringPtr *)
static StringConstRevIter begin(const String &str, StringConstRevIter *)
static StringConstIter begin(const String &str, StringConstIter *)
String::const_pointer StringConstPtr
String::const_iterator StringConstIter
String::reverse_iterator StringRevIter
static StringRevIter begin(String &str, StringRevIter *)
String::pointer StringPtr
String::const_reverse_iterator StringConstRevIter
String::value_type StringChar
virtual String & operator()(String &str, const StringTestCaseData< StringChar > &) const
static StringConstPtr begin(const String &str, StringConstPtr *)
StringIds::TraitsId traits_id_
StringIds::OverloadId which_
StringIds::AllocId alloc_id_
StringIds::CharId char_id_
StringIds::IteratorId iter_id_
static ArgId arg_type(OverloadId id, int argno)
const StringTestCase * cases
StringIds::OverloadId which
Helper class for suppressing move-construction in single-argument array constructors.