111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//                     The LLVM Compiler Infrastructure
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details.
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <locale>
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// template <class charT> class ctype_byname;
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// bool is(mask m, charT c) const;
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// REQUIRES: locale.en_US.UTF-8
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <locale>
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <type_traits>
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert>
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "platform_support.h" // locale name macros
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main()
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        std::locale l(LOCALE_en_US_UTF_8);
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            typedef std::ctype<wchar_t> F;
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            const F& f = std::use_facet<F>(l);
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::space, L' '));
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::space, L'A'));
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::print, L' '));
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::print, L'\x07'));
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::cntrl, L'\x07'));
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::cntrl, L' '));
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::upper, L'A'));
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::upper, L'a'));
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::lower, L'a'));
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::lower, L'A'));
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::alpha, L'a'));
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::alpha, L'1'));
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::digit, L'1'));
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::digit, L'a'));
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::punct, L'.'));
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::punct, L'a'));
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::xdigit, L'a'));
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::xdigit, L'g'));
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::alnum, L'a'));
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::alnum, L'.'));
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::graph, L'.'));
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::graph,  L'\x07'));
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::alpha, L'\x00DA'));
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::upper, L'\x00DA'));
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        }
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        std::locale l("C");
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            typedef std::ctype<wchar_t> F;
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            const F& f = std::use_facet<F>(l);
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::space, L' '));
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::space, L'A'));
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::print, L' '));
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::print, L'\x07'));
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::cntrl, L'\x07'));
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::cntrl, L' '));
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::upper, L'A'));
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::upper, L'a'));
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::lower, L'a'));
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::lower, L'A'));
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::alpha, L'a'));
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::alpha, L'1'));
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::digit, L'1'));
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::digit, L'a'));
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::punct, L'.'));
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::punct, L'a'));
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::xdigit, L'a'));
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::xdigit, L'g'));
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::alnum, L'a'));
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::alnum, L'.'));
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::graph, L'.'));
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::graph,  L'\x07'));
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::alpha, L'\x00DA'));
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::upper, L'\x00DA'));
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        }
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
113