1 // Locale support -*- C++ -*- 2 3 // Copyright (C) 1999-2018 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // Under Section 7 of GPL version 3, you are granted additional 17 // permissions described in the GCC Runtime Library Exception, version 18 // 3.1, as published by the Free Software Foundation. 19 20 // You should have received a copy of the GNU General Public License and 21 // a copy of the GCC Runtime Library Exception along with this program; 22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 // <http://www.gnu.org/licenses/>. 24 25 // 26 // ISO C++ 14882: 22.1 Locales 27 // 28 29 #ifndef _GLIBCXX_USE_CXX11_ABI 30 // Instantiations in this file use the old COW std::string ABI unless included 31 // by another file which defines _GLIBCXX_USE_CXX11_ABI=1. Some instantiations 32 // are guarded by a check for !_GLIBCXX_USE_CXX11_ABI so that they are only 33 // instantiated once, because they are not tagged with abi_tag so should not 34 // be instantiated twice. 35 # define _GLIBCXX_USE_CXX11_ABI 0 36 #endif 37 38 #include <locale> 39 40 // Instantiation configuration. 41 #ifndef C 42 # define C char 43 # define C_is_char 44 #endif 45 46 namespace std _GLIBCXX_VISIBILITY(default) 47 { 48 _GLIBCXX_BEGIN_NAMESPACE_VERSION 49 50 // moneypunct, money_get, and money_put 51 #if ! _GLIBCXX_USE_CXX11_ABI 52 template struct __moneypunct_cache<C, false>; 53 template struct __moneypunct_cache<C, true>; 54 #endif 55 _GLIBCXX_BEGIN_NAMESPACE_CXX11 56 template class moneypunct<C, false>; 57 template class moneypunct<C, true>; 58 template class moneypunct_byname<C, false>; 59 template class moneypunct_byname<C, true>; 60 _GLIBCXX_END_NAMESPACE_CXX11 61 _GLIBCXX_BEGIN_NAMESPACE_LDBL_OR_CXX11 62 template class money_get<C, istreambuf_iterator<C> >; 63 template class money_put<C, ostreambuf_iterator<C> >; 64 template 65 istreambuf_iterator<C> 66 money_get<C, istreambuf_iterator<C> >:: 67 _M_extract<true>(istreambuf_iterator<C>, istreambuf_iterator<C>, 68 ios_base&, ios_base::iostate&, string&) const; 69 70 template 71 istreambuf_iterator<C> 72 money_get<C, istreambuf_iterator<C> >:: 73 _M_extract<false>(istreambuf_iterator<C>, istreambuf_iterator<C>, 74 ios_base&, ios_base::iostate&, string&) const; 75 76 template 77 ostreambuf_iterator<C> 78 money_put<C, ostreambuf_iterator<C> >:: 79 _M_insert<true>(ostreambuf_iterator<C>, ios_base&, C, 80 const string_type&) const; 81 82 template 83 ostreambuf_iterator<C> 84 money_put<C, ostreambuf_iterator<C> >:: 85 _M_insert<false>(ostreambuf_iterator<C>, ios_base&, C, 86 const string_type&) const; 87 _GLIBCXX_END_NAMESPACE_LDBL_OR_CXX11 88 89 // numpunct, numpunct_byname, num_get, and num_put 90 #if ! _GLIBCXX_USE_CXX11_ABI 91 template struct __numpunct_cache<C>; 92 #endif 93 _GLIBCXX_BEGIN_NAMESPACE_CXX11 94 template class numpunct<C>; 95 template class numpunct_byname<C>; 96 _GLIBCXX_END_NAMESPACE_CXX11 97 _GLIBCXX_BEGIN_NAMESPACE_LDBL 98 #if ! _GLIBCXX_USE_CXX11_ABI 99 template class num_get<C, istreambuf_iterator<C> >; 100 #endif 101 102 template 103 istreambuf_iterator<C> 104 num_get<C, istreambuf_iterator<C> >:: 105 _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>, 106 ios_base&, ios_base::iostate&, 107 long&) const; 108 109 template 110 istreambuf_iterator<C> 111 num_get<C, istreambuf_iterator<C> >:: 112 _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>, 113 ios_base&, ios_base::iostate&, 114 unsigned short&) const; 115 116 template 117 istreambuf_iterator<C> 118 num_get<C, istreambuf_iterator<C> >:: 119 _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>, 120 ios_base&, ios_base::iostate&, 121 unsigned int&) const; 122 123 template 124 istreambuf_iterator<C> 125 num_get<C, istreambuf_iterator<C> >:: 126 _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>, 127 ios_base&, ios_base::iostate&, 128 unsigned long&) const; 129 130 #ifdef _GLIBCXX_USE_LONG_LONG 131 template 132 istreambuf_iterator<C> 133 num_get<C, istreambuf_iterator<C> >:: 134 _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>, 135 ios_base&, ios_base::iostate&, 136 long long&) const; 137 138 template 139 istreambuf_iterator<C> 140 num_get<C, istreambuf_iterator<C> >:: 141 _M_extract_int(istreambuf_iterator<C>, istreambuf_iterator<C>, 142 ios_base&, ios_base::iostate&, 143 unsigned long long&) const; 144 #endif 145 146 #if ! _GLIBCXX_USE_CXX11_ABI 147 template class num_put<C, ostreambuf_iterator<C> >; 148 149 template 150 ostreambuf_iterator<C> 151 num_put<C, ostreambuf_iterator<C> >:: 152 _M_insert_int(ostreambuf_iterator<C>, ios_base&, C, 153 long) const; 154 155 template 156 ostreambuf_iterator<C> 157 num_put<C, ostreambuf_iterator<C> >:: 158 _M_insert_int(ostreambuf_iterator<C>, ios_base&, C, 159 unsigned long) const; 160 161 #ifdef _GLIBCXX_USE_LONG_LONG 162 template 163 ostreambuf_iterator<C> 164 num_put<C, ostreambuf_iterator<C> >:: 165 _M_insert_int(ostreambuf_iterator<C>, ios_base&, C, 166 long long) const; 167 168 template 169 ostreambuf_iterator<C> 170 num_put<C, ostreambuf_iterator<C> >:: 171 _M_insert_int(ostreambuf_iterator<C>, ios_base&, C, 172 unsigned long long) const; 173 #endif 174 175 template 176 ostreambuf_iterator<C> 177 num_put<C, ostreambuf_iterator<C> >:: 178 _M_insert_float(ostreambuf_iterator<C>, ios_base&, C, char, 179 double) const; 180 181 template 182 ostreambuf_iterator<C> 183 num_put<C, ostreambuf_iterator<C> >:: 184 _M_insert_float(ostreambuf_iterator<C>, ios_base&, C, char, 185 long double) const; 186 #endif 187 _GLIBCXX_END_NAMESPACE_LDBL 188 189 // time_get and time_put 190 #if ! _GLIBCXX_USE_CXX11_ABI 191 template class __timepunct<C>; 192 template struct __timepunct_cache<C>; 193 template class time_put<C, ostreambuf_iterator<C> >; 194 template class time_put_byname<C, ostreambuf_iterator<C> >; 195 #else 196 // Instantiate constructor taking __cxx11::string 197 template time_put_byname<C>::time_put_byname(const string&, size_t); 198 #endif 199 _GLIBCXX_BEGIN_NAMESPACE_CXX11 200 template class time_get<C, istreambuf_iterator<C> >; 201 template class time_get_byname<C, istreambuf_iterator<C> >; 202 _GLIBCXX_END_NAMESPACE_CXX11 203 204 // messages 205 _GLIBCXX_BEGIN_NAMESPACE_CXX11 206 template class messages<C>; 207 template class messages_byname<C>; 208 _GLIBCXX_END_NAMESPACE_CXX11 209 210 // ctype ctype_byname(const string & __s,size_t __refs)211 ctype_byname<C>::ctype_byname(const string& __s, size_t __refs) 212 : ctype_byname(__s.c_str(), __refs) { } 213 214 #if ! _GLIBCXX_USE_CXX11_ABI 215 inline template class __ctype_abstract_base<C>; 216 template class ctype_byname<C>; 217 #endif 218 219 // codecvt 220 #if ! _GLIBCXX_USE_CXX11_ABI 221 inline template class __codecvt_abstract_base<C, char, mbstate_t>; 222 template class codecvt_byname<C, char, mbstate_t>; 223 #else 224 // Instantiate constructor taking __cxx11::string 225 template codecvt_byname<C, char, mbstate_t>::codecvt_byname(const string&, size_t); 226 #endif 227 228 // collate 229 _GLIBCXX_BEGIN_NAMESPACE_CXX11 230 template class collate<C>; 231 template class collate_byname<C>; 232 _GLIBCXX_END_NAMESPACE_CXX11 233 234 // use_facet 235 #if ! _GLIBCXX_USE_CXX11_ABI 236 template 237 const ctype<C>& 238 use_facet<ctype<C> >(const locale&); 239 240 template 241 const codecvt<C, char, mbstate_t>& 242 use_facet<codecvt<C, char, mbstate_t> >(const locale&); 243 #endif 244 245 template 246 const collate<C>& 247 use_facet<collate<C> >(const locale&); 248 249 template 250 const numpunct<C>& 251 use_facet<numpunct<C> >(const locale&); 252 253 #if ! _GLIBCXX_USE_CXX11_ABI 254 template 255 const num_put<C>& 256 use_facet<num_put<C> >(const locale&); 257 258 template 259 const num_get<C>& 260 use_facet<num_get<C> >(const locale&); 261 #endif 262 263 template 264 const moneypunct<C, true>& 265 use_facet<moneypunct<C, true> >(const locale&); 266 267 template 268 const moneypunct<C, false>& 269 use_facet<moneypunct<C, false> >(const locale&); 270 271 template 272 const money_put<C>& 273 use_facet<money_put<C> >(const locale&); 274 275 template 276 const money_get<C>& 277 use_facet<money_get<C> >(const locale&); 278 279 #if ! _GLIBCXX_USE_CXX11_ABI 280 template 281 const __timepunct<C>& 282 use_facet<__timepunct<C> >(const locale&); 283 284 template 285 const time_put<C>& 286 use_facet<time_put<C> >(const locale&); 287 #endif 288 289 template 290 const time_get<C>& 291 use_facet<time_get<C> >(const locale&); 292 293 template 294 const messages<C>& 295 use_facet<messages<C> >(const locale&); 296 297 // has_facet 298 #if ! _GLIBCXX_USE_CXX11_ABI 299 template 300 bool 301 has_facet<ctype<C> >(const locale&); 302 303 template 304 bool 305 has_facet<codecvt<C, char, mbstate_t> >(const locale&); 306 #endif 307 308 template 309 bool 310 has_facet<collate<C> >(const locale&); 311 312 template 313 bool 314 has_facet<numpunct<C> >(const locale&); 315 316 #if ! _GLIBCXX_USE_CXX11_ABI 317 template 318 bool 319 has_facet<num_put<C> >(const locale&); 320 321 template 322 bool 323 has_facet<num_get<C> >(const locale&); 324 #endif 325 326 template 327 bool 328 has_facet<moneypunct<C> >(const locale&); 329 330 template 331 bool 332 has_facet<money_put<C> >(const locale&); 333 334 template 335 bool 336 has_facet<money_get<C> >(const locale&); 337 338 #if ! _GLIBCXX_USE_CXX11_ABI 339 template 340 bool 341 has_facet<__timepunct<C> >(const locale&); 342 343 template 344 bool 345 has_facet<time_put<C> >(const locale&); 346 #endif 347 348 template 349 bool 350 has_facet<time_get<C> >(const locale&); 351 352 template 353 bool 354 has_facet<messages<C> >(const locale&); 355 356 357 #if ! _GLIBCXX_USE_CXX11_ABI 358 // locale functions. 359 template 360 C* 361 __add_grouping<C>(C*, C, char const*, size_t, 362 C const*, C const*); 363 364 template class __pad<C, char_traits<C> >; 365 366 template 367 int 368 __int_to_char(C*, unsigned long, const C*, 369 ios_base::fmtflags, bool); 370 371 #ifdef _GLIBCXX_USE_LONG_LONG 372 template 373 int 374 __int_to_char(C*, unsigned long long, const C*, 375 ios_base::fmtflags, bool); 376 #endif 377 #endif 378 379 _GLIBCXX_END_NAMESPACE_VERSION 380 } // namespace 381 382 // XXX GLIBCXX_ABI Deprecated 383 #if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined C_is_char \ 384 && _GLIBCXX_USE_CXX11_ABI == 0 385 386 #pragma GCC diagnostic ignored "-Wattribute-alias" 387 388 #define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \ 389 extern "C" void ldbl (void) __attribute__ ((alias (#dbl), weak)) 390 391 _GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIjEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_, 392 _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIjEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_); 393 _GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIlEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_, 394 _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIlEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_); 395 _GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intImEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_, 396 _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intImEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_); 397 _GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intItEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_, 398 _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intItEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_); 399 _GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIxEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_, 400 _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIxEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_); 401 _GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIyEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRT_, 402 _ZNKSt7num_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE14_M_extract_intIyEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRT_); 403 _GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIlEES4_S4_RSt8ios_basecT_, 404 _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIlEES3_S3_RSt8ios_basecT_); 405 _GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intImEES4_S4_RSt8ios_basecT_, 406 _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intImEES3_S3_RSt8ios_basecT_); 407 _GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIxEES4_S4_RSt8ios_basecT_, 408 _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIxEES3_S3_RSt8ios_basecT_); 409 _GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIyEES4_S4_RSt8ios_basecT_, 410 _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE13_M_insert_intIyEES3_S3_RSt8ios_basecT_); 411 _GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1287num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIdEES4_S4_RSt8ios_baseccT_, 412 _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIdEES3_S3_RSt8ios_baseccT_); 413 _GLIBCXX_LDBL_COMPAT(_ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIdEES3_S3_RSt8ios_baseccT_, 414 _ZNKSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE15_M_insert_floatIeEES3_S3_RSt8ios_baseccT_); 415 _GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb0EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRSs, 416 _ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb0EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs); 417 _GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1289money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb1EEES4_S4_S4_RSt8ios_baseRSt12_Ios_IostateRSs, 418 _ZNKSt9money_getIcSt19istreambuf_iteratorIcSt11char_traitsIcEEE10_M_extractILb1EEES3_S3_S3_RSt8ios_baseRSt12_Ios_IostateRSs); 419 _GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb0EEES4_S4_RSt8ios_basecRKSs, 420 _ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb0EEES3_S3_RSt8ios_basecRKSs); 421 _GLIBCXX_LDBL_COMPAT(_ZNKSt17__gnu_cxx_ldbl1289money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb1EEES4_S4_RSt8ios_basecRKSs, 422 _ZNKSt9money_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE9_M_insertILb1EEES3_S3_RSt8ios_basecRKSs); 423 424 #endif // _GLIBCXX_LONG_DOUBLE_COMPAT 425