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