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