100db7afdSDavid E. O'Brien // Locale support (codecvt) -*- C++ -*-
200db7afdSDavid E. O'Brien 
3*f8a1b7d9SAlexander Kabaev // Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005
4*f8a1b7d9SAlexander Kabaev //  Free Software Foundation, Inc.
500db7afdSDavid E. O'Brien //
600db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library.  This library is free
700db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the
800db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the
900db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option)
1000db7afdSDavid E. O'Brien // any later version.
1100db7afdSDavid E. O'Brien 
1200db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful,
1300db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of
1400db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1500db7afdSDavid E. O'Brien // GNU General Public License for more details.
1600db7afdSDavid E. O'Brien 
1700db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along
1800db7afdSDavid E. O'Brien // with this library; see the file COPYING.  If not, write to the Free
19*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
2000db7afdSDavid E. O'Brien // USA.
2100db7afdSDavid E. O'Brien 
2200db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software
2300db7afdSDavid E. O'Brien // library without restriction.  Specifically, if other files instantiate
2400db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile
2500db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this
2600db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by
2700db7afdSDavid E. O'Brien // the GNU General Public License.  This exception does not however
2800db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by
2900db7afdSDavid E. O'Brien // the GNU General Public License.
3000db7afdSDavid E. O'Brien 
31*f8a1b7d9SAlexander Kabaev /** @file bits/codecvt.h
32*f8a1b7d9SAlexander Kabaev  *  This is an internal header file, included by other library headers.
33*f8a1b7d9SAlexander Kabaev  *  You should not attempt to use it directly.
34*f8a1b7d9SAlexander Kabaev  */
35*f8a1b7d9SAlexander Kabaev 
3600db7afdSDavid E. O'Brien //
3700db7afdSDavid E. O'Brien // ISO C++ 14882: 22.2.1.5 Template class codecvt
3800db7afdSDavid E. O'Brien //
3900db7afdSDavid E. O'Brien 
40*f8a1b7d9SAlexander Kabaev // Written by Benjamin Kosnik <[email protected]>
4100db7afdSDavid E. O'Brien 
42ffeaf689SAlexander Kabaev #ifndef _CODECVT_H
43ffeaf689SAlexander Kabaev #define _CODECVT_H 1
4400db7afdSDavid E. O'Brien 
4500db7afdSDavid E. O'Brien #pragma GCC system_header
4600db7afdSDavid E. O'Brien 
_GLIBCXX_BEGIN_NAMESPACE(std)47*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
48*f8a1b7d9SAlexander Kabaev 
49*f8a1b7d9SAlexander Kabaev   /// @brief  Empty base class for codecvt facet [22.2.1.5].
5000db7afdSDavid E. O'Brien   class codecvt_base
5100db7afdSDavid E. O'Brien   {
5200db7afdSDavid E. O'Brien   public:
5300db7afdSDavid E. O'Brien     enum result
5400db7afdSDavid E. O'Brien     {
5500db7afdSDavid E. O'Brien       ok,
5600db7afdSDavid E. O'Brien       partial,
5700db7afdSDavid E. O'Brien       error,
5800db7afdSDavid E. O'Brien       noconv
5900db7afdSDavid E. O'Brien     };
6000db7afdSDavid E. O'Brien   };
6100db7afdSDavid E. O'Brien 
62ffeaf689SAlexander Kabaev   /**
63*f8a1b7d9SAlexander Kabaev    *  @brief  Common base for codecvt functions.
64ffeaf689SAlexander Kabaev    *
65ffeaf689SAlexander Kabaev    *  This template class provides implementations of the public functions
66ffeaf689SAlexander Kabaev    *  that forward to the protected virtual functions.
67ffeaf689SAlexander Kabaev    *
68ffeaf689SAlexander Kabaev    *  This template also provides abstract stubs for the protected virtual
69ffeaf689SAlexander Kabaev    *  functions.
70ffeaf689SAlexander Kabaev   */
7100db7afdSDavid E. O'Brien   template<typename _InternT, typename _ExternT, typename _StateT>
7200db7afdSDavid E. O'Brien     class __codecvt_abstract_base
7300db7afdSDavid E. O'Brien     : public locale::facet, public codecvt_base
7400db7afdSDavid E. O'Brien     {
7500db7afdSDavid E. O'Brien     public:
7600db7afdSDavid E. O'Brien       // Types:
7700db7afdSDavid E. O'Brien       typedef codecvt_base::result	result;
7800db7afdSDavid E. O'Brien       typedef _InternT			intern_type;
7900db7afdSDavid E. O'Brien       typedef _ExternT			extern_type;
8000db7afdSDavid E. O'Brien       typedef _StateT			state_type;
8100db7afdSDavid E. O'Brien 
8200db7afdSDavid E. O'Brien       // 22.2.1.5.1 codecvt members
83ffeaf689SAlexander Kabaev       /**
84ffeaf689SAlexander Kabaev        *  @brief  Convert from internal to external character set.
85ffeaf689SAlexander Kabaev        *
86ffeaf689SAlexander Kabaev        *  Converts input string of intern_type to output string of
87ffeaf689SAlexander Kabaev        *  extern_type.  This is analogous to wcsrtombs.  It does this by
88ffeaf689SAlexander Kabaev        *  calling codecvt::do_out.
89ffeaf689SAlexander Kabaev        *
90ffeaf689SAlexander Kabaev        *  The source and destination character sets are determined by the
91ffeaf689SAlexander Kabaev        *  facet's locale, internal and external types.
92ffeaf689SAlexander Kabaev        *
93ffeaf689SAlexander Kabaev        *  The characters in [from,from_end) are converted and written to
94ffeaf689SAlexander Kabaev        *  [to,to_end).  from_next and to_next are set to point to the
95ffeaf689SAlexander Kabaev        *  character following the last successfully converted character,
96ffeaf689SAlexander Kabaev        *  respectively.  If the result needed no conversion, from_next and
97ffeaf689SAlexander Kabaev        *  to_next are not affected.
98ffeaf689SAlexander Kabaev        *
99ffeaf689SAlexander Kabaev        *  The @a state argument should be intialized if the input is at the
100ffeaf689SAlexander Kabaev        *  beginning and carried from a previous call if continuing
101ffeaf689SAlexander Kabaev        *  conversion.  There are no guarantees about how @a state is used.
102ffeaf689SAlexander Kabaev        *
103*f8a1b7d9SAlexander Kabaev        *  The result returned is a member of codecvt_base::result.  If
104*f8a1b7d9SAlexander Kabaev        *  all the input is converted, returns codecvt_base::ok.  If no
105*f8a1b7d9SAlexander Kabaev        *  conversion is necessary, returns codecvt_base::noconv.  If
106*f8a1b7d9SAlexander Kabaev        *  the input ends early or there is insufficient space in the
107*f8a1b7d9SAlexander Kabaev        *  output, returns codecvt_base::partial.  Otherwise the
108*f8a1b7d9SAlexander Kabaev        *  conversion failed and codecvt_base::error is returned.
109ffeaf689SAlexander Kabaev        *
110ffeaf689SAlexander Kabaev        *  @param  state  Persistent conversion state data.
111ffeaf689SAlexander Kabaev        *  @param  from  Start of input.
112ffeaf689SAlexander Kabaev        *  @param  from_end  End of input.
113ffeaf689SAlexander Kabaev        *  @param  from_next  Returns start of unconverted data.
114ffeaf689SAlexander Kabaev        *  @param  to  Start of output buffer.
115ffeaf689SAlexander Kabaev        *  @param  to_end  End of output buffer.
116ffeaf689SAlexander Kabaev        *  @param  to_next  Returns start of unused output area.
117ffeaf689SAlexander Kabaev        *  @return  codecvt_base::result.
118ffeaf689SAlexander Kabaev       */
11900db7afdSDavid E. O'Brien       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)12000db7afdSDavid E. O'Brien       out(state_type& __state, const intern_type* __from,
12100db7afdSDavid E. O'Brien 	  const intern_type* __from_end, const intern_type*& __from_next,
12200db7afdSDavid E. O'Brien 	  extern_type* __to, extern_type* __to_end,
12300db7afdSDavid E. O'Brien 	  extern_type*& __to_next) const
12400db7afdSDavid E. O'Brien       {
12500db7afdSDavid E. O'Brien 	return this->do_out(__state, __from, __from_end, __from_next,
12600db7afdSDavid E. O'Brien 			    __to, __to_end, __to_next);
12700db7afdSDavid E. O'Brien       }
12800db7afdSDavid E. O'Brien 
129ffeaf689SAlexander Kabaev       /**
130ffeaf689SAlexander Kabaev        *  @brief  Reset conversion state.
131ffeaf689SAlexander Kabaev        *
132ffeaf689SAlexander Kabaev        *  Writes characters to output that would restore @a state to initial
133ffeaf689SAlexander Kabaev        *  conditions.  The idea is that if a partial conversion occurs, then
134ffeaf689SAlexander Kabaev        *  the converting the characters written by this function would leave
135ffeaf689SAlexander Kabaev        *  the state in initial conditions, rather than partial conversion
136ffeaf689SAlexander Kabaev        *  state.  It does this by calling codecvt::do_unshift().
137ffeaf689SAlexander Kabaev        *
138ffeaf689SAlexander Kabaev        *  For example, if 4 external characters always converted to 1 internal
139ffeaf689SAlexander Kabaev        *  character, and input to in() had 6 external characters with state
140ffeaf689SAlexander Kabaev        *  saved, this function would write two characters to the output and
141ffeaf689SAlexander Kabaev        *  set the state to initialized conditions.
142ffeaf689SAlexander Kabaev        *
143ffeaf689SAlexander Kabaev        *  The source and destination character sets are determined by the
144ffeaf689SAlexander Kabaev        *  facet's locale, internal and external types.
145ffeaf689SAlexander Kabaev        *
146ffeaf689SAlexander Kabaev        *  The result returned is a member of codecvt_base::result.  If the
147ffeaf689SAlexander Kabaev        *  state could be reset and data written, returns codecvt_base::ok.  If
148ffeaf689SAlexander Kabaev        *  no conversion is necessary, returns codecvt_base::noconv.  If the
149ffeaf689SAlexander Kabaev        *  output has insufficient space, returns codecvt_base::partial.
150ffeaf689SAlexander Kabaev        *  Otherwise the reset failed and codecvt_base::error is returned.
151ffeaf689SAlexander Kabaev        *
152ffeaf689SAlexander Kabaev        *  @param  state  Persistent conversion state data.
153ffeaf689SAlexander Kabaev        *  @param  to  Start of output buffer.
154ffeaf689SAlexander Kabaev        *  @param  to_end  End of output buffer.
155ffeaf689SAlexander Kabaev        *  @param  to_next  Returns start of unused output area.
156ffeaf689SAlexander Kabaev        *  @return  codecvt_base::result.
157ffeaf689SAlexander Kabaev       */
15800db7afdSDavid E. O'Brien       result
unshift(state_type & __state,extern_type * __to,extern_type * __to_end,extern_type * & __to_next)15900db7afdSDavid E. O'Brien       unshift(state_type& __state, extern_type* __to, extern_type* __to_end,
16000db7afdSDavid E. O'Brien 	      extern_type*& __to_next) const
16100db7afdSDavid E. O'Brien       { return this->do_unshift(__state, __to,__to_end,__to_next); }
16200db7afdSDavid E. O'Brien 
163ffeaf689SAlexander Kabaev       /**
164ffeaf689SAlexander Kabaev        *  @brief  Convert from external to internal character set.
165ffeaf689SAlexander Kabaev        *
166ffeaf689SAlexander Kabaev        *  Converts input string of extern_type to output string of
167ffeaf689SAlexander Kabaev        *  intern_type.  This is analogous to mbsrtowcs.  It does this by
168ffeaf689SAlexander Kabaev        *  calling codecvt::do_in.
169ffeaf689SAlexander Kabaev        *
170ffeaf689SAlexander Kabaev        *  The source and destination character sets are determined by the
171ffeaf689SAlexander Kabaev        *  facet's locale, internal and external types.
172ffeaf689SAlexander Kabaev        *
173ffeaf689SAlexander Kabaev        *  The characters in [from,from_end) are converted and written to
174ffeaf689SAlexander Kabaev        *  [to,to_end).  from_next and to_next are set to point to the
175ffeaf689SAlexander Kabaev        *  character following the last successfully converted character,
176ffeaf689SAlexander Kabaev        *  respectively.  If the result needed no conversion, from_next and
177ffeaf689SAlexander Kabaev        *  to_next are not affected.
178ffeaf689SAlexander Kabaev        *
179ffeaf689SAlexander Kabaev        *  The @a state argument should be intialized if the input is at the
180ffeaf689SAlexander Kabaev        *  beginning and carried from a previous call if continuing
181ffeaf689SAlexander Kabaev        *  conversion.  There are no guarantees about how @a state is used.
182ffeaf689SAlexander Kabaev        *
183*f8a1b7d9SAlexander Kabaev        *  The result returned is a member of codecvt_base::result.  If
184*f8a1b7d9SAlexander Kabaev        *  all the input is converted, returns codecvt_base::ok.  If no
185*f8a1b7d9SAlexander Kabaev        *  conversion is necessary, returns codecvt_base::noconv.  If
186*f8a1b7d9SAlexander Kabaev        *  the input ends early or there is insufficient space in the
187*f8a1b7d9SAlexander Kabaev        *  output, returns codecvt_base::partial.  Otherwise the
188*f8a1b7d9SAlexander Kabaev        *  conversion failed and codecvt_base::error is returned.
189ffeaf689SAlexander Kabaev        *
190ffeaf689SAlexander Kabaev        *  @param  state  Persistent conversion state data.
191ffeaf689SAlexander Kabaev        *  @param  from  Start of input.
192ffeaf689SAlexander Kabaev        *  @param  from_end  End of input.
193ffeaf689SAlexander Kabaev        *  @param  from_next  Returns start of unconverted data.
194ffeaf689SAlexander Kabaev        *  @param  to  Start of output buffer.
195ffeaf689SAlexander Kabaev        *  @param  to_end  End of output buffer.
196ffeaf689SAlexander Kabaev        *  @param  to_next  Returns start of unused output area.
197ffeaf689SAlexander Kabaev        *  @return  codecvt_base::result.
198ffeaf689SAlexander Kabaev       */
19900db7afdSDavid E. O'Brien       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)20000db7afdSDavid E. O'Brien       in(state_type& __state, const extern_type* __from,
20100db7afdSDavid E. O'Brien 	 const extern_type* __from_end, const extern_type*& __from_next,
20200db7afdSDavid E. O'Brien 	 intern_type* __to, intern_type* __to_end,
20300db7afdSDavid E. O'Brien 	 intern_type*& __to_next) const
20400db7afdSDavid E. O'Brien       {
20500db7afdSDavid E. O'Brien 	return this->do_in(__state, __from, __from_end, __from_next,
20600db7afdSDavid E. O'Brien 			   __to, __to_end, __to_next);
20700db7afdSDavid E. O'Brien       }
20800db7afdSDavid E. O'Brien 
20900db7afdSDavid E. O'Brien       int
encoding()21000db7afdSDavid E. O'Brien       encoding() const throw()
21100db7afdSDavid E. O'Brien       { return this->do_encoding(); }
21200db7afdSDavid E. O'Brien 
21300db7afdSDavid E. O'Brien       bool
always_noconv()21400db7afdSDavid E. O'Brien       always_noconv() const throw()
21500db7afdSDavid E. O'Brien       { return this->do_always_noconv(); }
21600db7afdSDavid E. O'Brien 
21700db7afdSDavid E. O'Brien       int
length(state_type & __state,const extern_type * __from,const extern_type * __end,size_t __max)218ffeaf689SAlexander Kabaev       length(state_type& __state, const extern_type* __from,
21900db7afdSDavid E. O'Brien 	     const extern_type* __end, size_t __max) const
22000db7afdSDavid E. O'Brien       { return this->do_length(__state, __from, __end, __max); }
22100db7afdSDavid E. O'Brien 
22200db7afdSDavid E. O'Brien       int
max_length()22300db7afdSDavid E. O'Brien       max_length() const throw()
22400db7afdSDavid E. O'Brien       { return this->do_max_length(); }
22500db7afdSDavid E. O'Brien 
22600db7afdSDavid E. O'Brien     protected:
22700db7afdSDavid E. O'Brien       explicit
facet(__refs)22800db7afdSDavid E. O'Brien       __codecvt_abstract_base(size_t __refs = 0) : locale::facet(__refs) { }
22900db7afdSDavid E. O'Brien 
23000db7afdSDavid E. O'Brien       virtual
~__codecvt_abstract_base()23100db7afdSDavid E. O'Brien       ~__codecvt_abstract_base() { }
23200db7afdSDavid E. O'Brien 
233ffeaf689SAlexander Kabaev       /**
234ffeaf689SAlexander Kabaev        *  @brief  Convert from internal to external character set.
235ffeaf689SAlexander Kabaev        *
236ffeaf689SAlexander Kabaev        *  Converts input string of intern_type to output string of
237ffeaf689SAlexander Kabaev        *  extern_type.  This function is a hook for derived classes to change
238ffeaf689SAlexander Kabaev        *  the value returned.  @see out for more information.
239ffeaf689SAlexander Kabaev       */
24000db7afdSDavid E. O'Brien       virtual result
24100db7afdSDavid E. O'Brien       do_out(state_type& __state, const intern_type* __from,
24200db7afdSDavid E. O'Brien 	     const intern_type* __from_end, const intern_type*& __from_next,
24300db7afdSDavid E. O'Brien 	     extern_type* __to, extern_type* __to_end,
24400db7afdSDavid E. O'Brien 	     extern_type*& __to_next) const = 0;
24500db7afdSDavid E. O'Brien 
24600db7afdSDavid E. O'Brien       virtual result
24700db7afdSDavid E. O'Brien       do_unshift(state_type& __state, extern_type* __to,
24800db7afdSDavid E. O'Brien 		 extern_type* __to_end, extern_type*& __to_next) const = 0;
24900db7afdSDavid E. O'Brien 
25000db7afdSDavid E. O'Brien       virtual result
25100db7afdSDavid E. O'Brien       do_in(state_type& __state, const extern_type* __from,
25200db7afdSDavid E. O'Brien 	    const extern_type* __from_end, const extern_type*& __from_next,
25300db7afdSDavid E. O'Brien 	    intern_type* __to, intern_type* __to_end,
25400db7afdSDavid E. O'Brien 	    intern_type*& __to_next) const = 0;
25500db7afdSDavid E. O'Brien 
25600db7afdSDavid E. O'Brien       virtual int
25700db7afdSDavid E. O'Brien       do_encoding() const throw() = 0;
25800db7afdSDavid E. O'Brien 
25900db7afdSDavid E. O'Brien       virtual bool
26000db7afdSDavid E. O'Brien       do_always_noconv() const throw() = 0;
26100db7afdSDavid E. O'Brien 
26200db7afdSDavid E. O'Brien       virtual int
263ffeaf689SAlexander Kabaev       do_length(state_type&, const extern_type* __from,
26400db7afdSDavid E. O'Brien 		const extern_type* __end, size_t __max) const = 0;
26500db7afdSDavid E. O'Brien 
26600db7afdSDavid E. O'Brien       virtual int
26700db7afdSDavid E. O'Brien       do_max_length() const throw() = 0;
26800db7afdSDavid E. O'Brien     };
26900db7afdSDavid E. O'Brien 
270*f8a1b7d9SAlexander Kabaev   /// @brief class codecvt [22.2.1.5].
271*f8a1b7d9SAlexander Kabaev   /// NB: Generic, mostly useless implementation.
27200db7afdSDavid E. O'Brien   template<typename _InternT, typename _ExternT, typename _StateT>
27300db7afdSDavid E. O'Brien     class codecvt
27400db7afdSDavid E. O'Brien     : public __codecvt_abstract_base<_InternT, _ExternT, _StateT>
27500db7afdSDavid E. O'Brien     {
27600db7afdSDavid E. O'Brien     public:
27700db7afdSDavid E. O'Brien       // Types:
27800db7afdSDavid E. O'Brien       typedef codecvt_base::result	result;
27900db7afdSDavid E. O'Brien       typedef _InternT			intern_type;
28000db7afdSDavid E. O'Brien       typedef _ExternT			extern_type;
28100db7afdSDavid E. O'Brien       typedef _StateT			state_type;
28200db7afdSDavid E. O'Brien 
283ffeaf689SAlexander Kabaev     protected:
284ffeaf689SAlexander Kabaev       __c_locale			_M_c_locale_codecvt;
285ffeaf689SAlexander Kabaev 
28620250742SAlexander Kabaev     public:
28700db7afdSDavid E. O'Brien       static locale::id			id;
28800db7afdSDavid E. O'Brien 
28900db7afdSDavid E. O'Brien       explicit
29000db7afdSDavid E. O'Brien       codecvt(size_t __refs = 0)
29100db7afdSDavid E. O'Brien       : __codecvt_abstract_base<_InternT, _ExternT, _StateT> (__refs) { }
29200db7afdSDavid E. O'Brien 
293ffeaf689SAlexander Kabaev       explicit
294ffeaf689SAlexander Kabaev       codecvt(__c_locale __cloc, size_t __refs = 0);
295ffeaf689SAlexander Kabaev 
29600db7afdSDavid E. O'Brien     protected:
29700db7afdSDavid E. O'Brien       virtual
~codecvt()29800db7afdSDavid E. O'Brien       ~codecvt() { }
29900db7afdSDavid E. O'Brien 
30000db7afdSDavid E. O'Brien       virtual result
30100db7afdSDavid E. O'Brien       do_out(state_type& __state, const intern_type* __from,
30200db7afdSDavid E. O'Brien 	     const intern_type* __from_end, const intern_type*& __from_next,
30300db7afdSDavid E. O'Brien 	     extern_type* __to, extern_type* __to_end,
30400db7afdSDavid E. O'Brien 	     extern_type*& __to_next) const;
30500db7afdSDavid E. O'Brien 
30600db7afdSDavid E. O'Brien       virtual result
30700db7afdSDavid E. O'Brien       do_unshift(state_type& __state, extern_type* __to,
30800db7afdSDavid E. O'Brien 		 extern_type* __to_end, extern_type*& __to_next) const;
30900db7afdSDavid E. O'Brien 
31000db7afdSDavid E. O'Brien       virtual result
31100db7afdSDavid E. O'Brien       do_in(state_type& __state, const extern_type* __from,
31200db7afdSDavid E. O'Brien 	    const extern_type* __from_end, const extern_type*& __from_next,
31300db7afdSDavid E. O'Brien 	    intern_type* __to, intern_type* __to_end,
31400db7afdSDavid E. O'Brien 	    intern_type*& __to_next) const;
31500db7afdSDavid E. O'Brien 
31600db7afdSDavid E. O'Brien       virtual int
31700db7afdSDavid E. O'Brien       do_encoding() const throw();
31800db7afdSDavid E. O'Brien 
31900db7afdSDavid E. O'Brien       virtual bool
32000db7afdSDavid E. O'Brien       do_always_noconv() const throw();
32100db7afdSDavid E. O'Brien 
32200db7afdSDavid E. O'Brien       virtual int
323ffeaf689SAlexander Kabaev       do_length(state_type&, const extern_type* __from,
32400db7afdSDavid E. O'Brien 		const extern_type* __end, size_t __max) const;
32500db7afdSDavid E. O'Brien 
32600db7afdSDavid E. O'Brien       virtual int
32700db7afdSDavid E. O'Brien       do_max_length() const throw();
32800db7afdSDavid E. O'Brien     };
32900db7afdSDavid E. O'Brien 
33000db7afdSDavid E. O'Brien   template<typename _InternT, typename _ExternT, typename _StateT>
33100db7afdSDavid E. O'Brien     locale::id codecvt<_InternT, _ExternT, _StateT>::id;
33200db7afdSDavid E. O'Brien 
333*f8a1b7d9SAlexander Kabaev   /// @brief class codecvt<char, char, mbstate_t> specialization.
33400db7afdSDavid E. O'Brien   template<>
33500db7afdSDavid E. O'Brien     class codecvt<char, char, mbstate_t>
33600db7afdSDavid E. O'Brien     : public __codecvt_abstract_base<char, char, mbstate_t>
33700db7afdSDavid E. O'Brien     {
33800db7afdSDavid E. O'Brien     public:
33900db7afdSDavid E. O'Brien       // Types:
34000db7afdSDavid E. O'Brien       typedef char			intern_type;
34100db7afdSDavid E. O'Brien       typedef char			extern_type;
34200db7afdSDavid E. O'Brien       typedef mbstate_t			state_type;
34300db7afdSDavid E. O'Brien 
344ffeaf689SAlexander Kabaev     protected:
345ffeaf689SAlexander Kabaev       __c_locale			_M_c_locale_codecvt;
346ffeaf689SAlexander Kabaev 
34720250742SAlexander Kabaev     public:
34800db7afdSDavid E. O'Brien       static locale::id id;
34900db7afdSDavid E. O'Brien 
35000db7afdSDavid E. O'Brien       explicit
35100db7afdSDavid E. O'Brien       codecvt(size_t __refs = 0);
35200db7afdSDavid E. O'Brien 
353ffeaf689SAlexander Kabaev       explicit
354ffeaf689SAlexander Kabaev       codecvt(__c_locale __cloc, size_t __refs = 0);
355ffeaf689SAlexander Kabaev 
35600db7afdSDavid E. O'Brien     protected:
35700db7afdSDavid E. O'Brien       virtual
35800db7afdSDavid E. O'Brien       ~codecvt();
35900db7afdSDavid E. O'Brien 
36000db7afdSDavid E. O'Brien       virtual result
36100db7afdSDavid E. O'Brien       do_out(state_type& __state, const intern_type* __from,
36200db7afdSDavid E. O'Brien 	     const intern_type* __from_end, const intern_type*& __from_next,
36300db7afdSDavid E. O'Brien 	     extern_type* __to, extern_type* __to_end,
36400db7afdSDavid E. O'Brien 	     extern_type*& __to_next) const;
36500db7afdSDavid E. O'Brien 
36600db7afdSDavid E. O'Brien       virtual result
36700db7afdSDavid E. O'Brien       do_unshift(state_type& __state, extern_type* __to,
36800db7afdSDavid E. O'Brien 		 extern_type* __to_end, extern_type*& __to_next) const;
36900db7afdSDavid E. O'Brien 
37000db7afdSDavid E. O'Brien       virtual result
37100db7afdSDavid E. O'Brien       do_in(state_type& __state, const extern_type* __from,
37200db7afdSDavid E. O'Brien 	    const extern_type* __from_end, const extern_type*& __from_next,
37300db7afdSDavid E. O'Brien 	    intern_type* __to, intern_type* __to_end,
37400db7afdSDavid E. O'Brien 	    intern_type*& __to_next) const;
37500db7afdSDavid E. O'Brien 
37600db7afdSDavid E. O'Brien       virtual int
37700db7afdSDavid E. O'Brien       do_encoding() const throw();
37800db7afdSDavid E. O'Brien 
37900db7afdSDavid E. O'Brien       virtual bool
38000db7afdSDavid E. O'Brien       do_always_noconv() const throw();
38100db7afdSDavid E. O'Brien 
38200db7afdSDavid E. O'Brien       virtual int
383ffeaf689SAlexander Kabaev       do_length(state_type&, const extern_type* __from,
38400db7afdSDavid E. O'Brien 		const extern_type* __end, size_t __max) const;
38500db7afdSDavid E. O'Brien 
38600db7afdSDavid E. O'Brien       virtual int
38700db7afdSDavid E. O'Brien       do_max_length() const throw();
38800db7afdSDavid E. O'Brien   };
38900db7afdSDavid E. O'Brien 
390ffeaf689SAlexander Kabaev #ifdef _GLIBCXX_USE_WCHAR_T
391*f8a1b7d9SAlexander Kabaev   /// @brief  class codecvt<wchar_t, char, mbstate_t> specialization.
39200db7afdSDavid E. O'Brien   template<>
39300db7afdSDavid E. O'Brien     class codecvt<wchar_t, char, mbstate_t>
39400db7afdSDavid E. O'Brien     : public __codecvt_abstract_base<wchar_t, char, mbstate_t>
39500db7afdSDavid E. O'Brien     {
39600db7afdSDavid E. O'Brien     public:
39700db7afdSDavid E. O'Brien       // Types:
39800db7afdSDavid E. O'Brien       typedef wchar_t			intern_type;
39900db7afdSDavid E. O'Brien       typedef char			extern_type;
40000db7afdSDavid E. O'Brien       typedef mbstate_t			state_type;
40100db7afdSDavid E. O'Brien 
402ffeaf689SAlexander Kabaev     protected:
403ffeaf689SAlexander Kabaev       __c_locale			_M_c_locale_codecvt;
404ffeaf689SAlexander Kabaev 
40520250742SAlexander Kabaev     public:
40600db7afdSDavid E. O'Brien       static locale::id			id;
40700db7afdSDavid E. O'Brien 
40800db7afdSDavid E. O'Brien       explicit
40900db7afdSDavid E. O'Brien       codecvt(size_t __refs = 0);
41000db7afdSDavid E. O'Brien 
411ffeaf689SAlexander Kabaev       explicit
412ffeaf689SAlexander Kabaev       codecvt(__c_locale __cloc, size_t __refs = 0);
413ffeaf689SAlexander Kabaev 
41400db7afdSDavid E. O'Brien     protected:
41500db7afdSDavid E. O'Brien       virtual
41600db7afdSDavid E. O'Brien       ~codecvt();
41700db7afdSDavid E. O'Brien 
41800db7afdSDavid E. O'Brien       virtual result
41900db7afdSDavid E. O'Brien       do_out(state_type& __state, const intern_type* __from,
42000db7afdSDavid E. O'Brien 	     const intern_type* __from_end, const intern_type*& __from_next,
42100db7afdSDavid E. O'Brien 	     extern_type* __to, extern_type* __to_end,
42200db7afdSDavid E. O'Brien 	     extern_type*& __to_next) const;
42300db7afdSDavid E. O'Brien 
42400db7afdSDavid E. O'Brien       virtual result
42500db7afdSDavid E. O'Brien       do_unshift(state_type& __state,
42600db7afdSDavid E. O'Brien 		 extern_type* __to, extern_type* __to_end,
42700db7afdSDavid E. O'Brien 		 extern_type*& __to_next) const;
42800db7afdSDavid E. O'Brien 
42900db7afdSDavid E. O'Brien       virtual result
43000db7afdSDavid E. O'Brien       do_in(state_type& __state,
43100db7afdSDavid E. O'Brien 	     const extern_type* __from, const extern_type* __from_end,
43200db7afdSDavid E. O'Brien 	     const extern_type*& __from_next,
43300db7afdSDavid E. O'Brien 	     intern_type* __to, intern_type* __to_end,
43400db7afdSDavid E. O'Brien 	     intern_type*& __to_next) const;
43500db7afdSDavid E. O'Brien 
43600db7afdSDavid E. O'Brien       virtual
43700db7afdSDavid E. O'Brien       int do_encoding() const throw();
43800db7afdSDavid E. O'Brien 
43900db7afdSDavid E. O'Brien       virtual
44000db7afdSDavid E. O'Brien       bool do_always_noconv() const throw();
44100db7afdSDavid E. O'Brien 
44200db7afdSDavid E. O'Brien       virtual
443ffeaf689SAlexander Kabaev       int do_length(state_type&, const extern_type* __from,
44400db7afdSDavid E. O'Brien 		    const extern_type* __end, size_t __max) const;
44500db7afdSDavid E. O'Brien 
44600db7afdSDavid E. O'Brien       virtual int
44700db7afdSDavid E. O'Brien       do_max_length() const throw();
44800db7afdSDavid E. O'Brien     };
449ffeaf689SAlexander Kabaev #endif //_GLIBCXX_USE_WCHAR_T
45000db7afdSDavid E. O'Brien 
451*f8a1b7d9SAlexander Kabaev   /// @brief class codecvt_byname [22.2.1.6].
45200db7afdSDavid E. O'Brien   template<typename _InternT, typename _ExternT, typename _StateT>
45300db7afdSDavid E. O'Brien     class codecvt_byname : public codecvt<_InternT, _ExternT, _StateT>
45400db7afdSDavid E. O'Brien     {
45500db7afdSDavid E. O'Brien     public:
45600db7afdSDavid E. O'Brien       explicit
457ffeaf689SAlexander Kabaev       codecvt_byname(const char* __s, size_t __refs = 0)
458ffeaf689SAlexander Kabaev       : codecvt<_InternT, _ExternT, _StateT>(__refs)
459ffeaf689SAlexander Kabaev       {
460ffeaf689SAlexander Kabaev 	if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
461ffeaf689SAlexander Kabaev 	  {
462ffeaf689SAlexander Kabaev 	    this->_S_destroy_c_locale(this->_M_c_locale_codecvt);
463ffeaf689SAlexander Kabaev 	    this->_S_create_c_locale(this->_M_c_locale_codecvt, __s);
464ffeaf689SAlexander Kabaev 	  }
465ffeaf689SAlexander Kabaev       }
46620250742SAlexander Kabaev 
46700db7afdSDavid E. O'Brien     protected:
46800db7afdSDavid E. O'Brien       virtual
~codecvt_byname()46900db7afdSDavid E. O'Brien       ~codecvt_byname() { }
47000db7afdSDavid E. O'Brien     };
47100db7afdSDavid E. O'Brien 
472*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
47300db7afdSDavid E. O'Brien 
474ffeaf689SAlexander Kabaev #endif // _CODECVT_H
475