libstdc++
codecvt.h
Go to the documentation of this file.
1 // Locale support (codecvt) -*- C++ -*-
2 
3 // Copyright (C) 2000-2019 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 /** @file bits/codecvt.h
26  * This is an internal header file, included by other library headers.
27  * Do not attempt to use it directly. @headername{locale}
28  */
29 
30 //
31 // ISO C++ 14882: 22.2.1.5 Template class codecvt
32 //
33 
34 // Written by Benjamin Kosnik <[email protected]>
35 
36 #ifndef _CODECVT_H
37 #define _CODECVT_H 1
38 
39 #pragma GCC system_header
40 
41 namespace std _GLIBCXX_VISIBILITY(default)
42 {
43 _GLIBCXX_BEGIN_NAMESPACE_VERSION
44 
45  /// Empty base class for codecvt facet [22.2.1.5].
47  {
48  public:
49  enum result
50  {
51  ok,
52  partial,
53  error,
54  noconv
55  };
56  };
57 
58  /**
59  * @brief Common base for codecvt functions.
60  *
61  * This template class provides implementations of the public functions
62  * that forward to the protected virtual functions.
63  *
64  * This template also provides abstract stubs for the protected virtual
65  * functions.
66  */
67  template<typename _InternT, typename _ExternT, typename _StateT>
69  : public locale::facet, public codecvt_base
70  {
71  public:
72  // Types:
73  typedef codecvt_base::result result;
74  typedef _InternT intern_type;
75  typedef _ExternT extern_type;
76  typedef _StateT state_type;
77 
78  // 22.2.1.5.1 codecvt members
79  /**
80  * @brief Convert from internal to external character set.
81  *
82  * Converts input string of intern_type to output string of
83  * extern_type. This is analogous to wcsrtombs. It does this by
84  * calling codecvt::do_out.
85  *
86  * The source and destination character sets are determined by the
87  * facet's locale, internal and external types.
88  *
89  * The characters in [from,from_end) are converted and written to
90  * [to,to_end). from_next and to_next are set to point to the
91  * character following the last successfully converted character,
92  * respectively. If the result needed no conversion, from_next and
93  * to_next are not affected.
94  *
95  * The @a state argument should be initialized if the input is at the
96  * beginning and carried from a previous call if continuing
97  * conversion. There are no guarantees about how @a state is used.
98  *
99  * The result returned is a member of codecvt_base::result. If
100  * all the input is converted, returns codecvt_base::ok. If no
101  * conversion is necessary, returns codecvt_base::noconv. If
102  * the input ends early or there is insufficient space in the
103  * output, returns codecvt_base::partial. Otherwise the
104  * conversion failed and codecvt_base::error is returned.
105  *
106  * @param __state Persistent conversion state data.
107  * @param __from Start of input.
108  * @param __from_end End of input.
109  * @param __from_next Returns start of unconverted data.
110  * @param __to Start of output buffer.
111  * @param __to_end End of output buffer.
112  * @param __to_next Returns start of unused output area.
113  * @return codecvt_base::result.
114  */
115  result
116  out(state_type& __state, const intern_type* __from,
117  const intern_type* __from_end, const intern_type*& __from_next,
118  extern_type* __to, extern_type* __to_end,
119  extern_type*& __to_next) const
120  {
121  return this->do_out(__state, __from, __from_end, __from_next,
122  __to, __to_end, __to_next);
123  }
124 
125  /**
126  * @brief Reset conversion state.
127  *
128  * Writes characters to output that would restore @a state to initial
129  * conditions. The idea is that if a partial conversion occurs, then
130  * the converting the characters written by this function would leave
131  * the state in initial conditions, rather than partial conversion
132  * state. It does this by calling codecvt::do_unshift().
133  *
134  * For example, if 4 external characters always converted to 1 internal
135  * character, and input to in() had 6 external characters with state
136  * saved, this function would write two characters to the output and
137  * set the state to initialized conditions.
138  *
139  * The source and destination character sets are determined by the
140  * facet's locale, internal and external types.
141  *
142  * The result returned is a member of codecvt_base::result. If the
143  * state could be reset and data written, returns codecvt_base::ok. If
144  * no conversion is necessary, returns codecvt_base::noconv. If the
145  * output has insufficient space, returns codecvt_base::partial.
146  * Otherwise the reset failed and codecvt_base::error is returned.
147  *
148  * @param __state Persistent conversion state data.
149  * @param __to Start of output buffer.
150  * @param __to_end End of output buffer.
151  * @param __to_next Returns start of unused output area.
152  * @return codecvt_base::result.
153  */
154  result
155  unshift(state_type& __state, extern_type* __to, extern_type* __to_end,
156  extern_type*& __to_next) const
157  { return this->do_unshift(__state, __to,__to_end,__to_next); }
158 
159  /**
160  * @brief Convert from external to internal character set.
161  *
162  * Converts input string of extern_type to output string of
163  * intern_type. This is analogous to mbsrtowcs. It does this by
164  * calling codecvt::do_in.
165  *
166  * The source and destination character sets are determined by the
167  * facet's locale, internal and external types.
168  *
169  * The characters in [from,from_end) are converted and written to
170  * [to,to_end). from_next and to_next are set to point to the
171  * character following the last successfully converted character,
172  * respectively. If the result needed no conversion, from_next and
173  * to_next are not affected.
174  *
175  * The @a state argument should be initialized if the input is at the
176  * beginning and carried from a previous call if continuing
177  * conversion. There are no guarantees about how @a state is used.
178  *
179  * The result returned is a member of codecvt_base::result. If
180  * all the input is converted, returns codecvt_base::ok. If no
181  * conversion is necessary, returns codecvt_base::noconv. If
182  * the input ends early or there is insufficient space in the
183  * output, returns codecvt_base::partial. Otherwise the
184  * conversion failed and codecvt_base::error is returned.
185  *
186  * @param __state Persistent conversion state data.
187  * @param __from Start of input.
188  * @param __from_end End of input.
189  * @param __from_next Returns start of unconverted data.
190  * @param __to Start of output buffer.
191  * @param __to_end End of output buffer.
192  * @param __to_next Returns start of unused output area.
193  * @return codecvt_base::result.
194  */
195  result
196  in(state_type& __state, const extern_type* __from,
197  const extern_type* __from_end, const extern_type*& __from_next,
198  intern_type* __to, intern_type* __to_end,
199  intern_type*& __to_next) const
200  {
201  return this->do_in(__state, __from, __from_end, __from_next,
202  __to, __to_end, __to_next);
203  }
204 
205  int
206  encoding() const throw()
207  { return this->do_encoding(); }
208 
209  bool
210  always_noconv() const throw()
211  { return this->do_always_noconv(); }
212 
213  int
214  length(state_type& __state, const extern_type* __from,
215  const extern_type* __end, size_t __max) const
216  { return this->do_length(__state, __from, __end, __max); }
217 
218  int
219  max_length() const throw()
220  { return this->do_max_length(); }
221 
222  protected:
223  explicit
224  __codecvt_abstract_base(size_t __refs = 0) : locale::facet(__refs) { }
225 
226  virtual
227  ~__codecvt_abstract_base() { }
228 
229  /**
230  * @brief Convert from internal to external character set.
231  *
232  * Converts input string of intern_type to output string of
233  * extern_type. This function is a hook for derived classes to change
234  * the value returned. @see out for more information.
235  */
236  virtual result
237  do_out(state_type& __state, const intern_type* __from,
238  const intern_type* __from_end, const intern_type*& __from_next,
239  extern_type* __to, extern_type* __to_end,
240  extern_type*& __to_next) const = 0;
241 
242  virtual result
243  do_unshift(state_type& __state, extern_type* __to,
244  extern_type* __to_end, extern_type*& __to_next) const = 0;
245 
246  virtual result
247  do_in(state_type& __state, const extern_type* __from,
248  const extern_type* __from_end, const extern_type*& __from_next,
249  intern_type* __to, intern_type* __to_end,
250  intern_type*& __to_next) const = 0;
251 
252  virtual int
253  do_encoding() const throw() = 0;
254 
255  virtual bool
256  do_always_noconv() const throw() = 0;
257 
258  virtual int
259  do_length(state_type&, const extern_type* __from,
260  const extern_type* __end, size_t __max) const = 0;
261 
262  virtual int
263  do_max_length() const throw() = 0;
264  };
265 
266  /**
267  * @brief Primary class template codecvt.
268  * @ingroup locales
269  *
270  * NB: Generic, mostly useless implementation.
271  *
272  */
273  template<typename _InternT, typename _ExternT, typename _StateT>
274  class codecvt
275  : public __codecvt_abstract_base<_InternT, _ExternT, _StateT>
276  {
277  public:
278  // Types:
279  typedef codecvt_base::result result;
280  typedef _InternT intern_type;
281  typedef _ExternT extern_type;
282  typedef _StateT state_type;
283 
284  protected:
285  __c_locale _M_c_locale_codecvt;
286 
287  public:
288  static locale::id id;
289 
290  explicit
291  codecvt(size_t __refs = 0)
293  _M_c_locale_codecvt(0)
294  { }
295 
296  explicit
297  codecvt(__c_locale __cloc, size_t __refs = 0);
298 
299  protected:
300  virtual
301  ~codecvt() { }
302 
303  virtual result
304  do_out(state_type& __state, const intern_type* __from,
305  const intern_type* __from_end, const intern_type*& __from_next,
306  extern_type* __to, extern_type* __to_end,
307  extern_type*& __to_next) const;
308 
309  virtual result
310  do_unshift(state_type& __state, extern_type* __to,
311  extern_type* __to_end, extern_type*& __to_next) const;
312 
313  virtual result
314  do_in(state_type& __state, const extern_type* __from,
315  const extern_type* __from_end, const extern_type*& __from_next,
316  intern_type* __to, intern_type* __to_end,
317  intern_type*& __to_next) const;
318 
319  virtual int
320  do_encoding() const throw();
321 
322  virtual bool
323  do_always_noconv() const throw();
324 
325  virtual int
326  do_length(state_type&, const extern_type* __from,
327  const extern_type* __end, size_t __max) const;
328 
329  virtual int
330  do_max_length() const throw();
331  };
332 
333  template<typename _InternT, typename _ExternT, typename _StateT>
335 
336  /// class codecvt<char, char, mbstate_t> specialization.
337  template<>
338  class codecvt<char, char, mbstate_t>
339  : public __codecvt_abstract_base<char, char, mbstate_t>
340  {
341  friend class messages<char>;
342 
343  public:
344  // Types:
345  typedef char intern_type;
346  typedef char extern_type;
347  typedef mbstate_t state_type;
348 
349  protected:
350  __c_locale _M_c_locale_codecvt;
351 
352  public:
353  static locale::id id;
354 
355  explicit
356  codecvt(size_t __refs = 0);
357 
358  explicit
359  codecvt(__c_locale __cloc, size_t __refs = 0);
360 
361  protected:
362  virtual
363  ~codecvt();
364 
365  virtual result
366  do_out(state_type& __state, const intern_type* __from,
367  const intern_type* __from_end, const intern_type*& __from_next,
368  extern_type* __to, extern_type* __to_end,
369  extern_type*& __to_next) const;
370 
371  virtual result
372  do_unshift(state_type& __state, extern_type* __to,
373  extern_type* __to_end, extern_type*& __to_next) const;
374 
375  virtual result
376  do_in(state_type& __state, const extern_type* __from,
377  const extern_type* __from_end, const extern_type*& __from_next,
378  intern_type* __to, intern_type* __to_end,
379  intern_type*& __to_next) const;
380 
381  virtual int
382  do_encoding() const throw();
383 
384  virtual bool
385  do_always_noconv() const throw();
386 
387  virtual int
388  do_length(state_type&, const extern_type* __from,
389  const extern_type* __end, size_t __max) const;
390 
391  virtual int
392  do_max_length() const throw();
393  };
394 
395 #ifdef _GLIBCXX_USE_WCHAR_T
396  /** @brief Class codecvt<wchar_t, char, mbstate_t> specialization.
397  *
398  * Converts between narrow and wide characters in the native character set
399  */
400  template<>
401  class codecvt<wchar_t, char, mbstate_t>
402  : public __codecvt_abstract_base<wchar_t, char, mbstate_t>
403  {
404  friend class messages<wchar_t>;
405 
406  public:
407  // Types:
408  typedef wchar_t intern_type;
409  typedef char extern_type;
410  typedef mbstate_t state_type;
411 
412  protected:
413  __c_locale _M_c_locale_codecvt;
414 
415  public:
416  static locale::id id;
417 
418  explicit
419  codecvt(size_t __refs = 0);
420 
421  explicit
422  codecvt(__c_locale __cloc, size_t __refs = 0);
423 
424  protected:
425  virtual
426  ~codecvt();
427 
428  virtual result
429  do_out(state_type& __state, const intern_type* __from,
430  const intern_type* __from_end, const intern_type*& __from_next,
431  extern_type* __to, extern_type* __to_end,
432  extern_type*& __to_next) const;
433 
434  virtual result
435  do_unshift(state_type& __state,
436  extern_type* __to, extern_type* __to_end,
437  extern_type*& __to_next) const;
438 
439  virtual result
440  do_in(state_type& __state,
441  const extern_type* __from, const extern_type* __from_end,
442  const extern_type*& __from_next,
443  intern_type* __to, intern_type* __to_end,
444  intern_type*& __to_next) const;
445 
446  virtual
447  int do_encoding() const throw();
448 
449  virtual
450  bool do_always_noconv() const throw();
451 
452  virtual
453  int do_length(state_type&, const extern_type* __from,
454  const extern_type* __end, size_t __max) const;
455 
456  virtual int
457  do_max_length() const throw();
458  };
459 #endif //_GLIBCXX_USE_WCHAR_T
460 
461 #if __cplusplus >= 201103L
462  /** @brief Class codecvt<char16_t, char, mbstate_t> specialization.
463  *
464  * Converts between UTF-16 and UTF-8.
465  */
466  template<>
467  class codecvt<char16_t, char, mbstate_t>
468  : public __codecvt_abstract_base<char16_t, char, mbstate_t>
469  {
470  public:
471  // Types:
472  typedef char16_t intern_type;
473  typedef char extern_type;
474  typedef mbstate_t state_type;
475 
476  public:
477  static locale::id id;
478 
479  explicit
480  codecvt(size_t __refs = 0)
482 
483  protected:
484  virtual
485  ~codecvt();
486 
487  virtual result
488  do_out(state_type& __state, const intern_type* __from,
489  const intern_type* __from_end, const intern_type*& __from_next,
490  extern_type* __to, extern_type* __to_end,
491  extern_type*& __to_next) const;
492 
493  virtual result
494  do_unshift(state_type& __state,
495  extern_type* __to, extern_type* __to_end,
496  extern_type*& __to_next) const;
497 
498  virtual result
499  do_in(state_type& __state,
500  const extern_type* __from, const extern_type* __from_end,
501  const extern_type*& __from_next,
502  intern_type* __to, intern_type* __to_end,
503  intern_type*& __to_next) const;
504 
505  virtual
506  int do_encoding() const throw();
507 
508  virtual
509  bool do_always_noconv() const throw();
510 
511  virtual
512  int do_length(state_type&, const extern_type* __from,
513  const extern_type* __end, size_t __max) const;
514 
515  virtual int
516  do_max_length() const throw();
517  };
518 
519  /** @brief Class codecvt<char32_t, char, mbstate_t> specialization.
520  *
521  * Converts between UTF-32 and UTF-8.
522  */
523  template<>
524  class codecvt<char32_t, char, mbstate_t>
525  : public __codecvt_abstract_base<char32_t, char, mbstate_t>
526  {
527  public:
528  // Types:
529  typedef char32_t intern_type;
530  typedef char extern_type;
531  typedef mbstate_t state_type;
532 
533  public:
534  static locale::id id;
535 
536  explicit
537  codecvt(size_t __refs = 0)
539 
540  protected:
541  virtual
542  ~codecvt();
543 
544  virtual result
545  do_out(state_type& __state, const intern_type* __from,
546  const intern_type* __from_end, const intern_type*& __from_next,
547  extern_type* __to, extern_type* __to_end,
548  extern_type*& __to_next) const;
549 
550  virtual result
551  do_unshift(state_type& __state,
552  extern_type* __to, extern_type* __to_end,
553  extern_type*& __to_next) const;
554 
555  virtual result
556  do_in(state_type& __state,
557  const extern_type* __from, const extern_type* __from_end,
558  const extern_type*& __from_next,
559  intern_type* __to, intern_type* __to_end,
560  intern_type*& __to_next) const;
561 
562  virtual
563  int do_encoding() const throw();
564 
565  virtual
566  bool do_always_noconv() const throw();
567 
568  virtual
569  int do_length(state_type&, const extern_type* __from,
570  const extern_type* __end, size_t __max) const;
571 
572  virtual int
573  do_max_length() const throw();
574  };
575 
576 #ifdef _GLIBCXX_USE_CHAR8_T
577  /** @brief Class codecvt<char16_t, char8_t, mbstate_t> specialization.
578  *
579  * Converts between UTF-16 and UTF-8.
580  */
581  template<>
582  class codecvt<char16_t, char8_t, mbstate_t>
583  : public __codecvt_abstract_base<char16_t, char8_t, mbstate_t>
584  {
585  public:
586  // Types:
587  typedef char16_t intern_type;
588  typedef char8_t extern_type;
589  typedef mbstate_t state_type;
590 
591  public:
592  static locale::id id;
593 
594  explicit
595  codecvt(size_t __refs = 0)
596  : __codecvt_abstract_base<char16_t, char8_t, mbstate_t>(__refs) { }
597 
598  protected:
599  virtual
600  ~codecvt();
601 
602  virtual result
603  do_out(state_type& __state, const intern_type* __from,
604  const intern_type* __from_end, const intern_type*& __from_next,
605  extern_type* __to, extern_type* __to_end,
606  extern_type*& __to_next) const;
607 
608  virtual result
609  do_unshift(state_type& __state,
610  extern_type* __to, extern_type* __to_end,
611  extern_type*& __to_next) const;
612 
613  virtual result
614  do_in(state_type& __state,
615  const extern_type* __from, const extern_type* __from_end,
616  const extern_type*& __from_next,
617  intern_type* __to, intern_type* __to_end,
618  intern_type*& __to_next) const;
619 
620  virtual
621  int do_encoding() const throw();
622 
623  virtual
624  bool do_always_noconv() const throw();
625 
626  virtual
627  int do_length(state_type&, const extern_type* __from,
628  const extern_type* __end, size_t __max) const;
629 
630  virtual int
631  do_max_length() const throw();
632  };
633 
634  /** @brief Class codecvt<char32_t, char8_t, mbstate_t> specialization.
635  *
636  * Converts between UTF-32 and UTF-8.
637  */
638  template<>
639  class codecvt<char32_t, char8_t, mbstate_t>
640  : public __codecvt_abstract_base<char32_t, char8_t, mbstate_t>
641  {
642  public:
643  // Types:
644  typedef char32_t intern_type;
645  typedef char8_t extern_type;
646  typedef mbstate_t state_type;
647 
648  public:
649  static locale::id id;
650 
651  explicit
652  codecvt(size_t __refs = 0)
653  : __codecvt_abstract_base<char32_t, char8_t, mbstate_t>(__refs) { }
654 
655  protected:
656  virtual
657  ~codecvt();
658 
659  virtual result
660  do_out(state_type& __state, const intern_type* __from,
661  const intern_type* __from_end, const intern_type*& __from_next,
662  extern_type* __to, extern_type* __to_end,
663  extern_type*& __to_next) const;
664 
665  virtual result
666  do_unshift(state_type& __state,
667  extern_type* __to, extern_type* __to_end,
668  extern_type*& __to_next) const;
669 
670  virtual result
671  do_in(state_type& __state,
672  const extern_type* __from, const extern_type* __from_end,
673  const extern_type*& __from_next,
674  intern_type* __to, intern_type* __to_end,
675  intern_type*& __to_next) const;
676 
677  virtual
678  int do_encoding() const throw();
679 
680  virtual
681  bool do_always_noconv() const throw();
682 
683  virtual
684  int do_length(state_type&, const extern_type* __from,
685  const extern_type* __end, size_t __max) const;
686 
687  virtual int
688  do_max_length() const throw();
689  };
690 #endif // _GLIBCXX_USE_CHAR8_T
691 
692 #endif // C++11
693 
694  /// class codecvt_byname [22.2.1.6].
695  template<typename _InternT, typename _ExternT, typename _StateT>
696  class codecvt_byname : public codecvt<_InternT, _ExternT, _StateT>
697  {
698  public:
699  explicit
700  codecvt_byname(const char* __s, size_t __refs = 0)
702  {
703  if (__builtin_strcmp(__s, "C") != 0
704  && __builtin_strcmp(__s, "POSIX") != 0)
705  {
706  this->_S_destroy_c_locale(this->_M_c_locale_codecvt);
707  this->_S_create_c_locale(this->_M_c_locale_codecvt, __s);
708  }
709  }
710 
711 #if __cplusplus >= 201103L
712  explicit
713  codecvt_byname(const string& __s, size_t __refs = 0)
714  : codecvt_byname(__s.c_str(), __refs) { }
715 #endif
716 
717  protected:
718  virtual
719  ~codecvt_byname() { }
720  };
721 
722 #if __cplusplus >= 201103L
723  template<>
724  class codecvt_byname<char16_t, char, mbstate_t>
725  : public codecvt<char16_t, char, mbstate_t>
726  {
727  public:
728  explicit
729  codecvt_byname(const char*, size_t __refs = 0)
730  : codecvt<char16_t, char, mbstate_t>(__refs) { }
731 
732  explicit
733  codecvt_byname(const string& __s, size_t __refs = 0)
734  : codecvt_byname(__s.c_str(), __refs) { }
735 
736  protected:
737  virtual
738  ~codecvt_byname() { }
739  };
740 
741  template<>
742  class codecvt_byname<char32_t, char, mbstate_t>
743  : public codecvt<char32_t, char, mbstate_t>
744  {
745  public:
746  explicit
747  codecvt_byname(const char*, size_t __refs = 0)
748  : codecvt<char32_t, char, mbstate_t>(__refs) { }
749 
750  explicit
751  codecvt_byname(const string& __s, size_t __refs = 0)
752  : codecvt_byname(__s.c_str(), __refs) { }
753 
754  protected:
755  virtual
756  ~codecvt_byname() { }
757  };
758 
759 #if defined(_GLIBCXX_USE_CHAR8_T)
760  template<>
761  class codecvt_byname<char16_t, char8_t, mbstate_t>
762  : public codecvt<char16_t, char8_t, mbstate_t>
763  {
764  public:
765  explicit
766  codecvt_byname(const char* __s, size_t __refs = 0)
767  : codecvt<char16_t, char8_t, mbstate_t>(__refs) { }
768 
769  explicit
770  codecvt_byname(const string& __s, size_t __refs = 0)
771  : codecvt_byname(__s.c_str(), __refs) { }
772 
773  protected:
774  virtual
775  ~codecvt_byname() { }
776  };
777 
778  template<>
779  class codecvt_byname<char32_t, char8_t, mbstate_t>
780  : public codecvt<char32_t, char8_t, mbstate_t>
781  {
782  public:
783  explicit
784  codecvt_byname(const char* __s, size_t __refs = 0)
785  : codecvt<char32_t, char8_t, mbstate_t>(__refs) { }
786 
787  explicit
788  codecvt_byname(const string& __s, size_t __refs = 0)
789  : codecvt_byname(__s.c_str(), __refs) { }
790 
791  protected:
792  virtual
793  ~codecvt_byname() { }
794  };
795 #endif
796 
797 #endif // C++11
798 
799  // Inhibit implicit instantiations for required instantiations,
800  // which are defined via explicit instantiations elsewhere.
801 #if _GLIBCXX_EXTERN_TEMPLATE
802  extern template class codecvt_byname<char, char, mbstate_t>;
803 
804  extern template
805  const codecvt<char, char, mbstate_t>&
806  use_facet<codecvt<char, char, mbstate_t> >(const locale&);
807 
808  extern template
809  bool
810  has_facet<codecvt<char, char, mbstate_t> >(const locale&);
811 
812 #ifdef _GLIBCXX_USE_WCHAR_T
813  extern template class codecvt_byname<wchar_t, char, mbstate_t>;
814 
815  extern template
816  const codecvt<wchar_t, char, mbstate_t>&
817  use_facet<codecvt<wchar_t, char, mbstate_t> >(const locale&);
818 
819  extern template
820  bool
821  has_facet<codecvt<wchar_t, char, mbstate_t> >(const locale&);
822 #endif
823 
824 #if __cplusplus >= 201103L
825  extern template class codecvt_byname<char16_t, char, mbstate_t>;
826  extern template class codecvt_byname<char32_t, char, mbstate_t>;
827 
828 #if defined(_GLIBCXX_USE_CHAR8_T)
829  extern template class codecvt_byname<char16_t, char8_t, mbstate_t>;
830  extern template class codecvt_byname<char32_t, char8_t, mbstate_t>;
831 #endif
832 
833 #endif
834 
835 #endif
836 
837 _GLIBCXX_END_NAMESPACE_VERSION
838 } // namespace std
839 
840 #endif // _CODECVT_H
Primary class template messages.This facet encapsulates the code to retrieve messages from message ca...
facet(size_t __refs=0)
Facet constructor.
ISO C++ entities toplevel namespace is std.
Primary class template codecvt.NB: Generic, mostly useless implementation.
Definition: codecvt.h:274
Facet ID class.The ID class provides facets with an index used to identify them. Every facet class mu...
Common base for codecvt functions.
Definition: codecvt.h:68
result unshift(state_type &__state, extern_type *__to, extern_type *__to_end, extern_type *&__to_next) const
Reset conversion state.
Definition: codecvt.h:155
Localization functionality base class.The facet class is the base class for a localization feature...
virtual result do_out(state_type &__state, const intern_type *__from, const intern_type *__from_end, const intern_type *&__from_next, extern_type *__to, extern_type *__to_end, extern_type *&__to_next) const =0
Convert from internal to external character set.
result in(state_type &__state, const extern_type *__from, const extern_type *__from_end, const extern_type *&__from_next, intern_type *__to, intern_type *__to_end, intern_type *&__to_next) const
Convert from external to internal character set.
Definition: codecvt.h:196
class codecvt_byname [22.2.1.6].
Definition: codecvt.h:696
Empty base class for codecvt facet [22.2.1.5].
Definition: codecvt.h:46
result out(state_type &__state, const intern_type *__from, const intern_type *__from_end, const intern_type *&__from_next, extern_type *__to, extern_type *__to_end, extern_type *&__to_next) const
Convert from internal to external character set.
Definition: codecvt.h:116