Listing 2: Template class codecvt
// TEMPLATE CLASS codecvt
template<class _E, class _To, class _St>
class codecvt : public codecvt_base {
public:
typedef _E intern_type;
typedef _To extern_type;
typedef _St state_type;
result in(_St& _State,
const _To *_F1, const _To *_L1, const _To *& _Mid1,
_E *_F2, _E *_L2, _E *& _Mid2) const
{return (do_in(_State,
_F1, _L1, _Mid1, _F2, _L2, _Mid2)); }
result out(_St& _State,
const _E *_F1, const _E *_L1, const _E *& _Mid1,
_To *_F2, _To *_L2, _To *& _Mid2) const
{return (do_out(_State,
_F1, _L1, _Mid1, _F2, _L2, _Mid2)); }
result unshift(_St& _State,
_To *_F2, _To *_L2, _To *& _Mid2) const
{return (do_unshift(_State,
_F2, _L2, _Mid2)); }
int length(_St& _State, const _E *_F1,
const _E *_L1, size_t _N2) const throw ()
{return (do_length(_State, _F1, _L1, _N2)); }
static locale::id id;
explicit codecvt(size_t _R = 0)
: codecvt_base(_R) {_Init(_Locinfo()); }
codecvt(const _Locinfo& _Lobj, size_t _R = 0)
: codecvt_base(_R) {_Init(_Lobj); }
static size_t _CDECL _Getcat()
{return (_X_CTYPE); }
protected:
virtual ~codecvt()
{};
void _Init(const _Locinfo& _Lobj)
{_Cvt = _Lobj._Getcvt(); }
virtual result do_in(_St& _State,
const _To *_F1, const _To *, const _To *& _Mid1,
_E *_F2, _E *, _E *& _Mid2) const
{_Mid1 = _F1, _Mid2 = _F2;
return (noconv); }
virtual result do_out(_St& _State,
const _E *_F1, const _E *, const _E *& _Mid1,
_To *_F2, _To *, _To *& _Mid2) const
{_Mid1 = _F1, _Mid2 = _F2;
return (noconv); }
virtual result do_unshift(_St& _State,
_To *_F2, _To *_L2, _To *& _Mid2) const
{return (noconv); }
virtual int do_length(_St& _State, const _E *_F1,
const _E *_L1, size_t _N2) const throw ()
{return (_N2 < _L1 - _F1 ? _N2 : _L1 - _F1); }
private:
_Locinfo::_Cvtvec _Cvt;
};
template<class _E, class _To, class _St>
locale::id codecvt<_E, _To, _St>::id;
//End of File