Clean up a test; get rid of hard-wired char/wchar_t code for template fns that take any char type. Prep work for PR#26503

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@260115 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Marshall Clow
2016-02-08 17:38:23 +00:00
parent 7adfa0328f
commit 5f3668d142

View File

@@ -16,79 +16,95 @@
#include <string> #include <string>
#include <cassert> #include <cassert>
#if _LIBCPP_STD_VER > 11 #include "test_macros.h"
bool is_skipws ( const std::istream *is ) { #if TEST_STD_VER > 11
return ( is->flags() & std::ios_base::skipws ) != 0;
template <class CharT, class Traits>
bool is_skipws ( const std::basic_istream<CharT, Traits>& is ) {
return ( is.flags() & std::ios_base::skipws ) != 0;
} }
template <class CharT, class Traits = std::char_traits<CharT>>
bool is_skipws ( const std::wistream *is ) { void both_ways ( const CharT *p ) {
return ( is->flags() & std::ios_base::skipws ) != 0; std::basic_string<CharT, Traits> str(p);
}
void both_ways ( const char *p ) {
std::string str(p);
auto q = std::quoted(str); auto q = std::quoted(str);
std::stringstream ss; std::basic_stringstream<CharT, Traits> ss;
bool skippingws = is_skipws ( &ss ); bool skippingws = is_skipws ( ss );
ss << q; ss << q;
ss >> q; ss >> q;
} }
void round_trip ( const char *p ) { template <class CharT, class Traits = std::char_traits<CharT>>
std::stringstream ss; void round_trip ( const CharT *p ) {
bool skippingws = is_skipws ( &ss ); std::basic_stringstream<CharT, Traits> ss;
bool skippingws = is_skipws ( ss );
ss << std::quoted(p); ss << std::quoted(p);
std::string s; std::basic_string<CharT, Traits> s;
ss >> std::quoted(s); ss >> std::quoted(s);
assert ( s == p ); assert ( s == p );
assert ( skippingws == is_skipws ( &ss )); assert ( skippingws == is_skipws ( ss ));
} }
void round_trip_ws ( const char *p ) {
std::stringstream ss; template <class CharT, class Traits = std::char_traits<CharT>>
void round_trip_ws ( const CharT *p ) {
std::basic_stringstream<CharT, Traits> ss;
std::noskipws ( ss ); std::noskipws ( ss );
bool skippingws = is_skipws ( &ss ); bool skippingws = is_skipws ( ss );
ss << std::quoted(p); ss << std::quoted(p);
std::string s; std::basic_string<CharT, Traits> s;
ss >> std::quoted(s); ss >> std::quoted(s);
assert ( s == p ); assert ( s == p );
assert ( skippingws == is_skipws ( &ss )); assert ( skippingws == is_skipws ( ss ));
} }
void round_trip_d ( const char *p, char delim ) { template <class CharT, class Traits = std::char_traits<CharT>>
std::stringstream ss; void round_trip_d ( const CharT *p, char delim ) {
ss << std::quoted(p, delim); std::basic_stringstream<CharT, Traits> ss;
std::string s; CharT d{delim};
ss >> std::quoted(s, delim);
ss << std::quoted(p, d);
std::basic_string<CharT, Traits> s;
ss >> std::quoted(s, d);
assert ( s == p ); assert ( s == p );
} }
void round_trip_e ( const char *p, char escape ) { template <class CharT, class Traits = std::char_traits<CharT>>
std::stringstream ss; void round_trip_e ( const CharT *p, char escape ) {
ss << std::quoted(p, '"', escape ); std::basic_stringstream<CharT, Traits> ss;
std::string s; CharT e{escape};
ss >> std::quoted(s, '"', escape );
ss << std::quoted(p, CharT('"'), e );
std::basic_string<CharT, Traits> s;
ss >> std::quoted(s, CharT('"'), e );
assert ( s == p ); assert ( s == p );
} }
template <class CharT, class Traits = std::char_traits<CharT>>
std::string quote ( const char *p, char delim='"', char escape='\\' ) { std::basic_string<CharT, Traits> quote ( const CharT *p, char delim='"', char escape='\\' ) {
std::stringstream ss; std::basic_stringstream<CharT, Traits> ss;
ss << std::quoted(p, delim, escape); CharT d{delim};
std::string s; CharT e{escape};
ss << std::quoted(p, d, e);
std::basic_string<CharT, Traits> s;
ss >> s; // no quote ss >> s; // no quote
return s; return s;
} }
std::string unquote ( const char *p, char delim='"', char escape='\\' ) { template <class CharT, class Traits = std::char_traits<CharT>>
std::stringstream ss; std::basic_string<CharT, Traits> unquote ( const CharT *p, char delim='"', char escape='\\' ) {
std::basic_stringstream<CharT, Traits> ss;
ss << p; ss << p;
std::string s;
ss >> std::quoted(s, delim, escape); CharT d{delim};
CharT e{escape};
std::basic_string<CharT, Traits> s;
ss >> std::quoted(s, d, e);
return s; return s;
} }
@@ -107,61 +123,6 @@ void test_padding () {
} }
void round_trip ( const wchar_t *p ) {
std::wstringstream ss;
bool skippingws = is_skipws ( &ss );
ss << std::quoted(p);
std::wstring s;
ss >> std::quoted(s);
assert ( s == p );
assert ( skippingws == is_skipws ( &ss ));
}
void round_trip_ws ( const wchar_t *p ) {
std::wstringstream ss;
std::noskipws ( ss );
bool skippingws = is_skipws ( &ss );
ss << std::quoted(p);
std::wstring s;
ss >> std::quoted(s);
assert ( s == p );
assert ( skippingws == is_skipws ( &ss ));
}
void round_trip_d ( const wchar_t *p, wchar_t delim ) {
std::wstringstream ss;
ss << std::quoted(p, delim);
std::wstring s;
ss >> std::quoted(s, delim);
assert ( s == p );
}
void round_trip_e ( const wchar_t *p, wchar_t escape ) {
std::wstringstream ss;
ss << std::quoted(p, wchar_t('"'), escape );
std::wstring s;
ss >> std::quoted(s, wchar_t('"'), escape );
assert ( s == p );
}
std::wstring quote ( const wchar_t *p, wchar_t delim='"', wchar_t escape='\\' ) {
std::wstringstream ss;
ss << std::quoted(p, delim, escape);
std::wstring s;
ss >> s; // no quote
return s;
}
std::wstring unquote ( const wchar_t *p, wchar_t delim='"', wchar_t escape='\\' ) {
std::wstringstream ss;
ss << p;
std::wstring s;
ss >> std::quoted(s, delim, escape);
return s;
}
int main() int main()
{ {
both_ways ( "" ); // This is a compilation check both_ways ( "" ); // This is a compilation check