__locale revision e9df0a5c6c864f1ea86486881a3ee559c56105e7
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>
22e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#ifdef _LIBCPP_MSVCRT
2314fa9f9d8ff5a4541404f3e23b91188e74c56f31Howard Hinnant# include <support/win32/locale_win32.h>
24fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant#elif (defined(__GLIBC__) || defined(__APPLE__) || defined(__FreeBSD__) || defined(__sun__)) || defined(EMSCRIPTEN)
2592a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant# include <xlocale.h>
26fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant#endif  // _WIN32 || __GLIBC__ || __APPLE__ || __FreeBSD__ || __sun__ || EMSCRIPTEN
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
2808e17472e4d5434b668dd4c63e3fa5f4b45337b9Howard Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#pragma GCC system_header
3008e17472e4d5434b668dd4c63e3fa5f4b45337b9Howard Hinnant#endif
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
3483eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS locale;
35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
3633be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnanttemplate <class _Facet>
3733be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnant_LIBCPP_INLINE_VISIBILITY
3833be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnantbool
3933be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnanthas_facet(const locale&) _NOEXCEPT;
4033be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnant
4133be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnanttemplate <class _Facet>
4233be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnant_LIBCPP_INLINE_VISIBILITY
4333be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnantconst _Facet&
4433be35effe82ca5a7a2b285fb9d8176dd94e5e8cHoward Hinnantuse_facet(const locale&);
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4683eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS locale
47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // types:
5083eade6abb414e0e814977921bcb6e46853cae03Howard Hinnant    class _LIBCPP_TYPE_VIS facet;
5183eade6abb414e0e814977921bcb6e46853cae03Howard Hinnant    class _LIBCPP_TYPE_VIS id;
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef int category;
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const category // values assigned here are for exposition only
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        none     = 0,
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        collate  = LC_COLLATE_MASK,
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ctype    = LC_CTYPE_MASK,
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        monetary = LC_MONETARY_MASK,
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        numeric  = LC_NUMERIC_MASK,
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        time     = LC_TIME_MASK,
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        messages = LC_MESSAGES_MASK,
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        all = collate | ctype | monetary | numeric | time | messages;
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // construct/copy/destroy:
65c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    locale()  _NOEXCEPT;
66c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    locale(const locale&)  _NOEXCEPT;
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit locale(const char*);
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit locale(const string&);
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale(const locale&, const char*, category);
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale(const locale&, const string&, category);
712d72b1e393e35d61917d6d0ce069482ab11e96d1Howard Hinnant    template <class _Facet>
722d72b1e393e35d61917d6d0ce069482ab11e96d1Howard Hinnant        _LIBCPP_INLINE_VISIBILITY locale(const locale&, _Facet*);
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale(const locale&, const locale&, category);
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
75c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    ~locale();
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
77c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    const locale& operator=(const locale&)  _NOEXCEPT;
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _Facet> locale combine(const locale&) const;
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // locale operations:
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string name() const;
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool operator==(const locale&) const;
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool operator!=(const locale& __y) const {return !(*this == __y);}
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _CharT, class _Traits, class _Allocator>
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      bool operator()(const basic_string<_CharT, _Traits, _Allocator>&,
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                      const basic_string<_CharT, _Traits, _Allocator>&) const;
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // global locale objects:
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale global(const locale&);
91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const locale& classic();
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprivate:
94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    class __imp;
95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __imp* __locale_;
96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void __install_ctor(const locale&, facet*, long);
98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale& __global();
99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool has_facet(id&) const;
100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const facet* use_facet(id&) const;
101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
102c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    template <class _Facet> friend bool has_facet(const locale&)  _NOEXCEPT;
103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _Facet> friend const _Facet& use_facet(const locale&);
104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10683eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS locale::facet
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public __shared_count
108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
110b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit facet(size_t __refs = 0)
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : __shared_count(static_cast<long>(__refs)-1) {}
113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual ~facet();
115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//    facet(const facet&) = delete;     // effectively done in __shared_count
117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//    void operator=(const facet&) = delete;
118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprivate:
1191694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnant    virtual void __on_zero_shared() _NOEXCEPT;
120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
12283eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS locale::id
123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    once_flag      __flag_;
125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int32_t        __id_;
126324bb03bb94f67ae7f9092810e4e4f6bd8bf506eHoward Hinnant
127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static int32_t __next_id;
128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
129f3d62ea57ff9ac61c5fd9860713d2d0f781f9e12Howard Hinnant    _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR id() :__id_(0) {}
130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprivate:
131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void __init();
132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void operator=(const id&); // = delete;
133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    id(const id&); // = delete;
134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:  // only needed for tests
135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    long __get();
136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    friend class locale;
138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    friend class locale::__imp;
139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _Facet>
142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::locale(const locale& __other, _Facet* __f)
144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __install_ctor(__other, __f, __f ? __f->id.__get() : 0);
146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _Facet>
149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale
150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::combine(const locale& __other) const
151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
152d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
1530949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    if (!_VSTD::has_facet<_Facet>(__other))
154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("locale::combine: locale missing facet");
155324bb03bb94f67ae7f9092810e4e4f6bd8bf506eHoward Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
1560949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    return locale(*this, &const_cast<_Facet&>(_VSTD::use_facet<_Facet>(__other)));
157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _Facet>
160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
162c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnanthas_facet(const locale& __l)  _NOEXCEPT
163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __l.has_facet(_Facet::id);
165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _Facet>
168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst _Facet&
170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantuse_facet(const locale& __l)
171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return static_cast<const _Facet&>(*__l.use_facet(_Facet::id));
173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class _CharT> class collate;
176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
17883eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS collate
179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public locale::facet
180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef _CharT char_type;
183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef basic_string<char_type> string_type;
184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
185b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit collate(size_t __refs = 0)
187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : locale::facet(__refs) {}
188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
189b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int compare(const char_type* __lo1, const char_type* __hi1,
191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                const char_type* __lo2, const char_type* __hi2) const
192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_compare(__lo1, __hi1, __lo2, __hi2);
194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
196b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string_type transform(const char_type* __lo, const char_type* __hi) const
198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_transform(__lo, __hi);
200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
202b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    long hash(const char_type* __lo, const char_type* __hi) const
204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_hash(__lo, __hi);
206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale::id id;
209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~collate();
212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual int do_compare(const char_type* __lo1, const char_type* __hi1,
213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                           const char_type* __lo2, const char_type* __hi2) const;
214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string_type do_transform(const char_type* __lo, const char_type* __hi) const
215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {return string_type(__lo, __hi);}
216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual long do_hash(const char_type* __lo, const char_type* __hi) const;
217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT> locale::id collate<_CharT>::id;
220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate<_CharT>::~collate()
223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate<_CharT>::do_compare(const char_type* __lo1, const char_type* __hi1,
229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            const char_type* __lo2, const char_type* __hi2) const
230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; __lo2 != __hi2; ++__lo1, ++__lo2)
232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__lo1 == __hi1 || *__lo1 < *__lo2)
234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return -1;
235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (*__lo2 < *__lo1)
236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return 1;
237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __lo1 != __hi1;
239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlong
24311624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnantcollate<_CharT>::do_hash(const char_type* __lo, const char_type* __hi) const
244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
24511624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    size_t __h = 0;
24611624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    const size_t __sr = __CHAR_BIT__ * sizeof(size_t) - 8;
24711624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    const size_t __mask = size_t(0xF) << (__sr + 4);
24811624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    for(const char_type* __p = __lo; __p != __hi; ++__p)
249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
250ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        __h = (__h << 4) + static_cast<size_t>(*__p);
25111624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant        size_t __g = __h & __mask;
25211624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant        __h ^= __g | (__g >> __sr);
253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
25411624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    return static_cast<long>(__h);
255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
25783eade6abb414e0e814977921bcb6e46853cae03Howard Hinnant_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS collate<char>)
25883eade6abb414e0e814977921bcb6e46853cae03Howard Hinnant_LIBCPP_EXTERN_TEMPLATE(class _LIBCPP_TYPE_VIS collate<wchar_t>)
259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class CharT> class collate_byname;
261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
26283eade6abb414e0e814977921bcb6e46853cae03Howard Hinnanttemplate <class _CharT> class _LIBCPP_TYPE_VIS collate_byname;
263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
26583eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS collate_byname<char>
266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public collate<char>
267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale_t __l;
269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char char_type;
271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef basic_string<char_type> string_type;
272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit collate_byname(const char* __n, size_t __refs = 0);
274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit collate_byname(const string& __n, size_t __refs = 0);
275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~collate_byname();
278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual int do_compare(const char_type* __lo1, const char_type* __hi1,
279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                           const char_type* __lo2, const char_type* __hi2) const;
280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string_type do_transform(const char_type* __lo, const char_type* __hi) const;
281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
28483eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS collate_byname<wchar_t>
285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public collate<wchar_t>
286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale_t __l;
288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef wchar_t char_type;
290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef basic_string<char_type> string_type;
291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit collate_byname(const char* __n, size_t __refs = 0);
293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit collate_byname(const string& __n, size_t __refs = 0);
294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~collate_byname();
297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual int do_compare(const char_type* __lo1, const char_type* __hi1,
299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                           const char_type* __lo2, const char_type* __hi2) const;
300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string_type do_transform(const char_type* __lo, const char_type* __hi) const;
301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT, class _Traits, class _Allocator>
304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::operator()(const basic_string<_CharT, _Traits, _Allocator>& __x,
306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                   const basic_string<_CharT, _Traits, _Allocator>& __y) const
307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
3080949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant    return _VSTD::use_facet<_VSTD::collate<_CharT> >(*this).compare(
309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                       __x.data(), __x.data() + __x.size(),
310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                       __y.data(), __y.data() + __y.size()) < 0;
311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class charT> class ctype
314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
31583eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS ctype_base
316b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant{
317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
31853e27639669f8f05c77ea4ef60063667d31dd674Marshall Clow#ifdef __GLIBC__
31962a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    typedef unsigned short mask;
320c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask space  = _ISspace;
321c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask print  = _ISprint;
322c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask cntrl  = _IScntrl;
323c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask upper  = _ISupper;
324c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask lower  = _ISlower;
325c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask alpha  = _ISalpha;
326c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask digit  = _ISdigit;
327c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask punct  = _ISpunct;
328c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask xdigit = _ISxdigit;
329c512df1950baf9466843b2943855356c031fec08David Chisnall    static const mask blank  = _ISblank;
330a22d2addb1287a7642bfcb211ae2cb21890d1cbdMarshall Clow#elif defined(_WIN32)
3313c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant    typedef unsigned short mask;
33292a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask space  = _SPACE;
33392a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask print  = _BLANK|_PUNCT|_ALPHA|_DIGIT;
33492a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask cntrl  = _CONTROL;
33592a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask upper  = _UPPER;
33692a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask lower  = _LOWER;
33792a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask alpha  = _ALPHA;
33892a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask digit  = _DIGIT;
33992a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask punct  = _PUNCT;
34092a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask xdigit = _HEX;
34192a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant    static const mask blank  = _BLANK;
342a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(EMSCRIPTEN) || defined(__NetBSD__)
34353e27639669f8f05c77ea4ef60063667d31dd674Marshall Clow#ifdef __APPLE__
344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef __uint32_t mask;
34553e27639669f8f05c77ea4ef60063667d31dd674Marshall Clow#elif defined(__FreeBSD__)
346c512df1950baf9466843b2943855356c031fec08David Chisnall    typedef unsigned long mask;
347a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif defined(EMSCRIPTEN) ||  defined(__NetBSD__)
348fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant    typedef unsigned short mask;
34962a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt#endif
350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask space  = _CTYPE_S;
351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask print  = _CTYPE_R;
352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask cntrl  = _CTYPE_C;
353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask upper  = _CTYPE_U;
354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask lower  = _CTYPE_L;
355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask alpha  = _CTYPE_A;
356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask digit  = _CTYPE_D;
357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask punct  = _CTYPE_P;
358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask xdigit = _CTYPE_X;
359a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger# if defined(__NetBSD__)
360a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger    static const mask blank  = _CTYPE_BL;
361a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger# else
362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask blank  = _CTYPE_B;
363a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger# endif
36453e27639669f8f05c77ea4ef60063667d31dd674Marshall Clow#elif defined(__sun__)
365997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    typedef unsigned int mask;
366997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask space  = _ISSPACE;
367997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask print  = _ISPRINT;
368997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask cntrl  = _ISCNTRL;
369997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask upper  = _ISUPPER;
370997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask lower  = _ISLOWER;
371997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask alpha  = _ISALPHA;
372997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask digit  = _ISDIGIT;
373997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask punct  = _ISPUNCT;
374997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask xdigit = _ISXDIGIT;
375997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    static const mask blank  = _ISBLANK;
376fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant#else  // __GLIBC__ || _WIN32 || __APPLE__ || __FreeBSD__ || EMSCRIPTEN || __sun__
37711624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    typedef unsigned long mask;
37811624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask space  = 1<<0;
37911624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask print  = 1<<1;
38011624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask cntrl  = 1<<2;
38111624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask upper  = 1<<3;
38211624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask lower  = 1<<4;
38311624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask alpha  = 1<<5;
38411624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask digit  = 1<<6;
38511624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask punct  = 1<<7;
38611624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask xdigit = 1<<8;
38711624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant    static const mask blank  = 1<<9;
38811624459ef27e06ef2d8e71ec2d35bdd334dbbd9Howard Hinnant#endif  // __GLIBC__ || _WIN32 || __APPLE__ || __FreeBSD__
389bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask alnum  = alpha | digit;
390bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const mask graph  = alnum | punct;
391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE ctype_base() {}
393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
394bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
39583eade6abb414e0e814977921bcb6e46853cae03Howard Hinnanttemplate <class _CharT> class _LIBCPP_TYPE_VIS ctype;
396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
39883eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS ctype<wchar_t>
399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public locale::facet,
400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      public ctype_base
401bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
403bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef wchar_t char_type;
404324bb03bb94f67ae7f9092810e4e4f6bd8bf506eHoward Hinnant
405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit ctype(size_t __refs = 0)
407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : locale::facet(__refs) {}
408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool is(mask __m, char_type __c) const
411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
412bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_is(__m, __c);
413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* is(const char_type* __low, const char_type* __high, mask* __vec) const
417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_is(__low, __high, __vec);
419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
420bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
421bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
422bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* scan_is(mask __m, const char_type* __low, const char_type* __high) const
423bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_scan_is(__m, __low, __high);
425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* scan_not(mask __m, const char_type* __low, const char_type* __high) const
429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
430bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_scan_not(__m, __low, __high);
431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type toupper(char_type __c) const
435bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_toupper(__c);
437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
440bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* toupper(char_type* __low, const char_type* __high) const
441bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_toupper(__low, __high);
443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
444bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type tolower(char_type __c) const
447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
448bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_tolower(__c);
449bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
450bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
451bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
452bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* tolower(char_type* __low, const char_type* __high) const
453bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
454bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_tolower(__low, __high);
455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type widen(char __c) const
459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_widen(__c);
461bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
462bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
463bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
464bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char* widen(const char* __low, const char* __high, char_type* __to) const
465bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_widen(__low, __high, __to);
467bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
468bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
469bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
470bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char narrow(char_type __c, char __dfault) const
471bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
472bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_narrow(__c, __dfault);
473bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
474bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
475bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
476bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* narrow(const char_type* __low, const char_type* __high, char __dfault, char* __to) const
477bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
478bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_narrow(__low, __high, __dfault, __to);
479bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
480bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
481bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale::id id;
482bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
483bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
484bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~ctype();
485bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual bool do_is(mask __m, char_type __c) const;
486bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_is(const char_type* __low, const char_type* __high, mask* __vec) const;
487bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_scan_is(mask __m, const char_type* __low, const char_type* __high) const;
488bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_scan_not(mask __m, const char_type* __low, const char_type* __high) const;
489bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_toupper(char_type) const;
490bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_toupper(char_type* __low, const char_type* __high) const;
491bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_tolower(char_type) const;
492bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_tolower(char_type* __low, const char_type* __high) const;
493bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_widen(char) const;
494bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char* do_widen(const char* __low, const char* __high, char_type* __dest) const;
495bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char do_narrow(char_type, char __dfault) const;
496bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_narrow(const char_type* __low, const char_type* __high, char __dfault, char* __dest) const;
497bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
498bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
499bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
50083eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS ctype<char>
501bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public locale::facet, public ctype_base
502bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
503bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const mask* __tab_;
504bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool        __del_;
505bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
506bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char char_type;
507bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
508bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit ctype(const mask* __tab = 0, bool __del = false, size_t __refs = 0);
509bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
510bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
511bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool is(mask __m, char_type __c) const
512bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
513ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        return isascii(__c) ? __tab_[static_cast<int>(__c)] & __m : false;
514bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
515bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
516bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
517bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* is(const char_type* __low, const char_type* __high, mask* __vec) const
518bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
519bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (; __low != __high; ++__low, ++__vec)
520ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            *__vec = isascii(*__low) ? __tab_[static_cast<int>(*__low)] : 0;
521bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __low;
522bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
523bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
524bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
525bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* scan_is (mask __m, const char_type* __low, const char_type* __high) const
526bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
527bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (; __low != __high; ++__low)
528ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if (isascii(*__low) && (__tab_[static_cast<int>(*__low)] & __m))
529bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
530bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __low;
531bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
532bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
533bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
534bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* scan_not(mask __m, const char_type* __low, const char_type* __high) const
535bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
536bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (; __low != __high; ++__low)
537ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if (!(isascii(*__low) && (__tab_[static_cast<int>(*__low)] & __m)))
538bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
539bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __low;
540bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
541bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
542bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
543bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type toupper(char_type __c) const
544bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
545bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_toupper(__c);
546bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
547bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
548bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
549bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* toupper(char_type* __low, const char_type* __high) const
550bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
551bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_toupper(__low, __high);
552bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
553bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
554bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
555bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type tolower(char_type __c) const
556bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
557bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_tolower(__c);
558bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
559bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
560bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
561bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char_type* tolower(char_type* __low, const char_type* __high) const
562bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
563bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_tolower(__low, __high);
564bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
565bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
566bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
567bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type widen(char __c) const
568bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
569bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_widen(__c);
570bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
571bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
572bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
573bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char* widen(const char* __low, const char* __high, char_type* __to) const
574bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
575bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_widen(__low, __high, __to);
576bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
577bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
578bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
579bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char narrow(char_type __c, char __dfault) const
580bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
581bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_narrow(__c, __dfault);
582bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
583bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
584bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
585bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char* narrow(const char_type* __low, const char_type* __high, char __dfault, char* __to) const
586bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
587bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_narrow(__low, __high, __dfault, __to);
588bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
589bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
590bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale::id id;
591bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
592adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant#ifdef _CACHED_RUNES
593bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const size_t table_size = _CACHED_RUNES;
594adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant#else
595adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant    static const size_t table_size = 256;  // FIXME: Don't hardcode this.
596adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant#endif
597c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    _LIBCPP_ALWAYS_INLINE const mask* table() const  _NOEXCEPT {return __tab_;}
598c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    static const mask* classic_table()  _NOEXCEPT;
599fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant#if defined(__GLIBC__) || defined(EMSCRIPTEN)
60062a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    static const int* __classic_upper_table() _NOEXCEPT;
60162a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    static const int* __classic_lower_table() _NOEXCEPT;
602e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#endif
603a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#if defined(__NetBSD__)
604a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger    static const short* __classic_upper_table() _NOEXCEPT;
605a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger    static const short* __classic_lower_table() _NOEXCEPT;
606a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#endif
607bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
608bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
609bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~ctype();
610bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_toupper(char_type __c) const;
611bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_toupper(char_type* __low, const char_type* __high) const;
612bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_tolower(char_type __c) const;
613bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_tolower(char_type* __low, const char_type* __high) const;
614bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_widen(char __c) const;
615bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char* do_widen(const char* __low, const char* __high, char_type* __to) const;
616bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char do_narrow(char_type __c, char __dfault) const;
617bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char* do_narrow(const char_type* __low, const char_type* __high, char __dfault, char* __to) const;
618bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
619bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
620bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class CharT> class ctype_byname;
621bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
62283eade6abb414e0e814977921bcb6e46853cae03Howard Hinnanttemplate <class _CharT> class _LIBCPP_TYPE_VIS ctype_byname;
623bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
624bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
62583eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS ctype_byname<char>
626bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public ctype<char>
627bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
628bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale_t __l;
629bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
630bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
631bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit ctype_byname(const char*, size_t = 0);
632bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit ctype_byname(const string&, size_t = 0);
633bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
634bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
635bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~ctype_byname();
636bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_toupper(char_type) const;
637bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_toupper(char_type* __low, const char_type* __high) const;
638bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_tolower(char_type) const;
639bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_tolower(char_type* __low, const char_type* __high) const;
640bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
641bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
642bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
64383eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS ctype_byname<wchar_t>
644bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public ctype<wchar_t>
645bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
646bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale_t __l;
647bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
648bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
649bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit ctype_byname(const char*, size_t = 0);
650bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit ctype_byname(const string&, size_t = 0);
651bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
652bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
653bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~ctype_byname();
654bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual bool do_is(mask __m, char_type __c) const;
655bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_is(const char_type* __low, const char_type* __high, mask* __vec) const;
656bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_scan_is(mask __m, const char_type* __low, const char_type* __high) const;
657bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_scan_not(mask __m, const char_type* __low, const char_type* __high) const;
658bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_toupper(char_type) const;
659bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_toupper(char_type* __low, const char_type* __high) const;
660bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_tolower(char_type) const;
661bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_tolower(char_type* __low, const char_type* __high) const;
662bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_widen(char) const;
663bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char* do_widen(const char* __low, const char* __high, char_type* __dest) const;
664bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char do_narrow(char_type, char __dfault) const;
665bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual const char_type* do_narrow(const char_type* __low, const char_type* __high, char __dfault, char* __dest) const;
666bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
667bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
668bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
669bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
670bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
671bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantisspace(_CharT __c, const locale& __loc)
672bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
673bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::space, __c);
674bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
675bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
676bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
677bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
678bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
679bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantisprint(_CharT __c, const locale& __loc)
680bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
681bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::print, __c);
682bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
683bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
684bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
685bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
686bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
687bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantiscntrl(_CharT __c, const locale& __loc)
688bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
689bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::cntrl, __c);
690bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
691bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
692bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
693bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
694bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
695bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantisupper(_CharT __c, const locale& __loc)
696bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
697bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::upper, __c);
698bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
699bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
700bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
701bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
702bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
703bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantislower(_CharT __c, const locale& __loc)
704bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
705bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::lower, __c);
706bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
707bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
708bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
709bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
710bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
711bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantisalpha(_CharT __c, const locale& __loc)
712bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
713bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alpha, __c);
714bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
715bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
716bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
717bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
718bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
719bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantisdigit(_CharT __c, const locale& __loc)
720bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
721bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::digit, __c);
722bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
723bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
724bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
725bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
726bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
727bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantispunct(_CharT __c, const locale& __loc)
728bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
729bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::punct, __c);
730bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
731bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
732bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
733bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
734bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
735bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantisxdigit(_CharT __c, const locale& __loc)
736bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
737bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::xdigit, __c);
738bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
739bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
740bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
741bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
742bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
743bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantisalnum(_CharT __c, const locale& __loc)
744bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
745bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::alnum, __c);
746bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
747bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
748bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
749bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
750bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
751bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantisgraph(_CharT __c, const locale& __loc)
752bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
753bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).is(ctype_base::graph, __c);
754bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
755bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
756bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
757bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
758bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_CharT
759bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttoupper(_CharT __c, const locale& __loc)
760bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
761bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).toupper(__c);
762bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
763bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
764bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _CharT>
765bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline _LIBCPP_INLINE_VISIBILITY
766bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_CharT
767bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttolower(_CharT __c, const locale& __loc)
768bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
769bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return use_facet<ctype<_CharT> >(__loc).tolower(__c);
770bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
771bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
772bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// codecvt_base
773bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
77483eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS codecvt_base
775bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
776bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
777bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE codecvt_base() {}
778bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    enum result {ok, partial, error, noconv};
779bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
780bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
781bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class internT, class externT, class stateT> class codecvt;
782bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
78383eade6abb414e0e814977921bcb6e46853cae03Howard Hinnanttemplate <class _InternT, class _ExternT, class _StateT> class _LIBCPP_TYPE_VIS codecvt;
784bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
785bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class codecvt<char, char, mbstate_t>
786bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
787bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
78883eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS codecvt<char, char, mbstate_t>
789bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public locale::facet,
790bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      public codecvt_base
791bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
792bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
793bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char      intern_type;
794bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char      extern_type;
795bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef mbstate_t state_type;
796bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
797bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
798bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt(size_t __refs = 0)
799bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : locale::facet(__refs) {}
800bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
801bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
802bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result out(state_type& __st,
803bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
804bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
805bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
806bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_out(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
807bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
808bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
809bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
810bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result unshift(state_type& __st,
811bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
812bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
813bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_unshift(__st, __to, __to_end, __to_nxt);
814bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
815bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
816bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
817bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result in(state_type& __st,
818bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
819bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const
820bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
821bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_in(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
822bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
823bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
824bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
825c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    int encoding() const  _NOEXCEPT
826bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
827bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_encoding();
828bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
829bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
830bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
831c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    bool always_noconv() const  _NOEXCEPT
832bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
833bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_always_noconv();
834bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
835bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
836bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
837bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const
838bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
839bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_length(__st, __frm, __end, __mx);
840bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
841bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
842bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
843c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    int max_length() const  _NOEXCEPT
844bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
845bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_max_length();
846bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
847bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
848bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale::id id;
849bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
850bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
851bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
852bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt(const char*, size_t __refs = 0)
853bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : locale::facet(__refs) {}
854bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
855bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~codecvt();
856bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
857bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_out(state_type& __st,
858bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
859bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
860bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_in(state_type& __st,
861bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
862bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
863bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_unshift(state_type& __st,
864bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                              extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
865c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual int do_encoding() const  _NOEXCEPT;
866c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual bool do_always_noconv() const  _NOEXCEPT;
867bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual int do_length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const;
868c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual int do_max_length() const  _NOEXCEPT;
869bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
870bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
871bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class codecvt<wchar_t, char, mbstate_t>
872bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
873bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
87483eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS codecvt<wchar_t, char, mbstate_t>
875bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public locale::facet,
876bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      public codecvt_base
877bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
878bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale_t __l;
879bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
880bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef wchar_t   intern_type;
881bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char      extern_type;
882bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef mbstate_t state_type;
883bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
884bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt(size_t __refs = 0);
885bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
886bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
887bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result out(state_type& __st,
888bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
889bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
890bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
891bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_out(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
892bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
893bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
894bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
895bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result unshift(state_type& __st,
896bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
897bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
898bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_unshift(__st, __to, __to_end, __to_nxt);
899bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
900bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
901bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
902bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result in(state_type& __st,
903bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
904bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const
905bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
906bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_in(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
907bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
908bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
909bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
910c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    int encoding() const  _NOEXCEPT
911bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
912bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_encoding();
913bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
914bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
915bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
916c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    bool always_noconv() const  _NOEXCEPT
917bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
918bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_always_noconv();
919bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
920bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
921bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
922bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const
923bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
924bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_length(__st, __frm, __end, __mx);
925bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
926bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
927bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
928c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    int max_length() const  _NOEXCEPT
929bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
930bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_max_length();
931bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
932bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
933bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale::id id;
934bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
935bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
936bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt(const char*, size_t __refs = 0);
937bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
938bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~codecvt();
939bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
940bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_out(state_type& __st,
941bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
942bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
943bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_in(state_type& __st,
944bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
945bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
946bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_unshift(state_type& __st,
947bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                              extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
948c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual int do_encoding() const  _NOEXCEPT;
949c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual bool do_always_noconv() const  _NOEXCEPT;
950bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const;
951c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual int do_max_length() const  _NOEXCEPT;
952bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
953bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
954bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class codecvt<char16_t, char, mbstate_t>
955bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
956bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
95783eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS codecvt<char16_t, char, mbstate_t>
958bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public locale::facet,
959bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      public codecvt_base
960bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
961bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
962bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char16_t  intern_type;
963bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char      extern_type;
964bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef mbstate_t state_type;
965bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
966bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
967bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt(size_t __refs = 0)
968bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : locale::facet(__refs) {}
969bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
970bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
971bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result out(state_type& __st,
972bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
973bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
974bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
975bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_out(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
976bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
977bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
978bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
979bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result unshift(state_type& __st,
980bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
981bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
982bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_unshift(__st, __to, __to_end, __to_nxt);
983bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
984bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
985bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
986bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result in(state_type& __st,
987bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
988bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const
989bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
990bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_in(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
991bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
992bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
993bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
994c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    int encoding() const  _NOEXCEPT
995bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
996bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_encoding();
997bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
998bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
999bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1000c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    bool always_noconv() const  _NOEXCEPT
1001bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1002bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_always_noconv();
1003bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1004bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1005bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1006bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const
1007bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1008bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_length(__st, __frm, __end, __mx);
1009bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1010bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1011bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1012c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    int max_length() const  _NOEXCEPT
1013bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1014bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_max_length();
1015bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1016bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1017bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale::id id;
1018bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1019bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
1020bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1021bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt(const char*, size_t __refs = 0)
1022bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : locale::facet(__refs) {}
1023bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1024bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~codecvt();
1025bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1026bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_out(state_type& __st,
1027bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
1028bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
1029bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_in(state_type& __st,
1030bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
1031bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
1032bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_unshift(state_type& __st,
1033bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                              extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
1034c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual int do_encoding() const  _NOEXCEPT;
1035c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual bool do_always_noconv() const  _NOEXCEPT;
1036bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const;
1037c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual int do_max_length() const  _NOEXCEPT;
1038bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1039bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1040bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class codecvt<char32_t, char, mbstate_t>
1041bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1042bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
104383eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS codecvt<char32_t, char, mbstate_t>
1044bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public locale::facet,
1045bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      public codecvt_base
1046bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1047bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
1048bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char32_t  intern_type;
1049bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char      extern_type;
1050bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef mbstate_t state_type;
1051bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1052bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1053bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt(size_t __refs = 0)
1054bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : locale::facet(__refs) {}
1055bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1056bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1057bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result out(state_type& __st,
1058bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant               const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
1059bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant               extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
1060bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1061bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_out(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
1062bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1063bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1064bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1065bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result unshift(state_type& __st,
1066bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                   extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const
1067bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1068bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_unshift(__st, __to, __to_end, __to_nxt);
1069bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1070bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1071bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1072bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    result in(state_type& __st,
1073bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant              const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
1074bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant              intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const
1075bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1076bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_in(__st, __frm, __frm_end, __frm_nxt, __to, __to_end, __to_nxt);
1077bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1078bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1079bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1080c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    int encoding() const  _NOEXCEPT
1081bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1082bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_encoding();
1083bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1084bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1085bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1086c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    bool always_noconv() const  _NOEXCEPT
1087bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1088bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_always_noconv();
1089bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1090bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1091bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1092bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int length(state_type& __st, const extern_type* __frm, const extern_type* __end, size_t __mx) const
1093bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1094bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_length(__st, __frm, __end, __mx);
1095bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1096bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1097bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1098c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    int max_length() const  _NOEXCEPT
1099bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return do_max_length();
1101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale::id id;
1104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
1106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt(const char*, size_t __refs = 0)
1108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : locale::facet(__refs) {}
1109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~codecvt();
1111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_out(state_type& __st,
1113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
1114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                          extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
1115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_in(state_type& __st,
1116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
1117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
1118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual result do_unshift(state_type& __st,
1119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                              extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
1120c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual int do_encoding() const  _NOEXCEPT;
1121c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual bool do_always_noconv() const  _NOEXCEPT;
1122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end, size_t __mx) const;
1123c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant    virtual int do_max_length() const  _NOEXCEPT;
1124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class _InternT, class _ExternT, class _StateT> class codecvt_byname
1127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _InternT, class _ExternT, class _StateT>
112983eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS codecvt_byname
1130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public codecvt<_InternT, _ExternT, _StateT>
1131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
1133b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant    _LIBCPP_ALWAYS_INLINE
1134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt_byname(const char* __nm, size_t __refs = 0)
1135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : codecvt<_InternT, _ExternT, _StateT>(__nm, __refs) {}
1136b0be42b2ce0dbde30fb64a96586411f35d2b1aedHoward Hinnant    _LIBCPP_ALWAYS_INLINE
1137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit codecvt_byname(const string& __nm, size_t __refs = 0)
1138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : codecvt<_InternT, _ExternT, _StateT>(__nm.c_str(), __refs) {}
1139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
1140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~codecvt_byname();
1141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class _InternT, class _ExternT, class _StateT>
1144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt_byname<_InternT, _ExternT, _StateT>::~codecvt_byname()
1145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1148ff9267709d33962b4ef8f0890321414da86bd3dfHoward Hinnant_LIBCPP_EXTERN_TEMPLATE(class codecvt_byname<char, char, mbstate_t>)
1149ff9267709d33962b4ef8f0890321414da86bd3dfHoward Hinnant_LIBCPP_EXTERN_TEMPLATE(class codecvt_byname<wchar_t, char, mbstate_t>)
1150ff9267709d33962b4ef8f0890321414da86bd3dfHoward Hinnant_LIBCPP_EXTERN_TEMPLATE(class codecvt_byname<char16_t, char, mbstate_t>)
1151ff9267709d33962b4ef8f0890321414da86bd3dfHoward Hinnant_LIBCPP_EXTERN_TEMPLATE(class codecvt_byname<char32_t, char, mbstate_t>)
1152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
115383eade6abb414e0e814977921bcb6e46853cae03Howard Hinnant_LIBCPP_FUNC_VIS void __throw_runtime_error(const char*);
1154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
11559996844df0f22a68a1af6d30c611be1f1ebf1486Howard Hinnanttemplate <size_t _Np>
1156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct __narrow_to_utf8
1157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _OutputIterator, class _CharT>
1159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _OutputIterator
1160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    operator()(_OutputIterator __s, const _CharT* __wb, const _CharT* __we) const;
1161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
1164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct __narrow_to_utf8<8>
1165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _OutputIterator, class _CharT>
1167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _OutputIterator
1169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    operator()(_OutputIterator __s, const _CharT* __wb, const _CharT* __we) const
1170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (; __wb < __we; ++__wb, ++__s)
1172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__s = *__wb;
1173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __s;
1174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
1178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct __narrow_to_utf8<16>
1179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public codecvt<char16_t, char, mbstate_t>
1180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __narrow_to_utf8() : codecvt<char16_t, char, mbstate_t>(1) {}
1183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~__narrow_to_utf8();
1185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _OutputIterator, class _CharT>
1187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _OutputIterator
1189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    operator()(_OutputIterator __s, const _CharT* __wb, const _CharT* __we) const
1190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        result __r = ok;
1192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mbstate_t __mb;
1193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        while (__wb < __we && __r != error)
1194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            const int __sz = 32;
1196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char __buf[__sz];
1197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char* __bn;
1198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            const char16_t* __wn = (const char16_t*)__wb;
1199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __r = do_out(__mb, (const char16_t*)__wb, (const char16_t*)__we, __wn,
1200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         __buf, __buf+__sz, __bn);
1201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__r == codecvt_base::error || __wn == (const char16_t*)__wb)
1202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                __throw_runtime_error("locale not supported");
1203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (const char* __p = __buf; __p < __bn; ++__p, ++__s)
1204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *__s = *__p;
1205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __wb = (const _CharT*)__wn;
1206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __s;
1208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
1212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct __narrow_to_utf8<32>
1213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public codecvt<char32_t, char, mbstate_t>
1214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __narrow_to_utf8() : codecvt<char32_t, char, mbstate_t>(1) {}
1217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~__narrow_to_utf8();
1219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _OutputIterator, class _CharT>
1221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _OutputIterator
1223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    operator()(_OutputIterator __s, const _CharT* __wb, const _CharT* __we) const
1224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        result __r = ok;
1226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mbstate_t __mb;
1227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        while (__wb < __we && __r != error)
1228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            const int __sz = 32;
1230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char __buf[__sz];
1231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char* __bn;
1232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            const char32_t* __wn = (const char32_t*)__wb;
1233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __r = do_out(__mb, (const char32_t*)__wb, (const char32_t*)__we, __wn,
1234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                         __buf, __buf+__sz, __bn);
1235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__r == codecvt_base::error || __wn == (const char32_t*)__wb)
1236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                __throw_runtime_error("locale not supported");
1237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (const char* __p = __buf; __p < __bn; ++__p, ++__s)
1238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *__s = *__p;
1239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __wb = (const _CharT*)__wn;
1240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __s;
1242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
12459996844df0f22a68a1af6d30c611be1f1ebf1486Howard Hinnanttemplate <size_t _Np>
1246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct __widen_from_utf8
1247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _OutputIterator>
1249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _OutputIterator
1250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    operator()(_OutputIterator __s, const char* __nb, const char* __ne) const;
1251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
1254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct __widen_from_utf8<8>
1255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _OutputIterator>
1257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _OutputIterator
1259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    operator()(_OutputIterator __s, const char* __nb, const char* __ne) const
1260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (; __nb < __ne; ++__nb, ++__s)
1262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__s = *__nb;
1263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __s;
1264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
1268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct __widen_from_utf8<16>
1269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public codecvt<char16_t, char, mbstate_t>
1270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __widen_from_utf8() : codecvt<char16_t, char, mbstate_t>(1) {}
1273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~__widen_from_utf8();
1275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _OutputIterator>
1277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _OutputIterator
1279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    operator()(_OutputIterator __s, const char* __nb, const char* __ne) const
1280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        result __r = ok;
1282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mbstate_t __mb;
1283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        while (__nb < __ne && __r != error)
1284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            const int __sz = 32;
1286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char16_t __buf[__sz];
1287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char16_t* __bn;
1288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            const char* __nn = __nb;
1289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __r = do_in(__mb, __nb, __ne - __nb > __sz ? __nb+__sz : __ne, __nn,
1290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        __buf, __buf+__sz, __bn);
1291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__r == codecvt_base::error || __nn == __nb)
1292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                __throw_runtime_error("locale not supported");
1293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (const char16_t* __p = __buf; __p < __bn; ++__p, ++__s)
1294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *__s = (wchar_t)*__p;
1295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __nb = __nn;
1296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __s;
1298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
1302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct __widen_from_utf8<32>
1303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public codecvt<char32_t, char, mbstate_t>
1304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __widen_from_utf8() : codecvt<char32_t, char, mbstate_t>(1) {}
1307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~__widen_from_utf8();
1309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class _OutputIterator>
1311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE
1312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _OutputIterator
1313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    operator()(_OutputIterator __s, const char* __nb, const char* __ne) const
1314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        result __r = ok;
1316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mbstate_t __mb;
1317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        while (__nb < __ne && __r != error)
1318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            const int __sz = 32;
1320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char32_t __buf[__sz];
1321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            char32_t* __bn;
1322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            const char* __nn = __nb;
1323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __r = do_in(__mb, __nb, __ne - __nb > __sz ? __nb+__sz : __ne, __nn,
1324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                        __buf, __buf+__sz, __bn);
1325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__r == codecvt_base::error || __nn == __nb)
1326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                __throw_runtime_error("locale not supported");
1327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (const char32_t* __p = __buf; __p < __bn; ++__p, ++__s)
1328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *__s = (wchar_t)*__p;
1329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __nb = __nn;
1330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __s;
1332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class charT> class numpunct
1336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
133783eade6abb414e0e814977921bcb6e46853cae03Howard Hinnanttemplate <class _CharT> class _LIBCPP_TYPE_VIS numpunct;
1338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
134083eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS numpunct<char>
1341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public locale::facet
1342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
1344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char char_type;
1345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef basic_string<char_type> string_type;
1346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit numpunct(size_t __refs = 0);
1348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE char_type decimal_point() const {return do_decimal_point();}
1350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE char_type thousands_sep() const {return do_thousands_sep();}
1351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE string grouping() const         {return do_grouping();}
1352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE string_type truename() const    {return do_truename();}
1353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE string_type falsename() const   {return do_falsename();}
1354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale::id id;
1356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
1358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~numpunct();
1359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_decimal_point() const;
1360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_thousands_sep() const;
1361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string do_grouping() const;
1362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string_type do_truename() const;
1363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string_type do_falsename() const;
1364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type __decimal_point_;
1366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type __thousands_sep_;
1367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string __grouping_;
1368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
137183eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS numpunct<wchar_t>
1372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public locale::facet
1373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
1375bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef wchar_t char_type;
1376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef basic_string<char_type> string_type;
1377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit numpunct(size_t __refs = 0);
1379bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE char_type decimal_point() const {return do_decimal_point();}
1381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE char_type thousands_sep() const {return do_thousands_sep();}
1382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE string grouping() const         {return do_grouping();}
1383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE string_type truename() const    {return do_truename();}
1384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    _LIBCPP_ALWAYS_INLINE string_type falsename() const   {return do_falsename();}
1385bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale::id id;
1387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
1389bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~numpunct();
1390bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_decimal_point() const;
1391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual char_type do_thousands_sep() const;
1392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string do_grouping() const;
1393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string_type do_truename() const;
1394bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    virtual string_type do_falsename() const;
1395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type __decimal_point_;
1397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char_type __thousands_sep_;
1398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string __grouping_;
1399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1401bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <class charT> class numpunct_byname
1402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
140383eade6abb414e0e814977921bcb6e46853cae03Howard Hinnanttemplate <class charT> class _LIBCPP_TYPE_VIS numpunct_byname;
1404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
140683eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS numpunct_byname<char>
1407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant: public numpunct<char>
1408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
1410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef char char_type;
1411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef basic_string<char_type> string_type;
1412bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit numpunct_byname(const char* __nm, size_t __refs = 0);
1414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit numpunct_byname(const string& __nm, size_t __refs = 0);
1415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
1417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~numpunct_byname();
1418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprivate:
1420bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void __init(const char*);
1421bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1422bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1423bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
142483eade6abb414e0e814977921bcb6e46853cae03Howard Hinnantclass _LIBCPP_TYPE_VIS numpunct_byname<wchar_t>
1425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant: public numpunct<wchar_t>
1426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
1428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef wchar_t char_type;
1429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef basic_string<char_type> string_type;
1430bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit numpunct_byname(const char* __nm, size_t __refs = 0);
1432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit numpunct_byname(const string& __nm, size_t __refs = 0);
1433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprotected:
1435bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~numpunct_byname();
1436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprivate:
1438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void __init(const char*);
1439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
1440bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1441bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_END_NAMESPACE_STD
1442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#endif  // _LIBCPP___LOCALE
1444