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#include <locale>
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <type_traits>
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert>
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "platform_support.h" // locale name macros
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main()
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        std::locale l(LOCALE_en_US_UTF_8);
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            typedef std::ctype<wchar_t> F;
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            const F& f = std::use_facet<F>(l);
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::space, L' '));
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::space, L'A'));
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::print, L' '));
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::print, L'\x07'));
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::cntrl, L'\x07'));
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::cntrl, L' '));
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::upper, L'A'));
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::upper, L'a'));
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::lower, L'a'));
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::lower, L'A'));
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::alpha, L'a'));
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::alpha, L'1'));
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::digit, L'1'));
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::digit, L'a'));
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::punct, L'.'));
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::punct, L'a'));
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::xdigit, L'a'));
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::xdigit, L'g'));
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::alnum, L'a'));
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::alnum, L'.'));
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::graph, L'.'));
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::graph,  L'\x07'));
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::alpha, L'\x00DA'));
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::upper, L'\x00DA'));
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        }
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        std::locale l("C");
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        {
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            typedef std::ctype<wchar_t> F;
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            const F& f = std::use_facet<F>(l);
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::space, L' '));
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::space, L'A'));
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::print, L' '));
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::print, L'\x07'));
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::cntrl, L'\x07'));
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::cntrl, L' '));
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::upper, L'A'));
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::upper, L'a'));
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::lower, L'a'));
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::lower, L'A'));
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::alpha, L'a'));
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::alpha, L'1'));
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::digit, L'1'));
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::digit, L'a'));
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::punct, L'.'));
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::punct, L'a'));
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::xdigit, L'a'));
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::xdigit, L'g'));
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::alnum, L'a'));
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::alnum, L'.'));
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(f.is(F::graph, L'.'));
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::graph,  L'\x07'));
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::alpha, L'\x00DA'));
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert            assert(!f.is(F::upper, L'\x00DA'));
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        }
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
111