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