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