54 typedef std::ctype<charT>
Base;
66 if (
m & std::ctype_base::space)
68 return Base::is (
m,
c);
75 return Base::do_is (lo, hi,
m);
86 table_ [
i] = std::ctype_base::mask ();
88 typedef unsigned char UChar;
101template <
class charT,
class Traits>
104 typedef std::basic_streambuf<charT, Traits>
Base;
131 return this->eback ();
135 return this->gptr ();
139 return this->egptr ();
144 return Base::sync ();
148 if (this->gptr () ==
end_)
149 return traits_type::eof ();
153#ifndef _RWSTD_NO_EXCEPTIONS
159 return traits_type::eof ();
166 return traits_type::eof ();
168 this->setg (this->eback (), this->gptr (), this->gptr () + 1);
169 return traits_type::to_int_type (*this->gptr ());
175template <
class charT,
class Traits>
182 std::size_t cbuf_size,
183 std::ios_base::iostate state,
188 typedef std::basic_istream<charT, Traits> Istream;
189 typedef typename Istream::sentry Sentry;
201 const std::size_t err_after =
j % (cbuf_size - 1);
202 const char *err_type;
204 if (
j < cbuf_size - 1) {
208 sb.throw_after_ = int (err_after);
215 sb.fail_after_ = int (err_after);
216 err_type =
"returned EOF";
228 is.setf (std::ios_base::skipws);
230 is.unsetf (std::ios_base::skipws);
233 const std::locale
loc = is.imbue (std::locale (is.getloc (), &ctp));
244 const int extract = is.good () && white == cbuf [0] ? int (err_after) : 0;
246#ifndef _RWSTD_NO_EXCEPTIONS
252 if (err_after % 2 && !is.bad ())
253 is.exceptions (std::ios_base::badbit);
266 "%u. std::ws (basic_istream<%s, %s >&);"
267 " threw exception of unexpected type",
277 "%u. std::ws (basic_istream<%s, %s>&);"
278 " unexpectedly propagated exception",
291 rw_assert (cbuf + extract ==
sb.pubgptr (), 0, __LINE__,
292 "%u. std::ws (basic_istream<%s, %s>&);"
293 " expected to extract %d "
294 "whitespace chars ('%c') from %{*Ac}, "
295 "extracted %u; initial rdstate() = %{Is}, "
296 "is.flags() & ios::skipws = %d, "
297 "underflow %s at extraction %u",
298 iter, cname, tname, extract, (
char)(white),
299 int (
sizeof *cbuf), cbuf,
300 sb.pubgptr () -
sb.pubeback (), state,
301 skipws, err_type, err_after);
306 rw_assert (0 == is.gcount (), 0, __LINE__,
307 "%u. std::ws (basic_istream<%s, %s >&)."
308 "gcount() == %d, got %d; whitespace is"
309 " '%c', input is %{*Ac}, initial rdstate() = %{Is}, "
310 "flags() & ios::skipws = %d,"
311 " underflow %s at extraction %u",
312 iter, cname, tname, extract, is.gcount (),
313 (
char)(white), int (
sizeof *cbuf), cbuf, state,
314 skipws, err_type, err_after);
321 std::ios_base::iostate expect_state = state;
325 expect_state |= std::ios_base::failbit;
327 else if (white == cbuf [0] || !err_after) {
329#ifndef _RWSTD_NO_EXCEPTIONS
336 if (
j < cbuf_size - 1)
337 expect_state = std::ios_base::badbit;
339 expect_state = std::ios_base::eofbit;
343 expect_state = std::ios_base::eofbit;
348 rw_assert (is.rdstate () == expect_state, 0, __LINE__,
349 "%u. std::ws (basic_istream<%s, %s >&)."
350 "rdstate() == %{Is}, got %{Is}; "
351 "extracting whitespace ('%c') from %{*Ac}, "
352 "extracted %u; initial is.rdstate() = %{Is}, "
353 "is.flags() & ios::skipws = %d, underflow %s "
356 expect_state, is.rdstate(),
357 (
char)(white), int (
sizeof *cbuf), cbuf,
358 sb.pubgptr () -
sb.pubeback (), state,
359 skipws, err_type, err_after);
365template <
class charT,
class Traits>
368 rw_info (0, 0, __LINE__,
"std::basic_istream<%s, %s>& "
369 "std::ws (std::basic_istream<%1$s, %2$s>&)",
372 const charT cbuf[] = {
'a',
'a',
'a',
'\0' };
373 const std::size_t cbuf_size =
sizeof cbuf /
sizeof *cbuf;
375 const std::ios_base::iostate
states[] = {
376 std::ios_base::badbit,
377 std::ios_base::eofbit,
378 std::ios_base::failbit,
379 std::ios_base::goodbit,
380 std::ios_base::badbit | std::ios_base::eofbit,
381 std::ios_base::badbit | std::ios_base::failbit,
382 std::ios_base::eofbit | std::ios_base::failbit,
383 std::ios_base::badbit | std::ios_base::eofbit | std::ios_base::failbit
391 std::size_t iter = 0;
400 for (std::size_t
j = 0;
j != 2 * cbuf_size - 1; ++
j) {
403 for (std::size_t
k = 0;
k != 2; ++
k ) {
409 cbuf, cbuf_size,
states [
i],
j, !!
k, wc);
423static int opt_char_traits;
424static int opt_user_traits;
430#define TEST(charT, Traits) \
431 test_ws ((charT*)0, (Traits*)0, #charT, #Traits)
433 if (
rw_note (0 <= opt_char && 0 <= opt_char_traits, 0, __LINE__,
434 "ws (basic_istream<char, char_traits<char>>) disabled"))
435 TEST (
char, std::char_traits<char>);
437 if (
rw_note (0 <= opt_char && 0 <= opt_user_traits, 0, __LINE__,
438 "ws (basic_istream<char, UserTraits<char>>) disabled"))
441#ifndef _RWSTD_NO_WCHAR_T
443 if (
rw_note (0 <= opt_wchar && 0 <= opt_char_traits, 0, __LINE__,
444 "ws (basic_istream<wchar_t, char_traits<wchar_t>>) disabled"))
445 TEST (
wchar_t, std::char_traits<wchar_t>);
447 if (
rw_note (0 <= opt_wchar && 0 <= opt_user_traits, 0, __LINE__,
448 "ws (basic_istream<wchar_t, UserTraits<wchar_t>>) disabled"))
458int main (
int argc,
char *argv[])
460 return rw_test (argc, argv, __FILE__,
void run_test(const ForwardIterator &dummy, T *, Predicate *pred)
std::char_traits< S > Traits
#define TEST(charT, Traits)
void test_ws(const Traits *, const char *cname, const char *tname, std::size_t iter, const charT *cbuf, std::size_t cbuf_size, std::ios_base::iostate state, std::size_t j, bool skipws, charT white)
const std::ios_base::iostate states[]
#define _RWSTD_SPECIALIZED_CLASS
#define _RWSTD_CONST_CAST(T, x)
_TEST_EXPORT int rw_test(int argc, char *argv[], const char *filename, const char *clause, const char *comment, int(*testfun)(int, char **), const char *optspec,...)
_TEST_EXPORT int rw_info(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_note(int, const char *, int, const char *,...)
_TEST_EXPORT int rw_assert(int, const char *, int, const char *,...)
std::ctype_base::mask table_[256]
const charT * do_is(const charT *lo, const charT *hi, std::ctype_base::mask *m) const
bool do_is(std::ctype_base::mask m, charT c) const
Ctype(std::size_t ref, charT white)
const charT * pubeback() const
std::basic_streambuf< charT, Traits > Base
const charT * pubgptr() const
Streambuf(const charT *gbeg, const charT *gend)
Base::traits_type traits_type
const charT * pubegptr() const