diff --git a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/user_defined_char_type.pass.cpp b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/user_defined_char_type.pass.cpp index d7b4b816d975b..9a4a2f0d5657e 100644 --- a/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/user_defined_char_type.pass.cpp +++ b/libcxx/test/std/localization/locale.categories/category.numeric/locale.num.get/user_defined_char_type.pass.cpp @@ -16,8 +16,6 @@ #include #include -#include "test_macros.h" - struct Char { Char() = default; Char(char c) : underlying_(c) {} @@ -73,15 +71,53 @@ struct char_traits { static int_type eof() { return char_traits::eof(); } }; +// This ctype specialization treats all characters as spaces template <> -class ctype : public locale::facet { +class ctype : public locale::facet, public ctype_base { public: + using char_type = Char; static locale::id id; - Char toupper(Char c) const { return Char(std::toupper(c.underlying_)); } - const char* widen(const char* first, const char* last, Char* dst) const { - for (; first != last;) - *dst++ = Char(*first++); - return last; + explicit ctype(std::size_t refs = 0) : locale::facet(refs) {} + + bool is(mask m, char_type) const { return m & ctype_base::space; } + const char_type* is(const char_type* low, const char_type* high, mask* vec) const { + for (; low != high; ++low) + *vec++ = ctype_base::space; + return high; + } + + const char_type* scan_is(mask m, const char_type* beg, const char_type* end) const { + for (; beg != end; ++beg) + if (this->is(m, *beg)) + return beg; + return end; + } + + const char_type* scan_not(mask m, const char_type* beg, const char_type* end) const { + for (; beg != end; ++beg) + if (!this->is(m, *beg)) + return beg; + return end; + } + + char_type toupper(char_type c) const { return c; } + const char_type* toupper(char_type*, const char_type* end) const { return end; } + + char_type tolower(char_type c) const { return c; } + const char_type* tolower(char_type*, const char_type* end) const { return end; } + + char_type widen(char c) const { return char_type(c); } + const char* widen(const char* beg, const char* end, char_type* dst) const { + for (; beg != end; ++beg, ++dst) + *dst = char_type(*beg); + return end; + } + + char narrow(char_type c, char /*dflt*/) const { return c.underlying_; } + const char_type* narrow(const char_type* beg, const char_type* end, char /*dflt*/, char* dst) const { + for (; beg != end; ++beg, ++dst) + *dst = beg->underlying_; + return end; } };