__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