master
  1// -*- C++ -*-
  2//===----------------------------------------------------------------------===//
  3//
  4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  5// See https://llvm.org/LICENSE.txt for license information.
  6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  7//
  8//===----------------------------------------------------------------------===//
  9
 10#ifndef _LIBCPP_LOCALE
 11#define _LIBCPP_LOCALE
 12
 13/*
 14    locale synopsis
 15
 16namespace std
 17{
 18
 19class locale
 20{
 21public:
 22    // types:
 23    class facet;
 24    class id;
 25
 26    typedef int category;
 27    static const category // values assigned here are for exposition only
 28        none     = 0x000,
 29        collate  = 0x010,
 30        ctype    = 0x020,
 31        monetary = 0x040,
 32        numeric  = 0x080,
 33        time     = 0x100,
 34        messages = 0x200,
 35        all = collate | ctype | monetary | numeric | time | messages;
 36
 37    // construct/copy/destroy:
 38    locale() noexcept;
 39    locale(const locale& other) noexcept;
 40    explicit locale(const char* std_name);
 41    explicit locale(const string& std_name);
 42    locale(const locale& other, const char* std_name, category);
 43    locale(const locale& other, const string& std_name, category);
 44    template <class Facet> locale(const locale& other, Facet* f);
 45    locale(const locale& other, const locale& one, category);
 46
 47    ~locale(); // not virtual
 48
 49    const locale& operator=(const locale& other) noexcept;
 50
 51    template <class Facet> locale combine(const locale& other) const;
 52
 53    // locale operations:
 54    basic_string<char> name() const;
 55    bool operator==(const locale& other) const;
 56    bool operator!=(const locale& other) const;                              // removed C++20
 57    template <class charT, class Traits, class Allocator>
 58      bool operator()(const basic_string<charT,Traits,Allocator>& s1,
 59                      const basic_string<charT,Traits,Allocator>& s2) const;
 60
 61    // global locale objects:
 62    static locale global(const locale&);
 63    static const locale& classic();
 64};
 65
 66template <class Facet> const Facet& use_facet(const locale&);
 67template <class Facet> bool has_facet(const locale&) noexcept;
 68
 69// 22.3.3, convenience interfaces:
 70template <class charT> bool isspace (charT c, const locale& loc);
 71template <class charT> bool isprint (charT c, const locale& loc);
 72template <class charT> bool iscntrl (charT c, const locale& loc);
 73template <class charT> bool isupper (charT c, const locale& loc);
 74template <class charT> bool islower (charT c, const locale& loc);
 75template <class charT> bool isalpha (charT c, const locale& loc);
 76template <class charT> bool isdigit (charT c, const locale& loc);
 77template <class charT> bool ispunct (charT c, const locale& loc);
 78template <class charT> bool isxdigit(charT c, const locale& loc);
 79template <class charT> bool isalnum (charT c, const locale& loc);
 80template <class charT> bool isgraph (charT c, const locale& loc);
 81template <class charT> charT toupper(charT c, const locale& loc);
 82template <class charT> charT tolower(charT c, const locale& loc);
 83
 84template<class Codecvt, class Elem = wchar_t,
 85         class Wide_alloc = allocator<Elem>,
 86         class Byte_alloc = allocator<char>>
 87class wstring_convert                                      // Removed in C++26
 88{
 89public:
 90    typedef basic_string<char, char_traits<char>, Byte_alloc> byte_string;
 91    typedef basic_string<Elem, char_traits<Elem>, Wide_alloc> wide_string;
 92    typedef typename Codecvt::state_type                      state_type;
 93    typedef typename wide_string::traits_type::int_type       int_type;
 94
 95    wstring_convert(Codecvt* pcvt = new Codecvt);          // before C++14
 96    explicit wstring_convert(Codecvt* pcvt = new Codecvt); // before C++20
 97    wstring_convert() : wstring_convert(new Codecvt) {}    // C++20
 98    explicit wstring_convert(Codecvt* pcvt);               // C++20
 99
100    wstring_convert(Codecvt* pcvt, state_type state);
101    explicit wstring_convert(const byte_string& byte_err,           // explicit in C++14
102                    const wide_string& wide_err = wide_string());
103    wstring_convert(const wstring_convert&) = delete;               // C++14
104    wstring_convert & operator=(const wstring_convert &) = delete;  // C++14
105    ~wstring_convert();
106
107    wide_string from_bytes(char byte);
108    wide_string from_bytes(const char* ptr);
109    wide_string from_bytes(const byte_string& str);
110    wide_string from_bytes(const char* first, const char* last);
111
112    byte_string to_bytes(Elem wchar);
113    byte_string to_bytes(const Elem* wptr);
114    byte_string to_bytes(const wide_string& wstr);
115    byte_string to_bytes(const Elem* first, const Elem* last);
116
117    size_t converted() const; // noexcept in C++14
118    state_type state() const;
119};
120
121template <class Codecvt, class Elem = wchar_t, class Tr = char_traits<Elem>>
122class wbuffer_convert                                               // Removed in C++26
123    : public basic_streambuf<Elem, Tr>
124{
125public:
126    typedef typename Tr::state_type state_type;
127
128    wbuffer_convert(streambuf* bytebuf = 0, Codecvt* pcvt = new Codecvt,
129                    state_type state = state_type());          // before C++14
130    explicit wbuffer_convert(streambuf* bytebuf = nullptr, Codecvt* pcvt = new Codecvt,
131                            state_type state = state_type()); // before C++20
132    wbuffer_convert() : wbuffer_convert(nullptr) {} // C++20
133    explicit wbuffer_convert(streambuf* bytebuf, Codecvt* pcvt = new Codecvt,
134                            state_type state = state_type()); // C++20
135
136    wbuffer_convert(const wbuffer_convert&) = delete;               // C++14
137    wbuffer_convert & operator=(const wbuffer_convert &) = delete;  // C++14
138    ~wbuffer_convert();                                             // C++14
139
140    streambuf* rdbuf() const;
141    streambuf* rdbuf(streambuf* bytebuf);
142
143    state_type state() const;
144};
145
146// 22.4.1 and 22.4.1.3, ctype:
147class ctype_base;
148template <class charT> class ctype;
149template <> class ctype<char>; // specialization
150template <class charT> class ctype_byname;
151template <> class ctype_byname<char>; // specialization
152
153class codecvt_base;
154template <class internT, class externT, class stateT> class codecvt;
155template <class internT, class externT, class stateT> class codecvt_byname;
156
157// 22.4.2 and 22.4.3, numeric:
158template <class charT, class InputIterator> class num_get;
159template <class charT, class OutputIterator> class num_put;
160template <class charT> class numpunct;
161template <class charT> class numpunct_byname;
162
163// 22.4.4, col lation:
164template <class charT> class collate;
165template <class charT> class collate_byname;
166
167// 22.4.5, date and time:
168class time_base;
169template <class charT, class InputIterator> class time_get;
170template <class charT, class InputIterator> class time_get_byname;
171template <class charT, class OutputIterator> class time_put;
172template <class charT, class OutputIterator> class time_put_byname;
173
174// 22.4.6, money:
175class money_base;
176template <class charT, class InputIterator> class money_get;
177template <class charT, class OutputIterator> class money_put;
178template <class charT, bool Intl> class moneypunct;
179template <class charT, bool Intl> class moneypunct_byname;
180
181// 22.4.7, message retrieval:
182class messages_base;
183template <class charT> class messages;
184template <class charT> class messages_byname;
185
186}  // std
187
188*/
189
190#if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
191#  include <__cxx03/locale>
192#else
193#  include <__config>
194
195#  if _LIBCPP_HAS_LOCALIZATION
196
197#    include <__locale>
198#    include <__locale_dir/messages.h>
199#    include <__locale_dir/money.h>
200#    include <__locale_dir/num.h>
201#    include <__locale_dir/time.h>
202#    include <__locale_dir/wbuffer_convert.h>
203#    include <__locale_dir/wstring_convert.h>
204#    include <ios>
205#    include <version>
206
207#    if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
208#      pragma GCC system_header
209#    endif
210
211#  endif // _LIBCPP_HAS_LOCALIZATION
212
213#  if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
214#    include <atomic>
215#    include <concepts>
216#    include <cstdarg>
217#    include <iterator>
218#    include <mutex>
219#    include <optional>
220#    include <stdexcept>
221#    include <type_traits>
222#    include <typeinfo>
223#  endif
224#endif // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
225
226#endif // _LIBCPP_LOCALE