1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// -*- C++ -*-
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
3bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
4f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant//                     The LLVM Compiler Infrastructure
5bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
7b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#ifndef _LIBCPP___LOCALE
12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#define _LIBCPP___LOCALE
13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <__config>
15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <string>
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <memory>
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <utility>
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <mutex>
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cstdint>
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cctype>
21adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant#include <locale.h>
22ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
2314fa9f9d8ff5a4541404f3e23b91188e74c56f31Howard Hinnant# include <support/win32/locale_win32.h>
24be3d117702db7dc87b1ad12a365e472bb8846f89Marshall Clow#elif defined(_AIX)
257f76450ee9f14ed646a38f43a09dc49dde413281Howard Hinnant# include <support/ibm/xlocale.h>
262ef012e47441428f752c6a29d2927513669dda30Dan Albert#elif defined(__ANDROID__)
27e45cf3e8b5b03c41c5d025ad443debdcc54ab58dMarshall Clow// Android gained the locale aware functions in L (API level 21)
28e45cf3e8b5b03c41c5d025ad443debdcc54ab58dMarshall Clow# include <android/api-level.h>
29e45cf3e8b5b03c41c5d025ad443debdcc54ab58dMarshall Clow# if __ANDROID_API__ <= 20
30e45cf3e8b5b03c41c5d025ad443debdcc54ab58dMarshall Clow#  include <support/android/locale_bionic.h>
31e45cf3e8b5b03c41c5d025ad443debdcc54ab58dMarshall Clow# endif
3206086258d3d8c48a916ec51c33e1ad8f46821b81Dan Albert#elif defined(__sun__)
335cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert# include <xlocale.h>
3406086258d3d8c48a916ec51c33e1ad8f46821b81Dan Albert# include <support/solaris/xlocale.h>
3506086258d3d8c48a916ec51c33e1ad8f46821b81Dan Albert#elif defined(_NEWLIB_VERSION)
3606086258d3d8c48a916ec51c33e1ad8f46821b81Dan Albert# include <support/newlib/xlocale.h>
37e45cf3e8b5b03c41c5d025ad443debdcc54ab58dMarshall Clow#elif (defined(__GLIBC__) || defined(__APPLE__)      || defined(__FreeBSD__) \
3806086258d3d8c48a916ec51c33e1ad8f46821b81Dan Albert    || defined(__EMSCRIPTEN__) || defined(__IBMCPP__))
3992a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant# include <xlocale.h>
40e45cf3e8b5b03c41c5d025ad443debdcc54ab58dMarshall Clow#endif // __GLIBC__ || __APPLE__ || __FreeBSD__ || __sun__ || __EMSCRIPTEN__ || __IBMCPP__
41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4208e17472e4d5434b668dd4c63e3fa5f4b45337b9Howard Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#pragma GCC system_header
4408e17472e4d5434b668dd4c63e3fa5f4b45337b9Howard Hinnant#endif
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4883eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS locale;
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5033be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnanttemplate <class _Facet>
5133be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnant_LIBCPP_INLINE_VISIBILITY
5233be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnantbool
5333be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnanthas_facet(const locale&) _NOEXCEPT;
5433be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnant
5533be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnanttemplate <class _Facet>
5633be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnant_LIBCPP_INLINE_VISIBILITY
5733be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnantconst _Facet&
5833be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnantuse_facet(const locale&);
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6083eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS locale
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // types:
6483eade6abb414e0e814977921bcb6e46853cae03Howard Hinnant    class _LIBCPP_TYPE_VIS facet;
6583eade6abb414e0e814977921bcb6e46853cae03Howard Hinnant    class _LIBCPP_TYPE_VIS id;
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef int category;
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const category // values assigned here are for exposition only
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        none     = 0,
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        collate  = LC_COLLATE_MASK,
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ctype    = LC_CTYPE_MASK,
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        monetary = LC_MONETARY_MASK,
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        numeric  = LC_NUMERIC_MASK,
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        time     = LC_TIME_MASK,
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        messages = LC_MESSAGES_MASK,
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        all = collate | ctype | monetary | numeric | time | messages;
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // construct/copy/destroy:
79c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    locale()  _NOEXCEPT;
80c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    locale(const locale&)  _NOEXCEPT;
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit locale(const char*);
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit locale(const string&);
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale(const locale&, const char*, category);
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale(const locale&, const string&, category);
852d72b1e393e35d61917d6d0ce069482ab11e96d1Howard Hinnant    template <class _Facet>
862d72b1e393e35d61917d6d0ce069482ab11e96d1Howard Hinnant        _LIBCPP_INLINE_VISIBILITY locale(const locale&, _Facet*);
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale(const locale&, const locale&, category);
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
89c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    ~locale();
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
91c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    const locale& operator=(const locale&)  _NOEXCEPT;
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _Facet> locale combine(const locale&) const;
94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // locale operations:
96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string name() const;
97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool operator==(const locale&) const;
98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool operator!=(const locale& __y) const {return !(*this == __y);}
99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _CharT, class _Traits, class _Allocator>
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      bool operator()(const basic_string<_CharT, _Traits, _Allocator>&,
101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                      const basic_string<_CharT, _Traits, _Allocator>&) const;
102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // global locale objects:
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale global(const locale&);
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const locale& classic();
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprivate:
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    class __imp;
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __imp* __locale_;
110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void __install_ctor(const locale&, facet*, long);
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale& __global();
113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool has_facet(id&) const;
114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const facet* use_facet(id&) const;
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
116c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    template <class _Facet> friend bool has_facet(const locale&)  _NOEXCEPT;
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _Facet> friend const _Facet& use_facet(const locale&);
118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
12083eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS locale::facet
121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public __shared_count
122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
124b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit facet(size_t __refs = 0)
126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : __shared_count(static_cast<long>(__refs)-1) {}
127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual ~facet();
129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//    facet(const facet&) = delete;     // effectively done in __shared_count
131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//    void operator=(const facet&) = delete;
132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprivate:
1331694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant    virtual void __on_zero_shared() _NOEXCEPT;
134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
13683eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS locale::id
137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    once_flag      __flag_;
139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int32_t        __id_;
140324bb03bb94f67ae7f9092810e4e4f6bd8bf506eHoward Hinnant
141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static int32_t __next_id;
142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
143f3d62ea57ff9ac61c5fd9860713d2d0f781f9e12Howard Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR id() :__id_(0) {}
144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprivate:
145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void __init();
146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void operator=(const id&); // = delete;
147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    id(const id&); // = delete;
148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:  // only needed for tests
149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    long __get();
150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    friend class locale;
152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    friend class locale::__imp;
153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _Facet>
156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::locale(const locale& __other, _Facet* __f)
158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __install_ctor(__other, __f, __f ? __f->id.__get() : 0);
160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _Facet>
163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale
164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::combine(const locale& __other) const
165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
166d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
1670949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    if (!_VSTD::has_facet<_Facet>(__other))
168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("locale::combine: locale missing facet");
169324bb03bb94f67ae7f9092810e4e4f6bd8bf506eHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
1700949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    return locale(*this, &const_cast<_Facet&>(_VSTD::use_facet<_Facet>(__other)));
171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _Facet>
174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
176c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnanthas_facet(const locale& __l)  _NOEXCEPT
177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __l.has_facet(_Facet::id);
179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _Facet>
182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst _Facet&
184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantuse_facet(const locale& __l)
185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return static_cast<const _Facet&>(*__l.use_facet(_Facet::id));
187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class _CharT> class collate;
190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
1920f678bd69ef6428e6c75ae1b43fcf1543df63cdaHoward Hinnantclass _LIBCPP_TYPE_VIS_ONLY collate
193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public locale::facet
194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef _CharT char_type;
197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef basic_string<char_type> string_type;
198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
199b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit collate(size_t __refs = 0)
201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : locale::facet(__refs) {}
202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
203b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int compare(const char_type* __lo1, const char_type* __hi1,
205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                const char_type* __lo2, const char_type* __hi2) const
206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_compare(__lo1, __hi1, __lo2, __hi2);
208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
210b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string_type transform(const char_type* __lo, const char_type* __hi) const
212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_transform(__lo, __hi);
214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
216b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    long hash(const char_type* __lo, const char_type* __hi) const
218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_hash(__lo, __hi);
220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale::id id;
223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~collate();
226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual int do_compare(const char_type* __lo1, const char_type* __hi1,
227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                           const char_type* __lo2, const char_type* __hi2) const;
228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string_type do_transform(const char_type* __lo, const char_type* __hi) const
229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {return string_type(__lo, __hi);}
230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual long do_hash(const char_type* __lo, const char_type* __hi) const;
231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> locale::id collate<_CharT>::id;
234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate<_CharT>::~collate()
237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate<_CharT>::do_compare(const char_type* __lo1, const char_type* __hi1,
243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            const char_type* __lo2, const char_type* __hi2) const
244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; __lo2 != __hi2; ++__lo1, ++__lo2)
246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__lo1 == __hi1 || *__lo1 < *__lo2)
248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return -1;
249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (*__lo2 < *__lo1)
250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return 1;
251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __lo1 != __hi1;
253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlong
25711624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnantcollate<_CharT>::do_hash(const char_type* __lo, const char_type* __hi) const
258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
25911624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    size_t __h = 0;
26011624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    const size_t __sr = __CHAR_BIT__ * sizeof(size_t) - 8;
26111624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    const size_t __mask = size_t(0xF) << (__sr + 4);
26211624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    for(const char_type* __p = __lo; __p != __hi; ++__p)
263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
264ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        __h = (__h << 4) + static_cast<size_t>(*__p);
26511624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant        size_t __g = __h & __mask;
26611624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant        __h ^= __g | (__g >> __sr);
267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
26811624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    return static_cast<long>(__h);
269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
271499cea12bb2b1c440f28274227d9fd98cd1c609eHoward Hinnant_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS collate<char>)
272499cea12bb2b1c440f28274227d9fd98cd1c609eHoward Hinnant_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS collate<wchar_t>)
273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class CharT> class collate_byname;
275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
2760f678bd69ef6428e6c75ae1b43fcf1543df63cdaHoward Hinnanttemplate <class _CharT> class _LIBCPP_TYPE_VIS_ONLY collate_byname;
277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
27983eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS collate_byname<char>
280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public collate<char>
281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale_t __l;
283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char char_type;
285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef basic_string<char_type> string_type;
286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit collate_byname(const char* __n, size_t __refs = 0);
288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit collate_byname(const string& __n, size_t __refs = 0);
289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~collate_byname();
292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual int do_compare(const char_type* __lo1, const char_type* __hi1,
293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                           const char_type* __lo2, const char_type* __hi2) const;
294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string_type do_transform(const char_type* __lo, const char_type* __hi) const;
295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
29883eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS collate_byname<wchar_t>
299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public collate<wchar_t>
300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale_t __l;
302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef wchar_t char_type;
304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef basic_string<char_type> string_type;
305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit collate_byname(const char* __n, size_t __refs = 0);
307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit collate_byname(const string& __n, size_t __refs = 0);
308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~collate_byname();
311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual int do_compare(const char_type* __lo1, const char_type* __hi1,
313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                           const char_type* __lo2, const char_type* __hi2) const;
314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string_type do_transform(const char_type* __lo, const char_type* __hi) const;
315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT, class _Traits, class _Allocator>
318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::operator()(const basic_string<_CharT, _Traits, _Allocator>& __x,
320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                   const basic_string<_CharT, _Traits, _Allocator>& __y) const
321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
3220949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    return _VSTD::use_facet<_VSTD::collate<_CharT> >(*this).compare(
323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                       __x.data(), __x.data() + __x.size(),
324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                       __y.data(), __y.data() + __y.size()) < 0;
325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class charT> class ctype
328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
32983eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS ctype_base
330b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant{
331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
33253e27639669f8f05c77ea4ef60063667d31dd674Marshall Clow#ifdef __GLIBC__
33362a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    typedef unsigned short mask;
334c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask space  = _ISspace;
335c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask print  = _ISprint;
336c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask cntrl  = _IScntrl;
337c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask upper  = _ISupper;
338c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask lower  = _ISlower;
339c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask alpha  = _ISalpha;
340c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask digit  = _ISdigit;
341c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask punct  = _ISpunct;
342c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask xdigit = _ISxdigit;
343c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask blank  = _ISblank;
344a22d2addb1287a7642bfcb211ae2cb21890d1cbdMarshall Clow#elif defined(_WIN32)
3453c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant    typedef unsigned short mask;
34692a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask space  = _SPACE;
34792a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask print  = _BLANK|_PUNCT|_ALPHA|_DIGIT;
34892a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask cntrl  = _CONTROL;
34992a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask upper  = _UPPER;
35092a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask lower  = _LOWER;
35192a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask alpha  = _ALPHA;
35292a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask digit  = _DIGIT;
35392a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask punct  = _PUNCT;
35492a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask xdigit = _HEX;
35592a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask blank  = _BLANK;
356fe851e184372195a106fddfcc81b55b363c6a75bDan Albert#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__EMSCRIPTEN__) || defined(__NetBSD__)
3575cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert# ifdef __APPLE__
358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef __uint32_t mask;
3595cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert# elif defined(__FreeBSD__)
360c512df1950baf9466843b2943855356c031fec08David Chisnall    typedef unsigned long mask;
3615cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert# elif defined(__EMSCRIPTEN__) ||  defined(__NetBSD__)
362fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant    typedef unsigned short mask;
3635cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert# endif
364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask space  = _CTYPE_S;
365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask print  = _CTYPE_R;
366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask cntrl  = _CTYPE_C;
367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask upper  = _CTYPE_U;
368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask lower  = _CTYPE_L;
369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask alpha  = _CTYPE_A;
370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask digit  = _CTYPE_D;
371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask punct  = _CTYPE_P;
372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask xdigit = _CTYPE_X;
373d1ab521199792d5b811d4aa779fc04042e95eb3aDan Albert
374a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger# if defined(__NetBSD__)
375a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger    static const mask blank  = _CTYPE_BL;
376a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger# else
377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask blank  = _CTYPE_B;
378a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger# endif
379cb0e6b65a842b75ecff6734a6250e73483637705Howard Hinnant#elif defined(__sun__) || defined(_AIX)
380997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    typedef unsigned int mask;
381997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask space  = _ISSPACE;
382997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask print  = _ISPRINT;
383997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask cntrl  = _ISCNTRL;
384997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask upper  = _ISUPPER;
385997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask lower  = _ISLOWER;
386997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask alpha  = _ISALPHA;
387997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask digit  = _ISDIGIT;
388997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask punct  = _ISPUNCT;
389997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask xdigit = _ISXDIGIT;
390997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask blank  = _ISBLANK;
3915cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert#elif defined(_NEWLIB_VERSION)
3925cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    // Same type as Newlib's _ctype_ array in newlib/libc/include/ctype.h.
3935cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    typedef char mask;
3945cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    static const mask space  = _S;
3955cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    static const mask print  = _P | _U | _L | _N | _B;
3965cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    static const mask cntrl  = _C;
3975cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    static const mask upper  = _U;
3985cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    static const mask lower  = _L;
3995cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    static const mask alpha  = _U | _L;
4005cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    static const mask digit  = _N;
4015cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    static const mask punct  = _P;
4025cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    static const mask xdigit = _X | _N;
4035cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert    static const mask blank  = _B;
4045cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert#else
40511624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    typedef unsigned long mask;
40611624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask space  = 1<<0;
40711624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask print  = 1<<1;
40811624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask cntrl  = 1<<2;
40911624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask upper  = 1<<3;
41011624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask lower  = 1<<4;
41111624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask alpha  = 1<<5;
41211624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask digit  = 1<<6;
41311624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask punct  = 1<<7;
41411624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask xdigit = 1<<8;
41511624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask blank  = 1<<9;
4165cb52824fc2a0caf233311e91d9a2a53368f04adDan Albert#endif
417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask alnum  = alpha | digit;
418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask graph  = alnum | punct;
419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
420bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE ctype_base() {}
421bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
422bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4230f678bd69ef6428e6c75ae1b43fcf1543df63cdaHoward Hinnanttemplate <class _CharT> class _LIBCPP_TYPE_VIS_ONLY ctype;
424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
42683eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS ctype<wchar_t>
427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public locale::facet,
428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      public ctype_base
429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
430bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef wchar_t char_type;
432324bb03bb94f67ae7f9092810e4e4f6bd8bf506eHoward Hinnant
433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit ctype(size_t __refs = 0)
435bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : locale::facet(__refs) {}
436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool is(mask __m, char_type __c) const
439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
440bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_is(__m, __c);
441bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
444bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* is(const char_type* __low, const char_type* __high, mask* __vec) const
445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_is(__low, __high, __vec);
447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
448bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
449bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
450bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* scan_is(mask __m, const char_type* __low, const char_type* __high) const
451bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
452bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_scan_is(__m, __low, __high);
453bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
454bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* scan_not(mask __m, const char_type* __low, const char_type* __high) const
457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_scan_not(__m, __low, __high);
459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
461bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
462bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type toupper(char_type __c) const
463bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
464bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_toupper(__c);
465bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
467bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
468bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* toupper(char_type* __low, const char_type* __high) const
469bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
470bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_toupper(__low, __high);
471bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
472bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
473bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
474bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type tolower(char_type __c) const
475bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
476bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_tolower(__c);
477bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
478bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
479bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
480bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* tolower(char_type* __low, const char_type* __high) const
481bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
482bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_tolower(__low, __high);
483bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
484bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
485bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
486bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type widen(char __c) const
487bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
488bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_widen(__c);
489bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
490bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
491bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
492bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char* widen(const char* __low, const char* __high, char_type* __to) const
493bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
494bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_widen(__low, __high, __to);
495bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
496bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
497bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
498bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char narrow(char_type __c, char __dfault) const
499bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
500bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_narrow(__c, __dfault);
501bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
502bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
503bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
504bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* narrow(const char_type* __low, const char_type* __high, char __dfault, char* __to) const
505bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
506bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_narrow(__low, __high, __dfault, __to);
507bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
508bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
509bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale::id id;
510bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
511bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
512bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~ctype();
513bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual bool do_is(mask __m, char_type __c) const;
514bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_is(const char_type* __low, const char_type* __high, mask* __vec) const;
515bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_scan_is(mask __m, const char_type* __low, const char_type* __high) const;
516bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_scan_not(mask __m, const char_type* __low, const char_type* __high) const;
517bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_toupper(char_type) const;
518bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_toupper(char_type* __low, const char_type* __high) const;
519bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_tolower(char_type) const;
520bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_tolower(char_type* __low, const char_type* __high) const;
521bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_widen(char) const;
522bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char* do_widen(const char* __low, const char* __high, char_type* __dest) const;
523bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char do_narrow(char_type, char __dfault) const;
524bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_narrow(const char_type* __low, const char_type* __high, char __dfault, char* __dest) const;
525bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
526bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
527bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
52883eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS ctype<char>
529bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public locale::facet, public ctype_base
530bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
531bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const mask* __tab_;
532bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool        __del_;
533bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
534bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char char_type;
535bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
536bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit ctype(const mask* __tab = 0, bool __del = false, size_t __refs = 0);
537bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
538bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
539bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool is(mask __m, char_type __c) const
540bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
5418a43fca8edade4efb453bad10243841738e6dfbaMarshall Clow        return isascii(__c) ? (__tab_[static_cast<int>(__c)] & __m) !=0 : false;
542bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
543bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
544bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
545bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* is(const char_type* __low, const char_type* __high, mask* __vec) const
546bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
547bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (; __low != __high; ++__low, ++__vec)
548ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            *__vec = isascii(*__low) ? __tab_[static_cast<int>(*__low)] : 0;
549bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __low;
550bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
551bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
552bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
553bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* scan_is (mask __m, const char_type* __low, const char_type* __high) const
554bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
555bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (; __low != __high; ++__low)
556ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if (isascii(*__low) && (__tab_[static_cast<int>(*__low)] & __m))
557bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
558bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __low;
559bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
560bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
561bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
562bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* scan_not(mask __m, const char_type* __low, const char_type* __high) const
563bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
564bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (; __low != __high; ++__low)
565ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if (!(isascii(*__low) && (__tab_[static_cast<int>(*__low)] & __m)))
566bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
567bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __low;
568bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
569bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
570bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
571bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type toupper(char_type __c) const
572bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
573bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_toupper(__c);
574bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
575bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
576bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
577bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* toupper(char_type* __low, const char_type* __high) const
578bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
579bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_toupper(__low, __high);
580bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
581bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
582bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
583bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type tolower(char_type __c) const
584bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
585bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_tolower(__c);
586bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
587bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
588bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
589bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* tolower(char_type* __low, const char_type* __high) const
590bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
591bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_tolower(__low, __high);
592bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
593bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
594bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
595bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type widen(char __c) const
596bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
597bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_widen(__c);
598bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
599bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
600bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
601bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char* widen(const char* __low, const char* __high, char_type* __to) const
602bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
603bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_widen(__low, __high, __to);
604bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
605bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
606bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
607bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char narrow(char_type __c, char __dfault) const
608bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
609bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_narrow(__c, __dfault);
610bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
611bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
612bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
613bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char* narrow(const char_type* __low, const char_type* __high, char __dfault, char* __to) const
614bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
615bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_narrow(__low, __high, __dfault, __to);
616bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
617bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
618bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale::id id;
619bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
620adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant#ifdef _CACHED_RUNES
621bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const size_t table_size = _CACHED_RUNES;
622adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant#else
623adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant    static const size_t table_size = 256;  // FIXME: Don't hardcode this.
624adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant#endif
625c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    _LIBCPP_ALWAYS_INLINE const mask* table() const  _NOEXCEPT {return __tab_;}
626c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    static const mask* classic_table()  _NOEXCEPT;
6272ccffefaffc4558adcfa64bec7dc71ade2235937Marshall Clow#if defined(__GLIBC__) || defined(__EMSCRIPTEN__)
62862a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    static const int* __classic_upper_table() _NOEXCEPT;
62962a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    static const int* __classic_lower_table() _NOEXCEPT;
630e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#endif
631a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#if defined(__NetBSD__)
632a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger    static const short* __classic_upper_table() _NOEXCEPT;
633a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger    static const short* __classic_lower_table() _NOEXCEPT;
634a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#endif
635bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
636bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
637bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~ctype();
638bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_toupper(char_type __c) const;
639bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_toupper(char_type* __low, const char_type* __high) const;
640bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_tolower(char_type __c) const;
641bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_tolower(char_type* __low, const char_type* __high) const;
642bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_widen(char __c) const;
643bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char* do_widen(const char* __low, const char* __high, char_type* __to) const;
644bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char do_narrow(char_type __c, char __dfault) const;
645bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char* do_narrow(const char_type* __low, const char_type* __high, char __dfault, char* __to) const;
646bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
647bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
648bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class CharT> class ctype_byname;
649bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6500f678bd69ef6428e6c75ae1b43fcf1543df63cdaHoward Hinnanttemplate <class _CharT> class _LIBCPP_TYPE_VIS_ONLY ctype_byname;
651bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
652bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
65383eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS ctype_byname<char>
654bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public ctype<char>
655bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
656bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale_t __l;
657bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
658bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
659bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit ctype_byname(const char*, size_t = 0);
660bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit ctype_byname(const string&, size_t = 0);
661bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
662bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
663bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~ctype_byname();
664bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_toupper(char_type) const;
665bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_toupper(char_type* __low, const char_type* __high) const;
666bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_tolower(char_type) const;
667bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_tolower(char_type* __low, const char_type* __high) const;
668bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
669bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
670bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
67183eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS ctype_byname<wchar_t>
672bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public ctype<wchar_t>
673bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
674bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale_t __l;
675bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
676bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
677bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit ctype_byname(const char*, size_t = 0);
678bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit ctype_byname(const string&, size_t = 0);
679bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
680bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
681bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~ctype_byname();
682bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual bool do_is(mask __m, char_type __c) const;
683bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_is(const char_type* __low, const char_type* __high, mask* __vec) const;
684bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_scan_is(mask __m, const char_type* __low, const char_type* __high) const;
685bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_scan_not(mask __m, const char_type* __low, const char_type* __high) const;
686bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_toupper(char_type) const;
687bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_toupper(char_type* __low, const char_type* __high) const;
688bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_tolower(char_type) const;
689bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_tolower(char_type* __low, const char_type* __high) const;
690bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_widen(char) const;
691bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char* do_widen(const char* __low, const char* __high, char_type* __dest) const;
692bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char do_narrow(char_type, char __dfault) const;
693bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_narrow(const char_type* __low, const char_type* __high, char __dfault, char* __dest) const;
694bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
695bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
696bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
697bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
698bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
699bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantisspace(_CharT __c, const locale& __loc)
700bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
701bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::space, __c);
702bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
703bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
704bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
705bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
706bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
707bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantisprint(_CharT __c, const locale& __loc)
708bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
709bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::print, __c);
710bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
711bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
712bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
713bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
714bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
715bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantiscntrl(_CharT __c, const locale& __loc)
716bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
717bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::cntrl, __c);
718bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
719bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
720bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
721bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
722bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
723bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantisupper(_CharT __c, const locale& __loc)
724bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
725bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::upper, __c);
726bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
727bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
728bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
729bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
730bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
731bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantislower(_CharT __c, const locale& __loc)
732bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
733bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::lower, __c);
734bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
735bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
736bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
737bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
738bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
739bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantisalpha(_CharT __c, const locale& __loc)
740bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
741bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alpha, __c);
742bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
743bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
744bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
745bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
746bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
747bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantisdigit(_CharT __c, const locale& __loc)
748bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
749bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::digit, __c);
750bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
751bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
752bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
753bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
754bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
755bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantispunct(_CharT __c, const locale& __loc)
756bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
757bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::punct, __c);
758bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
759bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
760bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
761bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
762bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
763bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantisxdigit(_CharT __c, const locale& __loc)
764bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
765bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::xdigit, __c);
766bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
767bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
768bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
769bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
770bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
771bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantisalnum(_CharT __c, const locale& __loc)
772bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
773bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alnum, __c);
774bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
775bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
776bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
777bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
778bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
779bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantisgraph(_CharT __c, const locale& __loc)
780bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
781bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::graph, __c);
782bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
783bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
784bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
785bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
786bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_CharT
787bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttoupper(_CharT __c, const locale& __loc)
788bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
789bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).toupper(__c);
790bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
791bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
792bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
793bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
794bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_CharT
795bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttolower(_CharT __c, const locale& __loc)
796bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
797bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).tolower(__c);
798bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
799bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
800bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// codecvt_base
801bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
80283eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS codecvt_base
803bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
804bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
805bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE codecvt_base() {}
806bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    enum result {ok, partial, error, noconv};
807bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
808bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
809bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class internT, class externT, class stateT> class codecvt;
810bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
8110f678bd69ef6428e6c75ae1b43fcf1543df63cdaHoward Hinnanttemplate <class _InternT, class _ExternT, class _StateT> class _LIBCPP_TYPE_VIS_ONLY codecvt;
812bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
813bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class codecvt<char, char, mbstate_t>
814bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
815bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
81683eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS codecvt<char, char, mbstate_t>
817bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public locale::facet,
818bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      public codecvt_base
819bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
820bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
821bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char      intern_type;
822bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char      extern_type;
823bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef mbstate_t state_type;
824bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
825bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
826bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt(size_t __refs = 0)
827bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : locale::facet(__refs) {}
828bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
829bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
830bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result out(state_type& __st,
831bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
832bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
833bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
834bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_out(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
835bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
836bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
837bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
838bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result unshift(state_type& __st,
839bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
840bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
841bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_unshift(__st, __to, __to_end, __to_nxt);
842bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
843bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
844bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
845bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result in(state_type& __st,
846bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
847bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const
848bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
849bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_in(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
850bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
851bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
852bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
853c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    int encoding() const  _NOEXCEPT
854bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
855bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_encoding();
856bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
857bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
858bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
859c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    bool always_noconv() const  _NOEXCEPT
860bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
861bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_always_noconv();
862bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
863bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
864bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
865bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const
866bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
867bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_length(__st, __frm, __end, __mx);
868bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
869bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
870bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
871c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    int max_length() const  _NOEXCEPT
872bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
873bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_max_length();
874bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
875bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
876bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale::id id;
877bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
878bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
879bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
880bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt(const char*, size_t __refs = 0)
881bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : locale::facet(__refs) {}
882bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
883bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~codecvt();
884bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
885bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_out(state_type& __st,
886bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
887bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
888bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_in(state_type& __st,
889bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
890bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
891bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_unshift(state_type& __st,
892bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                              extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
893c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual int do_encoding() const  _NOEXCEPT;
894c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual bool do_always_noconv() const  _NOEXCEPT;
895bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual int do_length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const;
896c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual int do_max_length() const  _NOEXCEPT;
897bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
898bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
899bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class codecvt<wchar_t, char, mbstate_t>
900bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
901bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
90283eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS codecvt<wchar_t, char, mbstate_t>
903bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public locale::facet,
904bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      public codecvt_base
905bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
906bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale_t __l;
907bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
908bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef wchar_t   intern_type;
909bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char      extern_type;
910bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef mbstate_t state_type;
911bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
912bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt(size_t __refs = 0);
913bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
914bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
915bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result out(state_type& __st,
916bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
917bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
918bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
919bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_out(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
920bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
921bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
922bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
923bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result unshift(state_type& __st,
924bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
925bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
926bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_unshift(__st, __to, __to_end, __to_nxt);
927bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
928bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
929bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
930bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result in(state_type& __st,
931bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
932bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const
933bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
934bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_in(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
935bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
936bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
937bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
938c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    int encoding() const  _NOEXCEPT
939bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
940bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_encoding();
941bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
942bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
943bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
944c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    bool always_noconv() const  _NOEXCEPT
945bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
946bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_always_noconv();
947bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
948bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
949bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
950bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const
951bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
952bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_length(__st, __frm, __end, __mx);
953bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
954bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
955bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
956c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    int max_length() const  _NOEXCEPT
957bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
958bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_max_length();
959bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
960bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
961bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale::id id;
962bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
963bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
964bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt(const char*, size_t __refs = 0);
965bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
966bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~codecvt();
967bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
968bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_out(state_type& __st,
969bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
970bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
971bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_in(state_type& __st,
972bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
973bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
974bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_unshift(state_type& __st,
975bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                              extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
976c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual int do_encoding() const  _NOEXCEPT;
977c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual bool do_always_noconv() const  _NOEXCEPT;
978bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const;
979c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual int do_max_length() const  _NOEXCEPT;
980bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
981bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
982bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class codecvt<char16_t, char, mbstate_t>
983bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
984bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
98583eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS codecvt<char16_t, char, mbstate_t>
986bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public locale::facet,
987bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      public codecvt_base
988bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
989bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
990bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char16_t  intern_type;
991bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char      extern_type;
992bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef mbstate_t state_type;
993bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
994bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
995bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt(size_t __refs = 0)
996bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : locale::facet(__refs) {}
997bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
998bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
999bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result out(state_type& __st,
1000bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
1001bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
1002bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1003bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_out(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
1004bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1005bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1006bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1007bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result unshift(state_type& __st,
1008bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
1009bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1010bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_unshift(__st, __to, __to_end, __to_nxt);
1011bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1012bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1013bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1014bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result in(state_type& __st,
1015bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
1016bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const
1017bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1018bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_in(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
1019bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1020bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1021bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1022c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    int encoding() const  _NOEXCEPT
1023bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1024bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_encoding();
1025bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1026bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1027bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1028c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    bool always_noconv() const  _NOEXCEPT
1029bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1030bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_always_noconv();
1031bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1032bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1033bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1034bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const
1035bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1036bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_length(__st, __frm, __end, __mx);
1037bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1038bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1039bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1040c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    int max_length() const  _NOEXCEPT
1041bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1042bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_max_length();
1043bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1044bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1045bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale::id id;
1046bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1047bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
1048bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1049bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt(const char*, size_t __refs = 0)
1050bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : locale::facet(__refs) {}
1051bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1052bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~codecvt();
1053bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1054bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_out(state_type& __st,
1055bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
1056bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
1057bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_in(state_type& __st,
1058bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
1059bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
1060bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_unshift(state_type& __st,
1061bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                              extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
1062c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual int do_encoding() const  _NOEXCEPT;
1063c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual bool do_always_noconv() const  _NOEXCEPT;
1064bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const;
1065c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual int do_max_length() const  _NOEXCEPT;
1066bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1067bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1068bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class codecvt<char32_t, char, mbstate_t>
1069bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1070bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
107183eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS codecvt<char32_t, char, mbstate_t>
1072bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public locale::facet,
1073bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      public codecvt_base
1074bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1075bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
1076bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char32_t  intern_type;
1077bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char      extern_type;
1078bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef mbstate_t state_type;
1079bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1080bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1081bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt(size_t __refs = 0)
1082bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : locale::facet(__refs) {}
1083bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1084bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1085bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result out(state_type& __st,
1086bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
1087bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
1088bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1089bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_out(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
1090bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1091bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1092bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1093bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result unshift(state_type& __st,
1094bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
1095bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1096bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_unshift(__st, __to, __to_end, __to_nxt);
1097bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1098bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1099bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result in(state_type& __st,
1101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
1102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const
1103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_in(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
1105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1108c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    int encoding() const  _NOEXCEPT
1109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_encoding();
1111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1114c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    bool always_noconv() const  _NOEXCEPT
1115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_always_noconv();
1117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const
1121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_length(__st, __frm, __end, __mx);
1123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1126c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    int max_length() const  _NOEXCEPT
1127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_max_length();
1129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale::id id;
1132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
1134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt(const char*, size_t __refs = 0)
1136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : locale::facet(__refs) {}
1137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~codecvt();
1139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_out(state_type& __st,
1141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
1142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
1143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_in(state_type& __st,
1144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
1145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
1146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_unshift(state_type& __st,
1147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                              extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
1148c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual int do_encoding() const  _NOEXCEPT;
1149c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual bool do_always_noconv() const  _NOEXCEPT;
1150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const;
1151c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual int do_max_length() const  _NOEXCEPT;
1152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class _InternT, class _ExternT, class _StateT> class codecvt_byname
1155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _InternT, class _ExternT, class _StateT>
11570f678bd69ef6428e6c75ae1b43fcf1543df63cdaHoward Hinnantclass _LIBCPP_TYPE_VIS_ONLY codecvt_byname
1158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public codecvt<_InternT, _ExternT, _StateT>
1159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
1161b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant    _LIBCPP_ALWAYS_INLINE
1162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt_byname(const char* __nm, size_t __refs = 0)
1163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : codecvt<_InternT, _ExternT, _StateT>(__nm, __refs) {}
1164b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant    _LIBCPP_ALWAYS_INLINE
1165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt_byname(const string& __nm, size_t __refs = 0)
1166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : codecvt<_InternT, _ExternT, _StateT>(__nm.c_str(), __refs) {}
1167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
1168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~codecvt_byname();
1169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _InternT, class _ExternT, class _StateT>
1172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt_byname<_InternT, _ExternT, _StateT>::~codecvt_byname()
1173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1176499cea12bb2b1c440f28274227d9fd98cd1c609eHoward Hinnant_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS codecvt_byname<char, char, mbstate_t>)
1177499cea12bb2b1c440f28274227d9fd98cd1c609eHoward Hinnant_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS codecvt_byname<wchar_t, char, mbstate_t>)
1178499cea12bb2b1c440f28274227d9fd98cd1c609eHoward Hinnant_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS codecvt_byname<char16_t, char, mbstate_t>)
1179499cea12bb2b1c440f28274227d9fd98cd1c609eHoward Hinnant_LIBCPP_EXTERN_TEMPLATE2(class _LIBCPP_TYPE_VIS codecvt_byname<char32_t, char, mbstate_t>)
1180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
118183eade6abb414e0e814977921bcb6e46853cae03Howard Hinnant_LIBCPP_FUNC_VIS void __throw_runtime_error(const char*);
1182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
11839996844df0f22a68a1af6d30c611be1f1ebf1486Howard Hinnanttemplate <size_t _Np>
1184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct __narrow_to_utf8
1185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _OutputIterator, class _CharT>
1187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _OutputIterator
1188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    operator()(_OutputIterator __s, const _CharT* __wb, const _CharT* __we) const;
1189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
1192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct __narrow_to_utf8<8>
1193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _OutputIterator, class _CharT>
1195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _OutputIterator
1197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    operator()(_OutputIterator __s, const _CharT* __wb, const _CharT* __we) const
1198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (; __wb < __we; ++__wb, ++__s)
1200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__s = *__wb;
1201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __s;
1202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
1206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct __narrow_to_utf8<16>
1207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public codecvt<char16_t, char, mbstate_t>
1208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __narrow_to_utf8() : codecvt<char16_t, char, mbstate_t>(1) {}
1211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~__narrow_to_utf8();
1213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _OutputIterator, class _CharT>
1215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _OutputIterator
1217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    operator()(_OutputIterator __s, const _CharT* __wb, const _CharT* __we) const
1218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        result __r = ok;
1220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mbstate_t __mb;
1221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        while (__wb < __we && __r != error)
1222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            const int __sz = 32;
1224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char __buf[__sz];
1225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char* __bn;
1226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            const char16_t* __wn = (const char16_t*)__wb;
1227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __r = do_out(__mb, (const char16_t*)__wb, (const char16_t*)__we, __wn,
1228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         __buf, __buf+__sz, __bn);
1229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__r == codecvt_base::error || __wn == (const char16_t*)__wb)
1230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                __throw_runtime_error("locale not supported");
1231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (const char* __p = __buf; __p < __bn; ++__p, ++__s)
1232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *__s = *__p;
1233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __wb = (const _CharT*)__wn;
1234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __s;
1236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
1240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct __narrow_to_utf8<32>
1241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public codecvt<char32_t, char, mbstate_t>
1242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __narrow_to_utf8() : codecvt<char32_t, char, mbstate_t>(1) {}
1245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~__narrow_to_utf8();
1247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _OutputIterator, class _CharT>
1249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _OutputIterator
1251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    operator()(_OutputIterator __s, const _CharT* __wb, const _CharT* __we) const
1252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        result __r = ok;
1254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mbstate_t __mb;
1255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        while (__wb < __we && __r != error)
1256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            const int __sz = 32;
1258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char __buf[__sz];
1259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char* __bn;
1260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            const char32_t* __wn = (const char32_t*)__wb;
1261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __r = do_out(__mb, (const char32_t*)__wb, (const char32_t*)__we, __wn,
1262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         __buf, __buf+__sz, __bn);
1263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__r == codecvt_base::error || __wn == (const char32_t*)__wb)
1264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                __throw_runtime_error("locale not supported");
1265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (const char* __p = __buf; __p < __bn; ++__p, ++__s)
1266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *__s = *__p;
1267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __wb = (const _CharT*)__wn;
1268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __s;
1270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
12739996844df0f22a68a1af6d30c611be1f1ebf1486Howard Hinnanttemplate <size_t _Np>
1274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct __widen_from_utf8
1275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _OutputIterator>
1277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _OutputIterator
1278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    operator()(_OutputIterator __s, const char* __nb, const char* __ne) const;
1279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
1282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct __widen_from_utf8<8>
1283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _OutputIterator>
1285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _OutputIterator
1287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    operator()(_OutputIterator __s, const char* __nb, const char* __ne) const
1288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (; __nb < __ne; ++__nb, ++__s)
1290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__s = *__nb;
1291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __s;
1292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
1296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct __widen_from_utf8<16>
1297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public codecvt<char16_t, char, mbstate_t>
1298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __widen_from_utf8() : codecvt<char16_t, char, mbstate_t>(1) {}
1301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~__widen_from_utf8();
1303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _OutputIterator>
1305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _OutputIterator
1307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    operator()(_OutputIterator __s, const char* __nb, const char* __ne) const
1308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        result __r = ok;
1310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mbstate_t __mb;
1311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        while (__nb < __ne && __r != error)
1312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            const int __sz = 32;
1314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char16_t __buf[__sz];
1315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char16_t* __bn;
1316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            const char* __nn = __nb;
1317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __r = do_in(__mb, __nb, __ne - __nb > __sz ? __nb+__sz : __ne, __nn,
1318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        __buf, __buf+__sz, __bn);
1319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__r == codecvt_base::error || __nn == __nb)
1320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                __throw_runtime_error("locale not supported");
1321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (const char16_t* __p = __buf; __p < __bn; ++__p, ++__s)
1322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *__s = (wchar_t)*__p;
1323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __nb = __nn;
1324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __s;
1326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
1330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct __widen_from_utf8<32>
1331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public codecvt<char32_t, char, mbstate_t>
1332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __widen_from_utf8() : codecvt<char32_t, char, mbstate_t>(1) {}
1335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~__widen_from_utf8();
1337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _OutputIterator>
1339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _OutputIterator
1341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    operator()(_OutputIterator __s, const char* __nb, const char* __ne) const
1342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        result __r = ok;
1344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mbstate_t __mb;
1345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        while (__nb < __ne && __r != error)
1346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            const int __sz = 32;
1348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char32_t __buf[__sz];
1349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char32_t* __bn;
1350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            const char* __nn = __nb;
1351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __r = do_in(__mb, __nb, __ne - __nb > __sz ? __nb+__sz : __ne, __nn,
1352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        __buf, __buf+__sz, __bn);
1353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__r == codecvt_base::error || __nn == __nb)
1354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                __throw_runtime_error("locale not supported");
1355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (const char32_t* __p = __buf; __p < __bn; ++__p, ++__s)
1356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *__s = (wchar_t)*__p;
1357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __nb = __nn;
1358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __s;
1360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class charT> class numpunct
1364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
13650f678bd69ef6428e6c75ae1b43fcf1543df63cdaHoward Hinnanttemplate <class _CharT> class _LIBCPP_TYPE_VIS_ONLY numpunct;
1366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
136883eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS numpunct<char>
1369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public locale::facet
1370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
1372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char char_type;
1373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef basic_string<char_type> string_type;
1374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1375bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit numpunct(size_t __refs = 0);
1376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE char_type decimal_point() const {return do_decimal_point();}
1378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE char_type thousands_sep() const {return do_thousands_sep();}
1379bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE string grouping() const         {return do_grouping();}
1380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE string_type truename() const    {return do_truename();}
1381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE string_type falsename() const   {return do_falsename();}
1382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale::id id;
1384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1385bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
1386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~numpunct();
1387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_decimal_point() const;
1388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_thousands_sep() const;
1389bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string do_grouping() const;
1390bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string_type do_truename() const;
1391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string_type do_falsename() const;
1392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type __decimal_point_;
1394bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type __thousands_sep_;
1395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string __grouping_;
1396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
139983eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS numpunct<wchar_t>
1400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public locale::facet
1401bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
1403bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef wchar_t char_type;
1404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef basic_string<char_type> string_type;
1405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit numpunct(size_t __refs = 0);
1407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE char_type decimal_point() const {return do_decimal_point();}
1409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE char_type thousands_sep() const {return do_thousands_sep();}
1410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE string grouping() const         {return do_grouping();}
1411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE string_type truename() const    {return do_truename();}
1412bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE string_type falsename() const   {return do_falsename();}
1413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale::id id;
1415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
1417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~numpunct();
1418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_decimal_point() const;
1419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_thousands_sep() const;
1420bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string do_grouping() const;
1421bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string_type do_truename() const;
1422bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string_type do_falsename() const;
1423bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type __decimal_point_;
1425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type __thousands_sep_;
1426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string __grouping_;
1427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class charT> class numpunct_byname
1430bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
14314dc5b2198d1aa4ab585a3d4a87ee9626d681f9f7Dan Alberttemplate <class _CharT> class _LIBCPP_TYPE_VIS_ONLY numpunct_byname;
1432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
143483eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS numpunct_byname<char>
1435bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant: public numpunct<char>
1436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
1438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char char_type;
1439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef basic_string<char_type> string_type;
1440bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1441bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit numpunct_byname(const char* __nm, size_t __refs = 0);
1442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit numpunct_byname(const string& __nm, size_t __refs = 0);
1443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1444bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
1445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~numpunct_byname();
1446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprivate:
1448bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void __init(const char*);
1449bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1450bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1451bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
145283eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS numpunct_byname<wchar_t>
1453bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant: public numpunct<wchar_t>
1454bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
1456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef wchar_t char_type;
1457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef basic_string<char_type> string_type;
1458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit numpunct_byname(const char* __nm, size_t __refs = 0);
1460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit numpunct_byname(const string& __nm, size_t __refs = 0);
1461bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1462bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
1463bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~numpunct_byname();
1464bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1465bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprivate:
1466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void __init(const char*);
1467bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1468bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1469bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_END_NAMESPACE_STD
1470bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1471bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#endif  // _LIBCPP___LOCALE
1472