00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef _CPP_BITS_LOCCORE_H
00035 #define _CPP_BITS_LOCCORE_H 1
00036
00037 #pragma GCC system_header
00038
00039 #include <bits/c++config.h>
00040 #include <bits/c++locale.h>
00041 #include <bits/std_climits.h>
00042 #include <bits/std_string.h>
00043 #include <bits/std_cctype.h>
00044 #include <bits/functexcept.h>
00045
00046 namespace std
00047 {
00048
00049 #ifdef _GLIBCPP_USE_WCHAR_T
00050 # define _GLIBCPP_NUM_FACETS 26
00051 #else
00052 # define _GLIBCPP_NUM_FACETS 13
00053 #endif
00054
00055
00056 template<typename _Tp, typename _Alloc>
00057 class vector;
00058 class locale;
00059
00060
00061 template<typename _CharT>
00062 inline bool
00063 isspace(_CharT, const locale&);
00064
00065 template<typename _CharT>
00066 inline bool
00067 isprint(_CharT, const locale&);
00068
00069 template<typename _CharT>
00070 inline bool
00071 iscntrl(_CharT, const locale&);
00072
00073 template<typename _CharT>
00074 inline bool
00075 isupper(_CharT, const locale&);
00076
00077 template<typename _CharT>
00078 inline bool
00079 islower(_CharT, const locale&);
00080
00081 template<typename _CharT>
00082 inline bool
00083 isalpha(_CharT, const locale&);
00084
00085 template<typename _CharT>
00086 inline bool
00087 isdigit(_CharT, const locale&);
00088
00089 template<typename _CharT>
00090 inline bool
00091 ispunct(_CharT, const locale&);
00092
00093 template<typename _CharT>
00094 inline bool
00095 isxdigit(_CharT, const locale&);
00096
00097 template<typename _CharT>
00098 inline bool
00099 isalnum(_CharT, const locale&);
00100
00101 template<typename _CharT>
00102 inline bool
00103 isgraph(_CharT, const locale&);
00104
00105 template<typename _CharT>
00106 inline _CharT
00107 toupper(_CharT, const locale&);
00108
00109 template<typename _CharT>
00110 inline _CharT
00111 tolower(_CharT, const locale&);
00112
00113
00114
00115 class ctype_base;
00116 template<typename _CharT>
00117 class ctype;
00118 template<> class ctype<char>;
00119 #ifdef _GLIBCPP_USE_WCHAR_T
00120 template<> class ctype<wchar_t>;
00121 #endif
00122 template<typename _CharT>
00123 class ctype_byname;
00124
00125
00126 class codecvt_base;
00127 template<typename _InternT, typename _ExternT, typename _StateT>
00128 class codecvt;
00129 template<> class codecvt<char, char, mbstate_t>;
00130 #ifdef _GLIBCPP_USE_WCHAR_T
00131 template<> class codecvt<wchar_t, char, mbstate_t>;
00132 #endif
00133 template<typename _InternT, typename _ExternT, typename _StateT>
00134 class codecvt_byname;
00135
00136
00137 template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
00138 class num_get;
00139 template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
00140 class num_put;
00141 template<typename _CharT> class numpunct;
00142 template<typename _CharT> class numpunct_byname;
00143
00144
00145 template<typename _CharT>
00146 class collate;
00147 template<typename _CharT> class
00148 collate_byname;
00149
00150
00151 class time_base;
00152 template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
00153 class time_get;
00154 template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
00155 class time_get_byname;
00156 template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
00157 class time_put;
00158 template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
00159 class time_put_byname;
00160
00161
00162 class money_base;
00163 template<typename _CharT, typename _InIter = istreambuf_iterator<_CharT> >
00164 class money_get;
00165 template<typename _CharT, typename _OutIter = ostreambuf_iterator<_CharT> >
00166 class money_put;
00167 template<typename _CharT, bool _Intl = false>
00168 class moneypunct;
00169 template<typename _CharT, bool _Intl = false>
00170 class moneypunct_byname;
00171
00172
00173 class messages_base;
00174 template<typename _CharT>
00175 class messages;
00176 template<typename _CharT>
00177 class messages_byname;
00178
00179
00180 class locale
00181 {
00182 public:
00183
00184 typedef unsigned int category;
00185
00186
00187 class facet;
00188 class id;
00189 class _Impl;
00190
00191 friend class facet;
00192 friend class _Impl;
00193
00194 template<typename _Facet>
00195 friend const _Facet&
00196 use_facet(const locale&);
00197
00198 template<typename _Facet>
00199 friend bool
00200 has_facet(const locale&) throw();
00201
00202
00203
00204 static const category none = 0;
00205 static const category ctype = 1L << 0;
00206 static const category numeric = 1L << 1;
00207 static const category collate = 1L << 2;
00208 static const category time = 1L << 3;
00209 static const category monetary = 1L << 4;
00210 static const category messages = 1L << 5;
00211 static const category all = (collate | ctype | monetary |
00212 numeric | time | messages);
00213
00214
00215 locale() throw();
00216
00217 locale(const locale& __other) throw();
00218
00219 explicit
00220 locale(const char* __std_name);
00221
00222 locale(const locale& __base, const char* __s, category __cat);
00223
00224 locale(const locale& __base, const locale& __add, category __cat);
00225
00226 template<typename _Facet>
00227 locale(const locale& __other, _Facet* __f);
00228
00229 ~locale() throw();
00230
00231 const locale&
00232 operator=(const locale& __other) throw();
00233
00234 template<typename _Facet>
00235 locale
00236 combine(const locale& __other);
00237
00238
00239 string
00240 name() const;
00241
00242 bool
00243 operator==(const locale& __other) const throw ();
00244
00245 inline bool
00246 operator!=(const locale& __other) const throw ()
00247 { return !(this->operator==(__other)); }
00248
00249 template<typename _Char, typename _Traits, typename _Alloc>
00250 bool
00251 operator()(const basic_string<_Char, _Traits, _Alloc>& __s1,
00252 const basic_string<_Char, _Traits, _Alloc>& __s2) const;
00253
00254
00255 static locale
00256 global(const locale&);
00257
00258 static const locale&
00259 classic();
00260
00261 private:
00262
00263 _Impl* _M_impl;
00264
00265
00266 static _Impl* _S_classic;
00267
00268
00269 static _Impl* _S_global;
00270
00271 static const size_t _S_num_categories = 6;
00272 static const size_t _S_num_facets = _GLIBCPP_NUM_FACETS;
00273
00274 explicit
00275 locale(_Impl*) throw();
00276
00277 static inline void
00278 _S_initialize()
00279 { if (!_S_classic) classic(); }
00280
00281 static category
00282 _S_normalize_category(category);
00283
00284 void
00285 _M_coalesce(const locale& __base, const locale& __add, category __cat);
00286 };
00287
00288
00289
00290 class locale::_Impl
00291 {
00292 public:
00293
00294 typedef vector<facet*, allocator<facet*> > __vec_facet;
00295
00296
00297 friend class locale;
00298 friend class locale::facet;
00299
00300 template<typename _Facet>
00301 friend const _Facet&
00302 use_facet(const locale&);
00303
00304 template<typename _Facet>
00305 friend bool
00306 has_facet(const locale&) throw();
00307
00308 private:
00309
00310 size_t _M_references;
00311 __vec_facet* _M_facets;
00312 string _M_names[_S_num_categories];
00313 __c_locale _M_c_locale;
00314 static const locale::id* const _S_id_ctype[];
00315 static const locale::id* const _S_id_numeric[];
00316 static const locale::id* const _S_id_collate[];
00317 static const locale::id* const _S_id_time[];
00318 static const locale::id* const _S_id_monetary[];
00319 static const locale::id* const _S_id_messages[];
00320 static const locale::id* const* const _S_facet_categories[];
00321
00322 inline void
00323 _M_add_reference() throw()
00324 { ++_M_references; }
00325
00326 inline void
00327 _M_remove_reference() throw()
00328 {
00329 if (_M_references-- == 0)
00330 {
00331 try
00332 { delete this; }
00333 catch(...)
00334 { }
00335 }
00336 }
00337
00338 _Impl(const _Impl&, size_t);
00339 _Impl(string __name, size_t);
00340 ~_Impl() throw();
00341
00342 bool
00343 _M_check_same_name()
00344 {
00345 bool __ret = true;
00346 for (size_t i = 0; i < _S_num_categories - 1; ++i)
00347 __ret &= _M_names[i] == _M_names[i + 1];
00348 return __ret;
00349 }
00350 void
00351 _M_replace_categories(const _Impl*, category);
00352
00353 void
00354 _M_replace_category(const _Impl*, const locale::id* const*);
00355
00356 void
00357 _M_replace_facet(const _Impl*, const locale::id*);
00358
00359 void
00360 _M_install_facet(const locale::id*, facet*);
00361
00362 template<typename _Facet>
00363 inline void
00364 _M_init_facet(_Facet* __facet)
00365 { _M_install_facet(&_Facet::id, __facet); }
00366 };
00367
00368 template<typename _Facet>
00369 locale::locale(const locale& __other, _Facet* __f)
00370 {
00371 _M_impl = new _Impl(*__other._M_impl, 1);
00372 _M_impl->_M_install_facet(&_Facet::id, __f);
00373 for (size_t __i = 0; __i < _S_num_categories; ++__i)
00374 _M_impl->_M_names[__i] = "*";
00375 }
00376
00377
00378 class locale::facet
00379 {
00380 friend class locale;
00381 friend class locale::_Impl;
00382
00383 protected:
00384 explicit
00385 facet(size_t __refs = 0) throw();
00386
00387 virtual
00388 ~facet() { };
00389
00390 static void
00391 _S_create_c_locale(__c_locale& __cloc, const char* __s);
00392
00393 static void
00394 _S_destroy_c_locale(__c_locale& __cloc);
00395
00396 private:
00397 size_t _M_references;
00398
00399 void
00400 _M_add_reference() throw();
00401
00402 void
00403 _M_remove_reference() throw();
00404
00405 facet(const facet&);
00406
00407 void
00408 operator=(const facet&);
00409 };
00410
00411
00412
00413 class locale::id
00414 {
00415 private:
00416 friend class locale;
00417 friend class locale::_Impl;
00418 template<typename _Facet>
00419 friend const _Facet&
00420 use_facet(const locale&);
00421 template<typename _Facet>
00422 friend bool
00423 has_facet(const locale&) throw ();
00424
00425
00426
00427
00428 mutable size_t _M_index;
00429
00430
00431 static size_t _S_highwater;
00432
00433 void
00434 operator=(const id&);
00435
00436 id(const id&);
00437
00438 public:
00439
00440
00441
00442 id() { }
00443 };
00444
00445 template<typename _Facet>
00446 const _Facet&
00447 use_facet(const locale& __loc);
00448
00449 template<typename _Facet>
00450 bool
00451 has_facet(const locale& __loc) throw();
00452 }
00453
00454 #endif
00455
00456
00457
00458
00459