1951a39d68df598db08dfced8b4707755864a0492Ying Wang// Locale support (codecvt) -*- C++ -*-
2951a39d68df598db08dfced8b4707755864a0492Ying Wang
3951a39d68df598db08dfced8b4707755864a0492Ying Wang// Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
4951a39d68df598db08dfced8b4707755864a0492Ying Wang// 2009  Free Software Foundation, Inc.
5951a39d68df598db08dfced8b4707755864a0492Ying Wang//
6951a39d68df598db08dfced8b4707755864a0492Ying Wang// This file is part of the GNU ISO C++ Library.  This library is free
7951a39d68df598db08dfced8b4707755864a0492Ying Wang// software; you can redistribute it and/or modify it under the
8951a39d68df598db08dfced8b4707755864a0492Ying Wang// terms of the GNU General Public License as published by the
9951a39d68df598db08dfced8b4707755864a0492Ying Wang// Free Software Foundation; either version 3, or (at your option)
10951a39d68df598db08dfced8b4707755864a0492Ying Wang// any later version.
11951a39d68df598db08dfced8b4707755864a0492Ying Wang
12951a39d68df598db08dfced8b4707755864a0492Ying Wang// This library is distributed in the hope that it will be useful,
13951a39d68df598db08dfced8b4707755864a0492Ying Wang// but WITHOUT ANY WARRANTY; without even the implied warranty of
14951a39d68df598db08dfced8b4707755864a0492Ying Wang// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15951a39d68df598db08dfced8b4707755864a0492Ying Wang// GNU General Public License for more details.
16951a39d68df598db08dfced8b4707755864a0492Ying Wang
17951a39d68df598db08dfced8b4707755864a0492Ying Wang// Under Section 7 of GPL version 3, you are granted additional
18951a39d68df598db08dfced8b4707755864a0492Ying Wang// permissions described in the GCC Runtime Library Exception, version
19951a39d68df598db08dfced8b4707755864a0492Ying Wang// 3.1, as published by the Free Software Foundation.
20951a39d68df598db08dfced8b4707755864a0492Ying Wang
21951a39d68df598db08dfced8b4707755864a0492Ying Wang// You should have received a copy of the GNU General Public License and
22951a39d68df598db08dfced8b4707755864a0492Ying Wang// a copy of the GCC Runtime Library Exception along with this program;
23951a39d68df598db08dfced8b4707755864a0492Ying Wang// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24951a39d68df598db08dfced8b4707755864a0492Ying Wang// <http://www.gnu.org/licenses/>.
25951a39d68df598db08dfced8b4707755864a0492Ying Wang
26951a39d68df598db08dfced8b4707755864a0492Ying Wang/** @file bits/codecvt.h
27951a39d68df598db08dfced8b4707755864a0492Ying Wang *  This is an internal header file, included by other library headers.
28951a39d68df598db08dfced8b4707755864a0492Ying Wang *  You should not attempt to use it directly.
29951a39d68df598db08dfced8b4707755864a0492Ying Wang */
30951a39d68df598db08dfced8b4707755864a0492Ying Wang
31951a39d68df598db08dfced8b4707755864a0492Ying Wang//
32951a39d68df598db08dfced8b4707755864a0492Ying Wang// ISO C++ 14882: 22.2.1.5 Template class codecvt
33951a39d68df598db08dfced8b4707755864a0492Ying Wang//
34951a39d68df598db08dfced8b4707755864a0492Ying Wang
35951a39d68df598db08dfced8b4707755864a0492Ying Wang// Written by Benjamin Kosnik <bkoz@redhat.com>
36951a39d68df598db08dfced8b4707755864a0492Ying Wang
37951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifndef _CODECVT_H
38951a39d68df598db08dfced8b4707755864a0492Ying Wang#define _CODECVT_H 1
39951a39d68df598db08dfced8b4707755864a0492Ying Wang
40951a39d68df598db08dfced8b4707755864a0492Ying Wang#pragma GCC system_header
41951a39d68df598db08dfced8b4707755864a0492Ying Wang
42951a39d68df598db08dfced8b4707755864a0492Ying Wang_GLIBCXX_BEGIN_NAMESPACE(std)
43951a39d68df598db08dfced8b4707755864a0492Ying Wang
44951a39d68df598db08dfced8b4707755864a0492Ying Wang  /// Empty base class for codecvt facet [22.2.1.5].
45951a39d68df598db08dfced8b4707755864a0492Ying Wang  class codecvt_base
46951a39d68df598db08dfced8b4707755864a0492Ying Wang  {
47951a39d68df598db08dfced8b4707755864a0492Ying Wang  public:
48951a39d68df598db08dfced8b4707755864a0492Ying Wang    enum result
49951a39d68df598db08dfced8b4707755864a0492Ying Wang    {
50951a39d68df598db08dfced8b4707755864a0492Ying Wang      ok,
51951a39d68df598db08dfced8b4707755864a0492Ying Wang      partial,
52951a39d68df598db08dfced8b4707755864a0492Ying Wang      error,
53951a39d68df598db08dfced8b4707755864a0492Ying Wang      noconv
54951a39d68df598db08dfced8b4707755864a0492Ying Wang    };
55951a39d68df598db08dfced8b4707755864a0492Ying Wang  };
56951a39d68df598db08dfced8b4707755864a0492Ying Wang
57951a39d68df598db08dfced8b4707755864a0492Ying Wang  /**
58951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  @brief  Common base for codecvt functions.
59951a39d68df598db08dfced8b4707755864a0492Ying Wang   *
60951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  This template class provides implementations of the public functions
61951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  that forward to the protected virtual functions.
62951a39d68df598db08dfced8b4707755864a0492Ying Wang   *
63951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  This template also provides abstract stubs for the protected virtual
64951a39d68df598db08dfced8b4707755864a0492Ying Wang   *  functions.
65951a39d68df598db08dfced8b4707755864a0492Ying Wang  */
66951a39d68df598db08dfced8b4707755864a0492Ying Wang  template<typename _InternT, typename _ExternT, typename _StateT>
67951a39d68df598db08dfced8b4707755864a0492Ying Wang    class __codecvt_abstract_base
68951a39d68df598db08dfced8b4707755864a0492Ying Wang    : public locale::facet, public codecvt_base
69951a39d68df598db08dfced8b4707755864a0492Ying Wang    {
70951a39d68df598db08dfced8b4707755864a0492Ying Wang    public:
71951a39d68df598db08dfced8b4707755864a0492Ying Wang      // Types:
72951a39d68df598db08dfced8b4707755864a0492Ying Wang      typedef codecvt_base::result	result;
73951a39d68df598db08dfced8b4707755864a0492Ying Wang      typedef _InternT			intern_type;
74951a39d68df598db08dfced8b4707755864a0492Ying Wang      typedef _ExternT			extern_type;
75951a39d68df598db08dfced8b4707755864a0492Ying Wang      typedef _StateT			state_type;
76951a39d68df598db08dfced8b4707755864a0492Ying Wang
77951a39d68df598db08dfced8b4707755864a0492Ying Wang      // 22.2.1.5.1 codecvt members
78951a39d68df598db08dfced8b4707755864a0492Ying Wang      /**
79951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @brief  Convert from internal to external character set.
80951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
81951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  Converts input string of intern_type to output string of
82951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  extern_type.  This is analogous to wcsrtombs.  It does this by
83951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  calling codecvt::do_out.
84951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
85951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  The source and destination character sets are determined by the
86951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  facet's locale, internal and external types.
87951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
88951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  The characters in [from,from_end) are converted and written to
89951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  [to,to_end).  from_next and to_next are set to point to the
90951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  character following the last successfully converted character,
91951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  respectively.  If the result needed no conversion, from_next and
92951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  to_next are not affected.
93951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
94951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  The @a state argument should be initialized if the input is at the
95951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  beginning and carried from a previous call if continuing
96951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  conversion.  There are no guarantees about how @a state is used.
97951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
98951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  The result returned is a member of codecvt_base::result.  If
99951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  all the input is converted, returns codecvt_base::ok.  If no
100951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  conversion is necessary, returns codecvt_base::noconv.  If
101951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  the input ends early or there is insufficient space in the
102951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  output, returns codecvt_base::partial.  Otherwise the
103951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  conversion failed and codecvt_base::error is returned.
104951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
105951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  state  Persistent conversion state data.
106951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  from  Start of input.
107951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  from_end  End of input.
108951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  from_next  Returns start of unconverted data.
109951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  to  Start of output buffer.
110951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  to_end  End of output buffer.
111951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  to_next  Returns start of unused output area.
112951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @return  codecvt_base::result.
113951a39d68df598db08dfced8b4707755864a0492Ying Wang      */
114951a39d68df598db08dfced8b4707755864a0492Ying Wang      result
115951a39d68df598db08dfced8b4707755864a0492Ying Wang      out(state_type& __state, const intern_type* __from,
116951a39d68df598db08dfced8b4707755864a0492Ying Wang	  const intern_type* __from_end, const intern_type*& __from_next,
117951a39d68df598db08dfced8b4707755864a0492Ying Wang	  extern_type* __to, extern_type* __to_end,
118951a39d68df598db08dfced8b4707755864a0492Ying Wang	  extern_type*& __to_next) const
119951a39d68df598db08dfced8b4707755864a0492Ying Wang      {
120951a39d68df598db08dfced8b4707755864a0492Ying Wang	return this->do_out(__state, __from, __from_end, __from_next,
121951a39d68df598db08dfced8b4707755864a0492Ying Wang			    __to, __to_end, __to_next);
122951a39d68df598db08dfced8b4707755864a0492Ying Wang      }
123951a39d68df598db08dfced8b4707755864a0492Ying Wang
124951a39d68df598db08dfced8b4707755864a0492Ying Wang      /**
125951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @brief  Reset conversion state.
126951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
127951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  Writes characters to output that would restore @a state to initial
128951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  conditions.  The idea is that if a partial conversion occurs, then
129951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  the converting the characters written by this function would leave
130951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  the state in initial conditions, rather than partial conversion
131951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  state.  It does this by calling codecvt::do_unshift().
132951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
133951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  For example, if 4 external characters always converted to 1 internal
134951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  character, and input to in() had 6 external characters with state
135951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  saved, this function would write two characters to the output and
136951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  set the state to initialized conditions.
137951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
138951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  The source and destination character sets are determined by the
139951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  facet's locale, internal and external types.
140951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
141951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  The result returned is a member of codecvt_base::result.  If the
142951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  state could be reset and data written, returns codecvt_base::ok.  If
143951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  no conversion is necessary, returns codecvt_base::noconv.  If the
144951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  output has insufficient space, returns codecvt_base::partial.
145951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  Otherwise the reset failed and codecvt_base::error is returned.
146951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
147951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  state  Persistent conversion state data.
148951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  to  Start of output buffer.
149951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  to_end  End of output buffer.
150951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  to_next  Returns start of unused output area.
151951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @return  codecvt_base::result.
152951a39d68df598db08dfced8b4707755864a0492Ying Wang      */
153951a39d68df598db08dfced8b4707755864a0492Ying Wang      result
154951a39d68df598db08dfced8b4707755864a0492Ying Wang      unshift(state_type& __state, extern_type* __to, extern_type* __to_end,
155951a39d68df598db08dfced8b4707755864a0492Ying Wang	      extern_type*& __to_next) const
156951a39d68df598db08dfced8b4707755864a0492Ying Wang      { return this->do_unshift(__state, __to,__to_end,__to_next); }
157951a39d68df598db08dfced8b4707755864a0492Ying Wang
158951a39d68df598db08dfced8b4707755864a0492Ying Wang      /**
159951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @brief  Convert from external to internal character set.
160951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
161951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  Converts input string of extern_type to output string of
162951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  intern_type.  This is analogous to mbsrtowcs.  It does this by
163951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  calling codecvt::do_in.
164951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
165951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  The source and destination character sets are determined by the
166951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  facet's locale, internal and external types.
167951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
168951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  The characters in [from,from_end) are converted and written to
169951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  [to,to_end).  from_next and to_next are set to point to the
170951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  character following the last successfully converted character,
171951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  respectively.  If the result needed no conversion, from_next and
172951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  to_next are not affected.
173951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
174951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  The @a state argument should be initialized if the input is at the
175951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  beginning and carried from a previous call if continuing
176951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  conversion.  There are no guarantees about how @a state is used.
177951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
178951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  The result returned is a member of codecvt_base::result.  If
179951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  all the input is converted, returns codecvt_base::ok.  If no
180951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  conversion is necessary, returns codecvt_base::noconv.  If
181951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  the input ends early or there is insufficient space in the
182951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  output, returns codecvt_base::partial.  Otherwise the
183951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  conversion failed and codecvt_base::error is returned.
184951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
185951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  state  Persistent conversion state data.
186951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  from  Start of input.
187951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  from_end  End of input.
188951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  from_next  Returns start of unconverted data.
189951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  to  Start of output buffer.
190951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  to_end  End of output buffer.
191951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @param  to_next  Returns start of unused output area.
192951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @return  codecvt_base::result.
193951a39d68df598db08dfced8b4707755864a0492Ying Wang      */
194951a39d68df598db08dfced8b4707755864a0492Ying Wang      result
195951a39d68df598db08dfced8b4707755864a0492Ying Wang      in(state_type& __state, const extern_type* __from,
196951a39d68df598db08dfced8b4707755864a0492Ying Wang	 const extern_type* __from_end, const extern_type*& __from_next,
197951a39d68df598db08dfced8b4707755864a0492Ying Wang	 intern_type* __to, intern_type* __to_end,
198951a39d68df598db08dfced8b4707755864a0492Ying Wang	 intern_type*& __to_next) const
199951a39d68df598db08dfced8b4707755864a0492Ying Wang      {
200951a39d68df598db08dfced8b4707755864a0492Ying Wang	return this->do_in(__state, __from, __from_end, __from_next,
201951a39d68df598db08dfced8b4707755864a0492Ying Wang			   __to, __to_end, __to_next);
202951a39d68df598db08dfced8b4707755864a0492Ying Wang      }
203951a39d68df598db08dfced8b4707755864a0492Ying Wang
204951a39d68df598db08dfced8b4707755864a0492Ying Wang      int
205951a39d68df598db08dfced8b4707755864a0492Ying Wang      encoding() const throw()
206951a39d68df598db08dfced8b4707755864a0492Ying Wang      { return this->do_encoding(); }
207951a39d68df598db08dfced8b4707755864a0492Ying Wang
208951a39d68df598db08dfced8b4707755864a0492Ying Wang      bool
209951a39d68df598db08dfced8b4707755864a0492Ying Wang      always_noconv() const throw()
210951a39d68df598db08dfced8b4707755864a0492Ying Wang      { return this->do_always_noconv(); }
211951a39d68df598db08dfced8b4707755864a0492Ying Wang
212951a39d68df598db08dfced8b4707755864a0492Ying Wang      int
213951a39d68df598db08dfced8b4707755864a0492Ying Wang      length(state_type& __state, const extern_type* __from,
214951a39d68df598db08dfced8b4707755864a0492Ying Wang	     const extern_type* __end, size_t __max) const
215951a39d68df598db08dfced8b4707755864a0492Ying Wang      { return this->do_length(__state, __from, __end, __max); }
216951a39d68df598db08dfced8b4707755864a0492Ying Wang
217951a39d68df598db08dfced8b4707755864a0492Ying Wang      int
218951a39d68df598db08dfced8b4707755864a0492Ying Wang      max_length() const throw()
219951a39d68df598db08dfced8b4707755864a0492Ying Wang      { return this->do_max_length(); }
220951a39d68df598db08dfced8b4707755864a0492Ying Wang
221951a39d68df598db08dfced8b4707755864a0492Ying Wang    protected:
222951a39d68df598db08dfced8b4707755864a0492Ying Wang      explicit
223951a39d68df598db08dfced8b4707755864a0492Ying Wang      __codecvt_abstract_base(size_t __refs = 0) : locale::facet(__refs) { }
224951a39d68df598db08dfced8b4707755864a0492Ying Wang
225951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual
226951a39d68df598db08dfced8b4707755864a0492Ying Wang      ~__codecvt_abstract_base() { }
227951a39d68df598db08dfced8b4707755864a0492Ying Wang
228951a39d68df598db08dfced8b4707755864a0492Ying Wang      /**
229951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  @brief  Convert from internal to external character set.
230951a39d68df598db08dfced8b4707755864a0492Ying Wang       *
231951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  Converts input string of intern_type to output string of
232951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  extern_type.  This function is a hook for derived classes to change
233951a39d68df598db08dfced8b4707755864a0492Ying Wang       *  the value returned.  @see out for more information.
234951a39d68df598db08dfced8b4707755864a0492Ying Wang      */
235951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual result
236951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_out(state_type& __state, const intern_type* __from,
237951a39d68df598db08dfced8b4707755864a0492Ying Wang	     const intern_type* __from_end, const intern_type*& __from_next,
238951a39d68df598db08dfced8b4707755864a0492Ying Wang	     extern_type* __to, extern_type* __to_end,
239951a39d68df598db08dfced8b4707755864a0492Ying Wang	     extern_type*& __to_next) const = 0;
240951a39d68df598db08dfced8b4707755864a0492Ying Wang
241951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual result
242951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_unshift(state_type& __state, extern_type* __to,
243951a39d68df598db08dfced8b4707755864a0492Ying Wang		 extern_type* __to_end, extern_type*& __to_next) const = 0;
244951a39d68df598db08dfced8b4707755864a0492Ying Wang
245951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual result
246951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_in(state_type& __state, const extern_type* __from,
247951a39d68df598db08dfced8b4707755864a0492Ying Wang	    const extern_type* __from_end, const extern_type*& __from_next,
248951a39d68df598db08dfced8b4707755864a0492Ying Wang	    intern_type* __to, intern_type* __to_end,
249951a39d68df598db08dfced8b4707755864a0492Ying Wang	    intern_type*& __to_next) const = 0;
250951a39d68df598db08dfced8b4707755864a0492Ying Wang
251951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual int
252951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_encoding() const throw() = 0;
253951a39d68df598db08dfced8b4707755864a0492Ying Wang
254951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual bool
255951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_always_noconv() const throw() = 0;
256951a39d68df598db08dfced8b4707755864a0492Ying Wang
257951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual int
258951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_length(state_type&, const extern_type* __from,
259951a39d68df598db08dfced8b4707755864a0492Ying Wang		const extern_type* __end, size_t __max) const = 0;
260951a39d68df598db08dfced8b4707755864a0492Ying Wang
261951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual int
262951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_max_length() const throw() = 0;
263951a39d68df598db08dfced8b4707755864a0492Ying Wang    };
264951a39d68df598db08dfced8b4707755864a0492Ying Wang
265951a39d68df598db08dfced8b4707755864a0492Ying Wang  /// @brief class codecvt [22.2.1.5].
266951a39d68df598db08dfced8b4707755864a0492Ying Wang  /// NB: Generic, mostly useless implementation.
267951a39d68df598db08dfced8b4707755864a0492Ying Wang  template<typename _InternT, typename _ExternT, typename _StateT>
268951a39d68df598db08dfced8b4707755864a0492Ying Wang    class codecvt
269951a39d68df598db08dfced8b4707755864a0492Ying Wang    : public __codecvt_abstract_base<_InternT, _ExternT, _StateT>
270951a39d68df598db08dfced8b4707755864a0492Ying Wang    {
271951a39d68df598db08dfced8b4707755864a0492Ying Wang    public:
272951a39d68df598db08dfced8b4707755864a0492Ying Wang      // Types:
273951a39d68df598db08dfced8b4707755864a0492Ying Wang      typedef codecvt_base::result	result;
274951a39d68df598db08dfced8b4707755864a0492Ying Wang      typedef _InternT			intern_type;
275951a39d68df598db08dfced8b4707755864a0492Ying Wang      typedef _ExternT			extern_type;
276951a39d68df598db08dfced8b4707755864a0492Ying Wang      typedef _StateT			state_type;
277951a39d68df598db08dfced8b4707755864a0492Ying Wang
278951a39d68df598db08dfced8b4707755864a0492Ying Wang    protected:
279951a39d68df598db08dfced8b4707755864a0492Ying Wang      __c_locale			_M_c_locale_codecvt;
280951a39d68df598db08dfced8b4707755864a0492Ying Wang
281951a39d68df598db08dfced8b4707755864a0492Ying Wang    public:
282951a39d68df598db08dfced8b4707755864a0492Ying Wang      static locale::id			id;
283951a39d68df598db08dfced8b4707755864a0492Ying Wang
284951a39d68df598db08dfced8b4707755864a0492Ying Wang      explicit
285951a39d68df598db08dfced8b4707755864a0492Ying Wang      codecvt(size_t __refs = 0)
286951a39d68df598db08dfced8b4707755864a0492Ying Wang      : __codecvt_abstract_base<_InternT, _ExternT, _StateT> (__refs) { }
287951a39d68df598db08dfced8b4707755864a0492Ying Wang
288951a39d68df598db08dfced8b4707755864a0492Ying Wang      explicit
289951a39d68df598db08dfced8b4707755864a0492Ying Wang      codecvt(__c_locale __cloc, size_t __refs = 0);
290951a39d68df598db08dfced8b4707755864a0492Ying Wang
291951a39d68df598db08dfced8b4707755864a0492Ying Wang    protected:
292951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual
293951a39d68df598db08dfced8b4707755864a0492Ying Wang      ~codecvt() { }
294951a39d68df598db08dfced8b4707755864a0492Ying Wang
295951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual result
296951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_out(state_type& __state, const intern_type* __from,
297951a39d68df598db08dfced8b4707755864a0492Ying Wang	     const intern_type* __from_end, const intern_type*& __from_next,
298951a39d68df598db08dfced8b4707755864a0492Ying Wang	     extern_type* __to, extern_type* __to_end,
299951a39d68df598db08dfced8b4707755864a0492Ying Wang	     extern_type*& __to_next) const;
300951a39d68df598db08dfced8b4707755864a0492Ying Wang
301951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual result
302951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_unshift(state_type& __state, extern_type* __to,
303951a39d68df598db08dfced8b4707755864a0492Ying Wang		 extern_type* __to_end, extern_type*& __to_next) const;
304951a39d68df598db08dfced8b4707755864a0492Ying Wang
305951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual result
306951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_in(state_type& __state, const extern_type* __from,
307951a39d68df598db08dfced8b4707755864a0492Ying Wang	    const extern_type* __from_end, const extern_type*& __from_next,
308951a39d68df598db08dfced8b4707755864a0492Ying Wang	    intern_type* __to, intern_type* __to_end,
309951a39d68df598db08dfced8b4707755864a0492Ying Wang	    intern_type*& __to_next) const;
310951a39d68df598db08dfced8b4707755864a0492Ying Wang
311951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual int
312951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_encoding() const throw();
313951a39d68df598db08dfced8b4707755864a0492Ying Wang
314951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual bool
315951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_always_noconv() const throw();
316951a39d68df598db08dfced8b4707755864a0492Ying Wang
317951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual int
318951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_length(state_type&, const extern_type* __from,
319951a39d68df598db08dfced8b4707755864a0492Ying Wang		const extern_type* __end, size_t __max) const;
320951a39d68df598db08dfced8b4707755864a0492Ying Wang
321951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual int
322951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_max_length() const throw();
323951a39d68df598db08dfced8b4707755864a0492Ying Wang    };
324951a39d68df598db08dfced8b4707755864a0492Ying Wang
325951a39d68df598db08dfced8b4707755864a0492Ying Wang  template<typename _InternT, typename _ExternT, typename _StateT>
326951a39d68df598db08dfced8b4707755864a0492Ying Wang    locale::id codecvt<_InternT, _ExternT, _StateT>::id;
327951a39d68df598db08dfced8b4707755864a0492Ying Wang
328951a39d68df598db08dfced8b4707755864a0492Ying Wang  /// class codecvt<char, char, mbstate_t> specialization.
329951a39d68df598db08dfced8b4707755864a0492Ying Wang  template<>
330951a39d68df598db08dfced8b4707755864a0492Ying Wang    class codecvt<char, char, mbstate_t>
331951a39d68df598db08dfced8b4707755864a0492Ying Wang    : public __codecvt_abstract_base<char, char, mbstate_t>
332951a39d68df598db08dfced8b4707755864a0492Ying Wang    {
333951a39d68df598db08dfced8b4707755864a0492Ying Wang    public:
334951a39d68df598db08dfced8b4707755864a0492Ying Wang      // Types:
335951a39d68df598db08dfced8b4707755864a0492Ying Wang      typedef char			intern_type;
336951a39d68df598db08dfced8b4707755864a0492Ying Wang      typedef char			extern_type;
337951a39d68df598db08dfced8b4707755864a0492Ying Wang      typedef mbstate_t			state_type;
338951a39d68df598db08dfced8b4707755864a0492Ying Wang
339951a39d68df598db08dfced8b4707755864a0492Ying Wang    protected:
340951a39d68df598db08dfced8b4707755864a0492Ying Wang      __c_locale			_M_c_locale_codecvt;
341951a39d68df598db08dfced8b4707755864a0492Ying Wang
342951a39d68df598db08dfced8b4707755864a0492Ying Wang    public:
343951a39d68df598db08dfced8b4707755864a0492Ying Wang      static locale::id id;
344951a39d68df598db08dfced8b4707755864a0492Ying Wang
345951a39d68df598db08dfced8b4707755864a0492Ying Wang      explicit
346951a39d68df598db08dfced8b4707755864a0492Ying Wang      codecvt(size_t __refs = 0);
347951a39d68df598db08dfced8b4707755864a0492Ying Wang
348951a39d68df598db08dfced8b4707755864a0492Ying Wang      explicit
349951a39d68df598db08dfced8b4707755864a0492Ying Wang      codecvt(__c_locale __cloc, size_t __refs = 0);
350951a39d68df598db08dfced8b4707755864a0492Ying Wang
351951a39d68df598db08dfced8b4707755864a0492Ying Wang    protected:
352951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual
353951a39d68df598db08dfced8b4707755864a0492Ying Wang      ~codecvt();
354951a39d68df598db08dfced8b4707755864a0492Ying Wang
355951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual result
356951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_out(state_type& __state, const intern_type* __from,
357951a39d68df598db08dfced8b4707755864a0492Ying Wang	     const intern_type* __from_end, const intern_type*& __from_next,
358951a39d68df598db08dfced8b4707755864a0492Ying Wang	     extern_type* __to, extern_type* __to_end,
359951a39d68df598db08dfced8b4707755864a0492Ying Wang	     extern_type*& __to_next) const;
360951a39d68df598db08dfced8b4707755864a0492Ying Wang
361951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual result
362951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_unshift(state_type& __state, extern_type* __to,
363951a39d68df598db08dfced8b4707755864a0492Ying Wang		 extern_type* __to_end, extern_type*& __to_next) const;
364951a39d68df598db08dfced8b4707755864a0492Ying Wang
365951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual result
366951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_in(state_type& __state, const extern_type* __from,
367951a39d68df598db08dfced8b4707755864a0492Ying Wang	    const extern_type* __from_end, const extern_type*& __from_next,
368951a39d68df598db08dfced8b4707755864a0492Ying Wang	    intern_type* __to, intern_type* __to_end,
369951a39d68df598db08dfced8b4707755864a0492Ying Wang	    intern_type*& __to_next) const;
370951a39d68df598db08dfced8b4707755864a0492Ying Wang
371951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual int
372951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_encoding() const throw();
373951a39d68df598db08dfced8b4707755864a0492Ying Wang
374951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual bool
375951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_always_noconv() const throw();
376951a39d68df598db08dfced8b4707755864a0492Ying Wang
377951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual int
378951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_length(state_type&, const extern_type* __from,
379951a39d68df598db08dfced8b4707755864a0492Ying Wang		const extern_type* __end, size_t __max) const;
380951a39d68df598db08dfced8b4707755864a0492Ying Wang
381951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual int
382951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_max_length() const throw();
383951a39d68df598db08dfced8b4707755864a0492Ying Wang  };
384951a39d68df598db08dfced8b4707755864a0492Ying Wang
385951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifdef _GLIBCXX_USE_WCHAR_T
386951a39d68df598db08dfced8b4707755864a0492Ying Wang  /// class codecvt<wchar_t, char, mbstate_t> specialization.
387951a39d68df598db08dfced8b4707755864a0492Ying Wang  template<>
388951a39d68df598db08dfced8b4707755864a0492Ying Wang    class codecvt<wchar_t, char, mbstate_t>
389951a39d68df598db08dfced8b4707755864a0492Ying Wang    : public __codecvt_abstract_base<wchar_t, char, mbstate_t>
390951a39d68df598db08dfced8b4707755864a0492Ying Wang    {
391951a39d68df598db08dfced8b4707755864a0492Ying Wang    public:
392951a39d68df598db08dfced8b4707755864a0492Ying Wang      // Types:
393951a39d68df598db08dfced8b4707755864a0492Ying Wang      typedef wchar_t			intern_type;
394951a39d68df598db08dfced8b4707755864a0492Ying Wang      typedef char			extern_type;
395951a39d68df598db08dfced8b4707755864a0492Ying Wang      typedef mbstate_t			state_type;
396951a39d68df598db08dfced8b4707755864a0492Ying Wang
397951a39d68df598db08dfced8b4707755864a0492Ying Wang    protected:
398951a39d68df598db08dfced8b4707755864a0492Ying Wang      __c_locale			_M_c_locale_codecvt;
399951a39d68df598db08dfced8b4707755864a0492Ying Wang
400951a39d68df598db08dfced8b4707755864a0492Ying Wang    public:
401951a39d68df598db08dfced8b4707755864a0492Ying Wang      static locale::id			id;
402951a39d68df598db08dfced8b4707755864a0492Ying Wang
403951a39d68df598db08dfced8b4707755864a0492Ying Wang      explicit
404951a39d68df598db08dfced8b4707755864a0492Ying Wang      codecvt(size_t __refs = 0);
405951a39d68df598db08dfced8b4707755864a0492Ying Wang
406951a39d68df598db08dfced8b4707755864a0492Ying Wang      explicit
407951a39d68df598db08dfced8b4707755864a0492Ying Wang      codecvt(__c_locale __cloc, size_t __refs = 0);
408951a39d68df598db08dfced8b4707755864a0492Ying Wang
409951a39d68df598db08dfced8b4707755864a0492Ying Wang    protected:
410951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual
411951a39d68df598db08dfced8b4707755864a0492Ying Wang      ~codecvt();
412951a39d68df598db08dfced8b4707755864a0492Ying Wang
413951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual result
414951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_out(state_type& __state, const intern_type* __from,
415951a39d68df598db08dfced8b4707755864a0492Ying Wang	     const intern_type* __from_end, const intern_type*& __from_next,
416951a39d68df598db08dfced8b4707755864a0492Ying Wang	     extern_type* __to, extern_type* __to_end,
417951a39d68df598db08dfced8b4707755864a0492Ying Wang	     extern_type*& __to_next) const;
418951a39d68df598db08dfced8b4707755864a0492Ying Wang
419951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual result
420951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_unshift(state_type& __state,
421951a39d68df598db08dfced8b4707755864a0492Ying Wang		 extern_type* __to, extern_type* __to_end,
422951a39d68df598db08dfced8b4707755864a0492Ying Wang		 extern_type*& __to_next) const;
423951a39d68df598db08dfced8b4707755864a0492Ying Wang
424951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual result
425951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_in(state_type& __state,
426951a39d68df598db08dfced8b4707755864a0492Ying Wang	     const extern_type* __from, const extern_type* __from_end,
427951a39d68df598db08dfced8b4707755864a0492Ying Wang	     const extern_type*& __from_next,
428951a39d68df598db08dfced8b4707755864a0492Ying Wang	     intern_type* __to, intern_type* __to_end,
429951a39d68df598db08dfced8b4707755864a0492Ying Wang	     intern_type*& __to_next) const;
430951a39d68df598db08dfced8b4707755864a0492Ying Wang
431951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual
432951a39d68df598db08dfced8b4707755864a0492Ying Wang      int do_encoding() const throw();
433951a39d68df598db08dfced8b4707755864a0492Ying Wang
434951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual
435951a39d68df598db08dfced8b4707755864a0492Ying Wang      bool do_always_noconv() const throw();
436951a39d68df598db08dfced8b4707755864a0492Ying Wang
437951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual
438951a39d68df598db08dfced8b4707755864a0492Ying Wang      int do_length(state_type&, const extern_type* __from,
439951a39d68df598db08dfced8b4707755864a0492Ying Wang		    const extern_type* __end, size_t __max) const;
440951a39d68df598db08dfced8b4707755864a0492Ying Wang
441951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual int
442951a39d68df598db08dfced8b4707755864a0492Ying Wang      do_max_length() const throw();
443951a39d68df598db08dfced8b4707755864a0492Ying Wang    };
444951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif //_GLIBCXX_USE_WCHAR_T
445951a39d68df598db08dfced8b4707755864a0492Ying Wang
446951a39d68df598db08dfced8b4707755864a0492Ying Wang  /// class codecvt_byname [22.2.1.6].
447951a39d68df598db08dfced8b4707755864a0492Ying Wang  template<typename _InternT, typename _ExternT, typename _StateT>
448951a39d68df598db08dfced8b4707755864a0492Ying Wang    class codecvt_byname : public codecvt<_InternT, _ExternT, _StateT>
449951a39d68df598db08dfced8b4707755864a0492Ying Wang    {
450951a39d68df598db08dfced8b4707755864a0492Ying Wang    public:
451951a39d68df598db08dfced8b4707755864a0492Ying Wang      explicit
452951a39d68df598db08dfced8b4707755864a0492Ying Wang      codecvt_byname(const char* __s, size_t __refs = 0)
453951a39d68df598db08dfced8b4707755864a0492Ying Wang      : codecvt<_InternT, _ExternT, _StateT>(__refs)
454951a39d68df598db08dfced8b4707755864a0492Ying Wang      {
455951a39d68df598db08dfced8b4707755864a0492Ying Wang	if (__builtin_strcmp(__s, "C") != 0
456951a39d68df598db08dfced8b4707755864a0492Ying Wang	    && __builtin_strcmp(__s, "POSIX") != 0)
457951a39d68df598db08dfced8b4707755864a0492Ying Wang	  {
458951a39d68df598db08dfced8b4707755864a0492Ying Wang	    this->_S_destroy_c_locale(this->_M_c_locale_codecvt);
459951a39d68df598db08dfced8b4707755864a0492Ying Wang	    this->_S_create_c_locale(this->_M_c_locale_codecvt, __s);
460951a39d68df598db08dfced8b4707755864a0492Ying Wang	  }
461951a39d68df598db08dfced8b4707755864a0492Ying Wang      }
462951a39d68df598db08dfced8b4707755864a0492Ying Wang
463951a39d68df598db08dfced8b4707755864a0492Ying Wang    protected:
464951a39d68df598db08dfced8b4707755864a0492Ying Wang      virtual
465951a39d68df598db08dfced8b4707755864a0492Ying Wang      ~codecvt_byname() { }
466951a39d68df598db08dfced8b4707755864a0492Ying Wang    };
467951a39d68df598db08dfced8b4707755864a0492Ying Wang
468951a39d68df598db08dfced8b4707755864a0492Ying Wang  // Inhibit implicit instantiations for required instantiations,
469951a39d68df598db08dfced8b4707755864a0492Ying Wang  // which are defined via explicit instantiations elsewhere.
470951a39d68df598db08dfced8b4707755864a0492Ying Wang  // NB: This syntax is a GNU extension.
471951a39d68df598db08dfced8b4707755864a0492Ying Wang#if _GLIBCXX_EXTERN_TEMPLATE
472951a39d68df598db08dfced8b4707755864a0492Ying Wang  extern template class codecvt_byname<char, char, mbstate_t>;
473951a39d68df598db08dfced8b4707755864a0492Ying Wang
474951a39d68df598db08dfced8b4707755864a0492Ying Wang  extern template
475951a39d68df598db08dfced8b4707755864a0492Ying Wang    const codecvt<char, char, mbstate_t>&
476951a39d68df598db08dfced8b4707755864a0492Ying Wang    use_facet<codecvt<char, char, mbstate_t> >(const locale&);
477951a39d68df598db08dfced8b4707755864a0492Ying Wang
478951a39d68df598db08dfced8b4707755864a0492Ying Wang  extern template
479951a39d68df598db08dfced8b4707755864a0492Ying Wang    bool
480951a39d68df598db08dfced8b4707755864a0492Ying Wang    has_facet<codecvt<char, char, mbstate_t> >(const locale&);
481951a39d68df598db08dfced8b4707755864a0492Ying Wang
482951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifdef _GLIBCXX_USE_WCHAR_T
483951a39d68df598db08dfced8b4707755864a0492Ying Wang  extern template class codecvt_byname<wchar_t, char, mbstate_t>;
484951a39d68df598db08dfced8b4707755864a0492Ying Wang
485951a39d68df598db08dfced8b4707755864a0492Ying Wang  extern template
486951a39d68df598db08dfced8b4707755864a0492Ying Wang    const codecvt<wchar_t, char, mbstate_t>&
487951a39d68df598db08dfced8b4707755864a0492Ying Wang    use_facet<codecvt<wchar_t, char, mbstate_t> >(const locale&);
488951a39d68df598db08dfced8b4707755864a0492Ying Wang
489951a39d68df598db08dfced8b4707755864a0492Ying Wang  extern template
490951a39d68df598db08dfced8b4707755864a0492Ying Wang    bool
491951a39d68df598db08dfced8b4707755864a0492Ying Wang    has_facet<codecvt<wchar_t, char, mbstate_t> >(const locale&);
492951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
493951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
494951a39d68df598db08dfced8b4707755864a0492Ying Wang
495951a39d68df598db08dfced8b4707755864a0492Ying Wang_GLIBCXX_END_NAMESPACE
496951a39d68df598db08dfced8b4707755864a0492Ying Wang
497951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif // _CODECVT_H
498