xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/bits/codecvt.h (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino // Locale support (codecvt) -*- C++ -*-
2*e4b17023SJohn Marino 
3*e4b17023SJohn Marino // Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
4*e4b17023SJohn Marino // 2009, 2010, 2011  Free Software Foundation, Inc.
5*e4b17023SJohn Marino //
6*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library.  This library is free
7*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the
8*e4b17023SJohn Marino // terms of the GNU General Public License as published by the
9*e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option)
10*e4b17023SJohn Marino // any later version.
11*e4b17023SJohn Marino 
12*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful,
13*e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of
14*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*e4b17023SJohn Marino // GNU General Public License for more details.
16*e4b17023SJohn Marino 
17*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional
18*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version
19*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation.
20*e4b17023SJohn Marino 
21*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and
22*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program;
23*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>.
25*e4b17023SJohn Marino 
26*e4b17023SJohn Marino /** @file bits/codecvt.h
27*e4b17023SJohn Marino  *  This is an internal header file, included by other library headers.
28*e4b17023SJohn Marino  *  Do not attempt to use it directly. @headername{locale}
29*e4b17023SJohn Marino  */
30*e4b17023SJohn Marino 
31*e4b17023SJohn Marino //
32*e4b17023SJohn Marino // ISO C++ 14882: 22.2.1.5 Template class codecvt
33*e4b17023SJohn Marino //
34*e4b17023SJohn Marino 
35*e4b17023SJohn Marino // Written by Benjamin Kosnik <bkoz@redhat.com>
36*e4b17023SJohn Marino 
37*e4b17023SJohn Marino #ifndef _CODECVT_H
38*e4b17023SJohn Marino #define _CODECVT_H 1
39*e4b17023SJohn Marino 
40*e4b17023SJohn Marino #pragma GCC system_header
41*e4b17023SJohn Marino 
_GLIBCXX_VISIBILITY(default)42*e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default)
43*e4b17023SJohn Marino {
44*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_VERSION
45*e4b17023SJohn Marino 
46*e4b17023SJohn Marino   /// Empty base class for codecvt facet [22.2.1.5].
47*e4b17023SJohn Marino   class codecvt_base
48*e4b17023SJohn Marino   {
49*e4b17023SJohn Marino   public:
50*e4b17023SJohn Marino     enum result
51*e4b17023SJohn Marino     {
52*e4b17023SJohn Marino       ok,
53*e4b17023SJohn Marino       partial,
54*e4b17023SJohn Marino       error,
55*e4b17023SJohn Marino       noconv
56*e4b17023SJohn Marino     };
57*e4b17023SJohn Marino   };
58*e4b17023SJohn Marino 
59*e4b17023SJohn Marino   /**
60*e4b17023SJohn Marino    *  @brief  Common base for codecvt functions.
61*e4b17023SJohn Marino    *
62*e4b17023SJohn Marino    *  This template class provides implementations of the public functions
63*e4b17023SJohn Marino    *  that forward to the protected virtual functions.
64*e4b17023SJohn Marino    *
65*e4b17023SJohn Marino    *  This template also provides abstract stubs for the protected virtual
66*e4b17023SJohn Marino    *  functions.
67*e4b17023SJohn Marino   */
68*e4b17023SJohn Marino   template<typename _InternT, typename _ExternT, typename _StateT>
69*e4b17023SJohn Marino     class __codecvt_abstract_base
70*e4b17023SJohn Marino     : public locale::facet, public codecvt_base
71*e4b17023SJohn Marino     {
72*e4b17023SJohn Marino     public:
73*e4b17023SJohn Marino       // Types:
74*e4b17023SJohn Marino       typedef codecvt_base::result	result;
75*e4b17023SJohn Marino       typedef _InternT			intern_type;
76*e4b17023SJohn Marino       typedef _ExternT			extern_type;
77*e4b17023SJohn Marino       typedef _StateT			state_type;
78*e4b17023SJohn Marino 
79*e4b17023SJohn Marino       // 22.2.1.5.1 codecvt members
80*e4b17023SJohn Marino       /**
81*e4b17023SJohn Marino        *  @brief  Convert from internal to external character set.
82*e4b17023SJohn Marino        *
83*e4b17023SJohn Marino        *  Converts input string of intern_type to output string of
84*e4b17023SJohn Marino        *  extern_type.  This is analogous to wcsrtombs.  It does this by
85*e4b17023SJohn Marino        *  calling codecvt::do_out.
86*e4b17023SJohn Marino        *
87*e4b17023SJohn Marino        *  The source and destination character sets are determined by the
88*e4b17023SJohn Marino        *  facet's locale, internal and external types.
89*e4b17023SJohn Marino        *
90*e4b17023SJohn Marino        *  The characters in [from,from_end) are converted and written to
91*e4b17023SJohn Marino        *  [to,to_end).  from_next and to_next are set to point to the
92*e4b17023SJohn Marino        *  character following the last successfully converted character,
93*e4b17023SJohn Marino        *  respectively.  If the result needed no conversion, from_next and
94*e4b17023SJohn Marino        *  to_next are not affected.
95*e4b17023SJohn Marino        *
96*e4b17023SJohn Marino        *  The @a state argument should be initialized if the input is at the
97*e4b17023SJohn Marino        *  beginning and carried from a previous call if continuing
98*e4b17023SJohn Marino        *  conversion.  There are no guarantees about how @a state is used.
99*e4b17023SJohn Marino        *
100*e4b17023SJohn Marino        *  The result returned is a member of codecvt_base::result.  If
101*e4b17023SJohn Marino        *  all the input is converted, returns codecvt_base::ok.  If no
102*e4b17023SJohn Marino        *  conversion is necessary, returns codecvt_base::noconv.  If
103*e4b17023SJohn Marino        *  the input ends early or there is insufficient space in the
104*e4b17023SJohn Marino        *  output, returns codecvt_base::partial.  Otherwise the
105*e4b17023SJohn Marino        *  conversion failed and codecvt_base::error is returned.
106*e4b17023SJohn Marino        *
107*e4b17023SJohn Marino        *  @param  __state  Persistent conversion state data.
108*e4b17023SJohn Marino        *  @param  __from  Start of input.
109*e4b17023SJohn Marino        *  @param  __from_end  End of input.
110*e4b17023SJohn Marino        *  @param  __from_next  Returns start of unconverted data.
111*e4b17023SJohn Marino        *  @param  __to  Start of output buffer.
112*e4b17023SJohn Marino        *  @param  __to_end  End of output buffer.
113*e4b17023SJohn Marino        *  @param  __to_next  Returns start of unused output area.
114*e4b17023SJohn Marino        *  @return  codecvt_base::result.
115*e4b17023SJohn Marino       */
116*e4b17023SJohn Marino       result
117*e4b17023SJohn Marino       out(state_type& __state, const intern_type* __from,
118*e4b17023SJohn Marino 	  const intern_type* __from_end, const intern_type*& __from_next,
119*e4b17023SJohn Marino 	  extern_type* __to, extern_type* __to_end,
120*e4b17023SJohn Marino 	  extern_type*& __to_next) const
121*e4b17023SJohn Marino       {
122*e4b17023SJohn Marino 	return this->do_out(__state, __from, __from_end, __from_next,
123*e4b17023SJohn Marino 			    __to, __to_end, __to_next);
124*e4b17023SJohn Marino       }
125*e4b17023SJohn Marino 
126*e4b17023SJohn Marino       /**
127*e4b17023SJohn Marino        *  @brief  Reset conversion state.
128*e4b17023SJohn Marino        *
129*e4b17023SJohn Marino        *  Writes characters to output that would restore @a state to initial
130*e4b17023SJohn Marino        *  conditions.  The idea is that if a partial conversion occurs, then
131*e4b17023SJohn Marino        *  the converting the characters written by this function would leave
132*e4b17023SJohn Marino        *  the state in initial conditions, rather than partial conversion
133*e4b17023SJohn Marino        *  state.  It does this by calling codecvt::do_unshift().
134*e4b17023SJohn Marino        *
135*e4b17023SJohn Marino        *  For example, if 4 external characters always converted to 1 internal
136*e4b17023SJohn Marino        *  character, and input to in() had 6 external characters with state
137*e4b17023SJohn Marino        *  saved, this function would write two characters to the output and
138*e4b17023SJohn Marino        *  set the state to initialized conditions.
139*e4b17023SJohn Marino        *
140*e4b17023SJohn Marino        *  The source and destination character sets are determined by the
141*e4b17023SJohn Marino        *  facet's locale, internal and external types.
142*e4b17023SJohn Marino        *
143*e4b17023SJohn Marino        *  The result returned is a member of codecvt_base::result.  If the
144*e4b17023SJohn Marino        *  state could be reset and data written, returns codecvt_base::ok.  If
145*e4b17023SJohn Marino        *  no conversion is necessary, returns codecvt_base::noconv.  If the
146*e4b17023SJohn Marino        *  output has insufficient space, returns codecvt_base::partial.
147*e4b17023SJohn Marino        *  Otherwise the reset failed and codecvt_base::error is returned.
148*e4b17023SJohn Marino        *
149*e4b17023SJohn Marino        *  @param  __state  Persistent conversion state data.
150*e4b17023SJohn Marino        *  @param  __to  Start of output buffer.
151*e4b17023SJohn Marino        *  @param  __to_end  End of output buffer.
152*e4b17023SJohn Marino        *  @param  __to_next  Returns start of unused output area.
153*e4b17023SJohn Marino        *  @return  codecvt_base::result.
154*e4b17023SJohn Marino       */
155*e4b17023SJohn Marino       result
156*e4b17023SJohn Marino       unshift(state_type& __state, extern_type* __to, extern_type* __to_end,
157*e4b17023SJohn Marino 	      extern_type*& __to_next) const
158*e4b17023SJohn Marino       { return this->do_unshift(__state, __to,__to_end,__to_next); }
159*e4b17023SJohn Marino 
160*e4b17023SJohn Marino       /**
161*e4b17023SJohn Marino        *  @brief  Convert from external to internal character set.
162*e4b17023SJohn Marino        *
163*e4b17023SJohn Marino        *  Converts input string of extern_type to output string of
164*e4b17023SJohn Marino        *  intern_type.  This is analogous to mbsrtowcs.  It does this by
165*e4b17023SJohn Marino        *  calling codecvt::do_in.
166*e4b17023SJohn Marino        *
167*e4b17023SJohn Marino        *  The source and destination character sets are determined by the
168*e4b17023SJohn Marino        *  facet's locale, internal and external types.
169*e4b17023SJohn Marino        *
170*e4b17023SJohn Marino        *  The characters in [from,from_end) are converted and written to
171*e4b17023SJohn Marino        *  [to,to_end).  from_next and to_next are set to point to the
172*e4b17023SJohn Marino        *  character following the last successfully converted character,
173*e4b17023SJohn Marino        *  respectively.  If the result needed no conversion, from_next and
174*e4b17023SJohn Marino        *  to_next are not affected.
175*e4b17023SJohn Marino        *
176*e4b17023SJohn Marino        *  The @a state argument should be initialized if the input is at the
177*e4b17023SJohn Marino        *  beginning and carried from a previous call if continuing
178*e4b17023SJohn Marino        *  conversion.  There are no guarantees about how @a state is used.
179*e4b17023SJohn Marino        *
180*e4b17023SJohn Marino        *  The result returned is a member of codecvt_base::result.  If
181*e4b17023SJohn Marino        *  all the input is converted, returns codecvt_base::ok.  If no
182*e4b17023SJohn Marino        *  conversion is necessary, returns codecvt_base::noconv.  If
183*e4b17023SJohn Marino        *  the input ends early or there is insufficient space in the
184*e4b17023SJohn Marino        *  output, returns codecvt_base::partial.  Otherwise the
185*e4b17023SJohn Marino        *  conversion failed and codecvt_base::error is returned.
186*e4b17023SJohn Marino        *
187*e4b17023SJohn Marino        *  @param  __state  Persistent conversion state data.
188*e4b17023SJohn Marino        *  @param  __from  Start of input.
189*e4b17023SJohn Marino        *  @param  __from_end  End of input.
190*e4b17023SJohn Marino        *  @param  __from_next  Returns start of unconverted data.
191*e4b17023SJohn Marino        *  @param  __to  Start of output buffer.
192*e4b17023SJohn Marino        *  @param  __to_end  End of output buffer.
193*e4b17023SJohn Marino        *  @param  __to_next  Returns start of unused output area.
194*e4b17023SJohn Marino        *  @return  codecvt_base::result.
195*e4b17023SJohn Marino       */
196*e4b17023SJohn Marino       result
197*e4b17023SJohn Marino       in(state_type& __state, const extern_type* __from,
198*e4b17023SJohn Marino 	 const extern_type* __from_end, const extern_type*& __from_next,
199*e4b17023SJohn Marino 	 intern_type* __to, intern_type* __to_end,
200*e4b17023SJohn Marino 	 intern_type*& __to_next) const
201*e4b17023SJohn Marino       {
202*e4b17023SJohn Marino 	return this->do_in(__state, __from, __from_end, __from_next,
203*e4b17023SJohn Marino 			   __to, __to_end, __to_next);
204*e4b17023SJohn Marino       }
205*e4b17023SJohn Marino 
206*e4b17023SJohn Marino       int
207*e4b17023SJohn Marino       encoding() const throw()
208*e4b17023SJohn Marino       { return this->do_encoding(); }
209*e4b17023SJohn Marino 
210*e4b17023SJohn Marino       bool
211*e4b17023SJohn Marino       always_noconv() const throw()
212*e4b17023SJohn Marino       { return this->do_always_noconv(); }
213*e4b17023SJohn Marino 
214*e4b17023SJohn Marino       int
215*e4b17023SJohn Marino       length(state_type& __state, const extern_type* __from,
216*e4b17023SJohn Marino 	     const extern_type* __end, size_t __max) const
217*e4b17023SJohn Marino       { return this->do_length(__state, __from, __end, __max); }
218*e4b17023SJohn Marino 
219*e4b17023SJohn Marino       int
220*e4b17023SJohn Marino       max_length() const throw()
221*e4b17023SJohn Marino       { return this->do_max_length(); }
222*e4b17023SJohn Marino 
223*e4b17023SJohn Marino     protected:
224*e4b17023SJohn Marino       explicit
225*e4b17023SJohn Marino       __codecvt_abstract_base(size_t __refs = 0) : locale::facet(__refs) { }
226*e4b17023SJohn Marino 
227*e4b17023SJohn Marino       virtual
228*e4b17023SJohn Marino       ~__codecvt_abstract_base() { }
229*e4b17023SJohn Marino 
230*e4b17023SJohn Marino       /**
231*e4b17023SJohn Marino        *  @brief  Convert from internal to external character set.
232*e4b17023SJohn Marino        *
233*e4b17023SJohn Marino        *  Converts input string of intern_type to output string of
234*e4b17023SJohn Marino        *  extern_type.  This function is a hook for derived classes to change
235*e4b17023SJohn Marino        *  the value returned.  @see out for more information.
236*e4b17023SJohn Marino       */
237*e4b17023SJohn Marino       virtual result
238*e4b17023SJohn Marino       do_out(state_type& __state, const intern_type* __from,
239*e4b17023SJohn Marino 	     const intern_type* __from_end, const intern_type*& __from_next,
240*e4b17023SJohn Marino 	     extern_type* __to, extern_type* __to_end,
241*e4b17023SJohn Marino 	     extern_type*& __to_next) const = 0;
242*e4b17023SJohn Marino 
243*e4b17023SJohn Marino       virtual result
244*e4b17023SJohn Marino       do_unshift(state_type& __state, extern_type* __to,
245*e4b17023SJohn Marino 		 extern_type* __to_end, extern_type*& __to_next) const = 0;
246*e4b17023SJohn Marino 
247*e4b17023SJohn Marino       virtual result
248*e4b17023SJohn Marino       do_in(state_type& __state, const extern_type* __from,
249*e4b17023SJohn Marino 	    const extern_type* __from_end, const extern_type*& __from_next,
250*e4b17023SJohn Marino 	    intern_type* __to, intern_type* __to_end,
251*e4b17023SJohn Marino 	    intern_type*& __to_next) const = 0;
252*e4b17023SJohn Marino 
253*e4b17023SJohn Marino       virtual int
254*e4b17023SJohn Marino       do_encoding() const throw() = 0;
255*e4b17023SJohn Marino 
256*e4b17023SJohn Marino       virtual bool
257*e4b17023SJohn Marino       do_always_noconv() const throw() = 0;
258*e4b17023SJohn Marino 
259*e4b17023SJohn Marino       virtual int
260*e4b17023SJohn Marino       do_length(state_type&, const extern_type* __from,
261*e4b17023SJohn Marino 		const extern_type* __end, size_t __max) const = 0;
262*e4b17023SJohn Marino 
263*e4b17023SJohn Marino       virtual int
264*e4b17023SJohn Marino       do_max_length() const throw() = 0;
265*e4b17023SJohn Marino     };
266*e4b17023SJohn Marino 
267*e4b17023SJohn Marino 
268*e4b17023SJohn Marino 
269*e4b17023SJohn Marino   /**
270*e4b17023SJohn Marino    *  @brief  Primary class template codecvt.
271*e4b17023SJohn Marino    *  @ingroup locales
272*e4b17023SJohn Marino    *
273*e4b17023SJohn Marino    *  NB: Generic, mostly useless implementation.
274*e4b17023SJohn Marino    *
275*e4b17023SJohn Marino   */
276*e4b17023SJohn Marino    template<typename _InternT, typename _ExternT, typename _StateT>
277*e4b17023SJohn Marino     class codecvt
278*e4b17023SJohn Marino     : public __codecvt_abstract_base<_InternT, _ExternT, _StateT>
279*e4b17023SJohn Marino     {
280*e4b17023SJohn Marino     public:
281*e4b17023SJohn Marino       // Types:
282*e4b17023SJohn Marino       typedef codecvt_base::result	result;
283*e4b17023SJohn Marino       typedef _InternT			intern_type;
284*e4b17023SJohn Marino       typedef _ExternT			extern_type;
285*e4b17023SJohn Marino       typedef _StateT			state_type;
286*e4b17023SJohn Marino 
287*e4b17023SJohn Marino     protected:
288*e4b17023SJohn Marino       __c_locale			_M_c_locale_codecvt;
289*e4b17023SJohn Marino 
290*e4b17023SJohn Marino     public:
291*e4b17023SJohn Marino       static locale::id			id;
292*e4b17023SJohn Marino 
293*e4b17023SJohn Marino       explicit
294*e4b17023SJohn Marino       codecvt(size_t __refs = 0)
295*e4b17023SJohn Marino       : __codecvt_abstract_base<_InternT, _ExternT, _StateT> (__refs),
296*e4b17023SJohn Marino 	_M_c_locale_codecvt(0)
297*e4b17023SJohn Marino       { }
298*e4b17023SJohn Marino 
299*e4b17023SJohn Marino       explicit
300*e4b17023SJohn Marino       codecvt(__c_locale __cloc, size_t __refs = 0);
301*e4b17023SJohn Marino 
302*e4b17023SJohn Marino     protected:
303*e4b17023SJohn Marino       virtual
304*e4b17023SJohn Marino       ~codecvt() { }
305*e4b17023SJohn Marino 
306*e4b17023SJohn Marino       virtual result
307*e4b17023SJohn Marino       do_out(state_type& __state, const intern_type* __from,
308*e4b17023SJohn Marino 	     const intern_type* __from_end, const intern_type*& __from_next,
309*e4b17023SJohn Marino 	     extern_type* __to, extern_type* __to_end,
310*e4b17023SJohn Marino 	     extern_type*& __to_next) const;
311*e4b17023SJohn Marino 
312*e4b17023SJohn Marino       virtual result
313*e4b17023SJohn Marino       do_unshift(state_type& __state, extern_type* __to,
314*e4b17023SJohn Marino 		 extern_type* __to_end, extern_type*& __to_next) const;
315*e4b17023SJohn Marino 
316*e4b17023SJohn Marino       virtual result
317*e4b17023SJohn Marino       do_in(state_type& __state, const extern_type* __from,
318*e4b17023SJohn Marino 	    const extern_type* __from_end, const extern_type*& __from_next,
319*e4b17023SJohn Marino 	    intern_type* __to, intern_type* __to_end,
320*e4b17023SJohn Marino 	    intern_type*& __to_next) const;
321*e4b17023SJohn Marino 
322*e4b17023SJohn Marino       virtual int
323*e4b17023SJohn Marino       do_encoding() const throw();
324*e4b17023SJohn Marino 
325*e4b17023SJohn Marino       virtual bool
326*e4b17023SJohn Marino       do_always_noconv() const throw();
327*e4b17023SJohn Marino 
328*e4b17023SJohn Marino       virtual int
329*e4b17023SJohn Marino       do_length(state_type&, const extern_type* __from,
330*e4b17023SJohn Marino 		const extern_type* __end, size_t __max) const;
331*e4b17023SJohn Marino 
332*e4b17023SJohn Marino       virtual int
333*e4b17023SJohn Marino       do_max_length() const throw();
334*e4b17023SJohn Marino     };
335*e4b17023SJohn Marino 
336*e4b17023SJohn Marino   template<typename _InternT, typename _ExternT, typename _StateT>
337*e4b17023SJohn Marino     locale::id codecvt<_InternT, _ExternT, _StateT>::id;
338*e4b17023SJohn Marino 
339*e4b17023SJohn Marino   /// class codecvt<char, char, mbstate_t> specialization.
340*e4b17023SJohn Marino   template<>
341*e4b17023SJohn Marino     class codecvt<char, char, mbstate_t>
342*e4b17023SJohn Marino     : public __codecvt_abstract_base<char, char, mbstate_t>
343*e4b17023SJohn Marino     {
344*e4b17023SJohn Marino     public:
345*e4b17023SJohn Marino       // Types:
346*e4b17023SJohn Marino       typedef char			intern_type;
347*e4b17023SJohn Marino       typedef char			extern_type;
348*e4b17023SJohn Marino       typedef mbstate_t			state_type;
349*e4b17023SJohn Marino 
350*e4b17023SJohn Marino     protected:
351*e4b17023SJohn Marino       __c_locale			_M_c_locale_codecvt;
352*e4b17023SJohn Marino 
353*e4b17023SJohn Marino     public:
354*e4b17023SJohn Marino       static locale::id id;
355*e4b17023SJohn Marino 
356*e4b17023SJohn Marino       explicit
357*e4b17023SJohn Marino       codecvt(size_t __refs = 0);
358*e4b17023SJohn Marino 
359*e4b17023SJohn Marino       explicit
360*e4b17023SJohn Marino       codecvt(__c_locale __cloc, size_t __refs = 0);
361*e4b17023SJohn Marino 
362*e4b17023SJohn Marino     protected:
363*e4b17023SJohn Marino       virtual
364*e4b17023SJohn Marino       ~codecvt();
365*e4b17023SJohn Marino 
366*e4b17023SJohn Marino       virtual result
367*e4b17023SJohn Marino       do_out(state_type& __state, const intern_type* __from,
368*e4b17023SJohn Marino 	     const intern_type* __from_end, const intern_type*& __from_next,
369*e4b17023SJohn Marino 	     extern_type* __to, extern_type* __to_end,
370*e4b17023SJohn Marino 	     extern_type*& __to_next) const;
371*e4b17023SJohn Marino 
372*e4b17023SJohn Marino       virtual result
373*e4b17023SJohn Marino       do_unshift(state_type& __state, extern_type* __to,
374*e4b17023SJohn Marino 		 extern_type* __to_end, extern_type*& __to_next) const;
375*e4b17023SJohn Marino 
376*e4b17023SJohn Marino       virtual result
377*e4b17023SJohn Marino       do_in(state_type& __state, const extern_type* __from,
378*e4b17023SJohn Marino 	    const extern_type* __from_end, const extern_type*& __from_next,
379*e4b17023SJohn Marino 	    intern_type* __to, intern_type* __to_end,
380*e4b17023SJohn Marino 	    intern_type*& __to_next) const;
381*e4b17023SJohn Marino 
382*e4b17023SJohn Marino       virtual int
383*e4b17023SJohn Marino       do_encoding() const throw();
384*e4b17023SJohn Marino 
385*e4b17023SJohn Marino       virtual bool
386*e4b17023SJohn Marino       do_always_noconv() const throw();
387*e4b17023SJohn Marino 
388*e4b17023SJohn Marino       virtual int
389*e4b17023SJohn Marino       do_length(state_type&, const extern_type* __from,
390*e4b17023SJohn Marino 		const extern_type* __end, size_t __max) const;
391*e4b17023SJohn Marino 
392*e4b17023SJohn Marino       virtual int
393*e4b17023SJohn Marino       do_max_length() const throw();
394*e4b17023SJohn Marino   };
395*e4b17023SJohn Marino 
396*e4b17023SJohn Marino #ifdef _GLIBCXX_USE_WCHAR_T
397*e4b17023SJohn Marino   /// class codecvt<wchar_t, char, mbstate_t> specialization.
398*e4b17023SJohn Marino   template<>
399*e4b17023SJohn Marino     class codecvt<wchar_t, char, mbstate_t>
400*e4b17023SJohn Marino     : public __codecvt_abstract_base<wchar_t, char, mbstate_t>
401*e4b17023SJohn Marino     {
402*e4b17023SJohn Marino     public:
403*e4b17023SJohn Marino       // Types:
404*e4b17023SJohn Marino       typedef wchar_t			intern_type;
405*e4b17023SJohn Marino       typedef char			extern_type;
406*e4b17023SJohn Marino       typedef mbstate_t			state_type;
407*e4b17023SJohn Marino 
408*e4b17023SJohn Marino     protected:
409*e4b17023SJohn Marino       __c_locale			_M_c_locale_codecvt;
410*e4b17023SJohn Marino 
411*e4b17023SJohn Marino     public:
412*e4b17023SJohn Marino       static locale::id			id;
413*e4b17023SJohn Marino 
414*e4b17023SJohn Marino       explicit
415*e4b17023SJohn Marino       codecvt(size_t __refs = 0);
416*e4b17023SJohn Marino 
417*e4b17023SJohn Marino       explicit
418*e4b17023SJohn Marino       codecvt(__c_locale __cloc, size_t __refs = 0);
419*e4b17023SJohn Marino 
420*e4b17023SJohn Marino     protected:
421*e4b17023SJohn Marino       virtual
422*e4b17023SJohn Marino       ~codecvt();
423*e4b17023SJohn Marino 
424*e4b17023SJohn Marino       virtual result
425*e4b17023SJohn Marino       do_out(state_type& __state, const intern_type* __from,
426*e4b17023SJohn Marino 	     const intern_type* __from_end, const intern_type*& __from_next,
427*e4b17023SJohn Marino 	     extern_type* __to, extern_type* __to_end,
428*e4b17023SJohn Marino 	     extern_type*& __to_next) const;
429*e4b17023SJohn Marino 
430*e4b17023SJohn Marino       virtual result
431*e4b17023SJohn Marino       do_unshift(state_type& __state,
432*e4b17023SJohn Marino 		 extern_type* __to, extern_type* __to_end,
433*e4b17023SJohn Marino 		 extern_type*& __to_next) const;
434*e4b17023SJohn Marino 
435*e4b17023SJohn Marino       virtual result
436*e4b17023SJohn Marino       do_in(state_type& __state,
437*e4b17023SJohn Marino 	     const extern_type* __from, const extern_type* __from_end,
438*e4b17023SJohn Marino 	     const extern_type*& __from_next,
439*e4b17023SJohn Marino 	     intern_type* __to, intern_type* __to_end,
440*e4b17023SJohn Marino 	     intern_type*& __to_next) const;
441*e4b17023SJohn Marino 
442*e4b17023SJohn Marino       virtual
443*e4b17023SJohn Marino       int do_encoding() const throw();
444*e4b17023SJohn Marino 
445*e4b17023SJohn Marino       virtual
446*e4b17023SJohn Marino       bool do_always_noconv() const throw();
447*e4b17023SJohn Marino 
448*e4b17023SJohn Marino       virtual
449*e4b17023SJohn Marino       int do_length(state_type&, const extern_type* __from,
450*e4b17023SJohn Marino 		    const extern_type* __end, size_t __max) const;
451*e4b17023SJohn Marino 
452*e4b17023SJohn Marino       virtual int
453*e4b17023SJohn Marino       do_max_length() const throw();
454*e4b17023SJohn Marino     };
455*e4b17023SJohn Marino #endif //_GLIBCXX_USE_WCHAR_T
456*e4b17023SJohn Marino 
457*e4b17023SJohn Marino   /// class codecvt_byname [22.2.1.6].
458*e4b17023SJohn Marino   template<typename _InternT, typename _ExternT, typename _StateT>
459*e4b17023SJohn Marino     class codecvt_byname : public codecvt<_InternT, _ExternT, _StateT>
460*e4b17023SJohn Marino     {
461*e4b17023SJohn Marino     public:
462*e4b17023SJohn Marino       explicit
463*e4b17023SJohn Marino       codecvt_byname(const char* __s, size_t __refs = 0)
464*e4b17023SJohn Marino       : codecvt<_InternT, _ExternT, _StateT>(__refs)
465*e4b17023SJohn Marino       {
466*e4b17023SJohn Marino 	if (__builtin_strcmp(__s, "C") != 0
467*e4b17023SJohn Marino 	    && __builtin_strcmp(__s, "POSIX") != 0)
468*e4b17023SJohn Marino 	  {
469*e4b17023SJohn Marino 	    this->_S_destroy_c_locale(this->_M_c_locale_codecvt);
470*e4b17023SJohn Marino 	    this->_S_create_c_locale(this->_M_c_locale_codecvt, __s);
471*e4b17023SJohn Marino 	  }
472*e4b17023SJohn Marino       }
473*e4b17023SJohn Marino 
474*e4b17023SJohn Marino     protected:
475*e4b17023SJohn Marino       virtual
476*e4b17023SJohn Marino       ~codecvt_byname() { }
477*e4b17023SJohn Marino     };
478*e4b17023SJohn Marino 
479*e4b17023SJohn Marino   // Inhibit implicit instantiations for required instantiations,
480*e4b17023SJohn Marino   // which are defined via explicit instantiations elsewhere.
481*e4b17023SJohn Marino #if _GLIBCXX_EXTERN_TEMPLATE
482*e4b17023SJohn Marino   extern template class codecvt_byname<char, char, mbstate_t>;
483*e4b17023SJohn Marino 
484*e4b17023SJohn Marino   extern template
485*e4b17023SJohn Marino     const codecvt<char, char, mbstate_t>&
486*e4b17023SJohn Marino     use_facet<codecvt<char, char, mbstate_t> >(const locale&);
487*e4b17023SJohn Marino 
488*e4b17023SJohn Marino   extern template
489*e4b17023SJohn Marino     bool
490*e4b17023SJohn Marino     has_facet<codecvt<char, char, mbstate_t> >(const locale&);
491*e4b17023SJohn Marino 
492*e4b17023SJohn Marino #ifdef _GLIBCXX_USE_WCHAR_T
493*e4b17023SJohn Marino   extern template class codecvt_byname<wchar_t, char, mbstate_t>;
494*e4b17023SJohn Marino 
495*e4b17023SJohn Marino   extern template
496*e4b17023SJohn Marino     const codecvt<wchar_t, char, mbstate_t>&
497*e4b17023SJohn Marino     use_facet<codecvt<wchar_t, char, mbstate_t> >(const locale&);
498*e4b17023SJohn Marino 
499*e4b17023SJohn Marino   extern template
500*e4b17023SJohn Marino     bool
501*e4b17023SJohn Marino     has_facet<codecvt<wchar_t, char, mbstate_t> >(const locale&);
502*e4b17023SJohn Marino #endif
503*e4b17023SJohn Marino #endif
504*e4b17023SJohn Marino 
505*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_VERSION
506*e4b17023SJohn Marino } // namespace std
507*e4b17023SJohn Marino 
508*e4b17023SJohn Marino #endif // _CODECVT_H
509