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 <bkoz@redhat.com>
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
class codecvt_byname [22.2.1.6].
Definition: codecvt.h:696
Common base for codecvt functions.
Definition: codecvt.h:68
Localization functionality base class.The facet class is the base class for a localization feature,...
ISO C++ entities toplevel namespace is std.
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
Empty base class for codecvt facet [22.2.1.5].
Definition: codecvt.h:46
facet(size_t __refs=0)
Facet constructor.
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
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.
Primary class template messages.This facet encapsulates the code to retrieve messages from message ca...
Facet ID class.The ID class provides facets with an index used to identify them. Every facet class mu...
Primary class template codecvt.NB: Generic, mostly useless implementation.
Definition: codecvt.h:274
result unshift(state_type &__state, extern_type *__to, extern_type *__to_end, extern_type *&__to_next) const
Reset conversion state.
Definition: codecvt.h:155