Listing 2: Template class numput

        // TEMPLATE CLASS num_put
template<class _E,
    class _OI = ostreambuf_iterator<_E, char_traits<_E> > >
    class num_put : public locale::facet {
public:
    typedef numpunct<_E> _Mypunct;
    typedef basic_string<_E, char_traits<_E>, allocator<_E> >
        _Mystr;
    static locale::id id;
protected:
    virtual ~num_put()
        {}
public:
    explicit num_put(size_t _R = 0);
    typedef _E char_type;
    typedef _OI iter_type;
    _OI put(_OI _F, ios_base& _X, _E _Fill,
        bool _V) const
        {return (do_put(_F, _X, _Fill, _V)); }
    _OI put(_OI _F, ios_base& _X, _E _Fill,
        long _V) const
        {return (do_put(_F, _X, _Fill, _V)); }
    _OI put(_OI _F, ios_base& _X, _E _Fill,
        unsigned long _V) const
        {return (do_put(_F, _X, _Fill, _V)); }
    _OI put(_OI _F, ios_base& _X, _E _Fill,
        double _V) const
        {return (do_put(_F, _X, _Fill, _V)); }
    _OI put(_OI _F, ios_base& _X, _E _Fill,
        long double _V) const
        {return (do_put(_F, _X, _Fill, _V)); }
    _OI put(_OI _F, ios_base& _X, _E _Fill,
        const void *_V) const
        {return (do_put(_F, _X, _Fill, _V)); }
protected:
    virtual _OI do_put(_OI _F, ios_base& _X, _E _Fill,
        bool _V) const
        {const _Mypunct& _Fac = _USE(_X.getloc(), _Mypunct);
        _Mystr _Str;
        if (!(_X.flags() & ios_base::boolalpha))
            _Str.append((typename _Mystr::size_type)1,
                _WIDEN(_E, _V ? '1' : '0'));
        else if (_V)
            _Str = _Fac.truename();
        else
            _Str = _Fac.falsename();
        size_t _M = _X.width() <= 0 || _X.width() <= _Str.size()
            ? 0 : _X.width() - _Str.size();
        ios_base::fmtflags _Afl =
            _X.flags() & ios_base::adjustfield;
        if (_Afl != ios_base::left)
            _F = _Rep(_F, _Fill, _M), _M = 0;
        _F = _Put(_F, _Str.c_str(), _Str.size());
        _X.width(0);
        return (_Rep(_F, _Fill, _M)); }
    virtual _OI do_put(_OI _F, ios_base& _X, _E _Fill,
        long _V) const
        {char _Buf[2 * _MAX_INT_DIG], _Fmt[6];
        return (_Iput(_F, _X, _Fill, _Buf,
            sprintf(_Buf, _Ifmt(_Fmt, 'd', _X.flags()), _V))); }
    virtual _OI do_put(_OI _F, ios_base& _X, _E _Fill,
        unsigned long _V) const
        {char _Buf[2 * _MAX_INT_DIG], _Fmt[6];
        return (_Iput(_F, _X, _Fill, _Buf,
            sprintf(_Buf, _Ifmt(_Fmt, 'u', _X.flags()), _V))); }
    virtual _OI do_put(_OI _F, ios_base& _X, _E _Fill,
        double _V) const
        {char _Buf[_MAX_EXP_DIG + _MAX_SIG_DIG + 16], _Fmt[8];
        streamsize _Prec = _X.precision() <= 0
            && !(_X.flags() & ios_base::fixed) ? 6
            : _X.precision();
        int _Mpr = _MAX_SIG_DIG < _Prec ? _MAX_SIG_DIG : _Prec;
        return (_Fput(_F, _X, _Fill, _Buf, _Prec - _Mpr,
            sprintf(_Buf, _Ffmt(_Fmt, 0, _X.flags()),
                _Mpr, _V))); }
    virtual _OI do_put(_OI _F, ios_base& _X, _E _Fill,
        long double _V) const
        {char _Buf[_MAX_EXP_DIG + _MAX_SIG_DIG + 16], _Fmt[8];
        streamsize _Prec = _X.precision() <= 0
            && !(_X.flags() & ios_base::fixed) ? 6
            : _X.precision();
        int _Mpr = _MAX_SIG_DIG < _Prec ? _MAX_SIG_DIG : _Prec;
        return (_Fput(_F, _X, _Fill, _Buf, _Prec - _Mpr,
            sprintf(_Buf, _Ffmt(_Fmt, 'L', _X.flags()),
                _Mpr, _V))); }
    virtual _OI do_put(_OI _F, ios_base& _X, _E _Fill,
        const void *_V) const
        {
        const int _NL = 1
            + (sizeof (void *) - 1) / sizeof (unsigned long);
        char _Buf[(_NL + 1) * (_MAX_INT_DIG + 1)];
        int _N = sprintf(_Buf, "%p", _V);
        size_t _M = _X.width() <= 0 || _X.width() <= _N
            ? 0 : _X.width() - _N;
        ios_base::fmtflags _Afl =
            _X.flags() & ios_base::adjustfield;
        if (_Afl != ios_base::left)
            _F = _Rep(_F, _Fill, _M), _M = 0;
        _F = _Putc(_F, _Buf, _N);
        _X.width(0);
        return (_Rep(_F, _Fill, _M)); }
    static char *_Ffmt(char *_Fmt, char _Spec,
        ios_base::fmtflags _Fl)
        {char *_S = _Fmt;
        *_S++ = '%';
        if (_Fl & ios_base::showpos)
            *_S++ = '+';
        if (_Fl & ios_base::showpoint)
            *_S++ = '#';
        *_S++ = '.';
        *_S++ = '*';
        if (_Spec != 0)
            *_S++ = _Spec;    // 'L' for long double only
        ios_base::fmtflags _Ffl = _Fl & ios_base::floatfield;
        *_S++ = _Ffl == ios_base::fixed ? 'f'
            : _Ffl == ios_base::scientific ? 'e' : 'g';
        *_S = '\0';
        return (_Fmt); }
    static _OI _Fput(_OI _F, ios_base& _X, _E _Fill,
        const char *_S, size_t _Nz, size_t _N)
        {size_t _M = _X.width() <= 0 || _X.width() <= _N  + _Nz
            ? 0 : _X.width() - _N - _Nz;
        ios_base::fmtflags _Afl =
            _X.flags() & ios_base::adjustfield;
        if (_Afl != ios_base::left && _Afl != ios_base::internal)
            _F = _Rep(_F, _Fill, _M), _M = 0;
        else if (_Afl == ios_base::internal)
            {if (0 < _N && (*_S == '+' || *_S == '-'))
                _F = _Putc(_F, _S, 1), ++_S, --_N;
            _F = _Rep(_F, _Fill, _M), _M = 0; }
        const char *_P = (const char *)memchr(_S,
            localeconv()->decimal_point[0], _N);
        if (_P != 0)
            {const _Mypunct& _Fac = _USE(_X.getloc(), _Mypunct);
            size_t _Nf = _P - _S + 1;
            _F = _Putc(_F, _S, _Nf - 1);
            _F = _Rep(_F, _Fac.decimal_point(), 1);
            _S += _Nf, _N -= _Nf; }
        if ((_P = (const char *)memchr(_S, 'e', _N)) != 0)
            {size_t _Nm = _P - _S + 1;
            _F = _Putc(_F, _S, _Nm - 1);
            _F = _Rep(_F, _WIDEN(_E, '0'), _Nz), _Nz = 0;
            _F = _Putc(_F, _X.flags() & ios_base::uppercase
                ? "E" : "e", 1);
            _S += _Nm, _N -= _Nm; }
        _F = _Putc(_F, _S, _N);
        _F = _Rep(_F, _WIDEN(_E, '0'), _Nz);
        _X.width(0);
        return (_Rep(_F, _Fill, _M)); }
    static char *_Ifmt(char *_Fmt, char _Spec,
        ios_base::fmtflags _Fl)
        {char *_S = _Fmt;
        *_S++ = '%';
        if (_Fl & ios_base::showpos)
            *_S++ = '+';
        if (_Fl & ios_base::showbase)
            *_S++ = '#';
        *_S++ = 'l';
        ios_base::fmtflags _Bfl = _Fl & ios_base::basefield;
        *_S++ = _Bfl == ios_base::oct ? 'o'
            : _Bfl != ios_base::hex ? _Spec    // 'd' or 'u'
            : _Fl & ios_base::uppercase ? 'X' : 'x';
        *_S = '\0';
        return (_Fmt); }
    static _OI _Iput(_OI _F, ios_base& _X, _E _Fill,
        char *_S, size_t _N)
        {const size_t _Np = *_S == '+' || *_S == '-' ? 1
            : *_S == '0' && (_S[1] == 'x' || _S[1] == 'X') ? 2
            : 0;
        const _Mypunct& _Fac = _USE(_X.getloc(), _Mypunct);
        const string _Gr = _Fac.grouping();
        const _E _Ks = _Fac.thousands_sep();
        bool _Grp = '\0' < *_Gr.c_str();
        if (_Grp)
            {const char *_Pg = _Gr.c_str();
            size_t _I = _N;
            for (_Grp = false; *_Pg != CHAR_MAX && '\0' < *_Pg
                && *_Pg < _I - _Np; _Grp = true)
                {_I -= *_Pg;
                memmove(&_S[_I + 1], &_S[_I], _N + 1 - _I);
                _S[_I] = ',', ++_N;
                if ('\0' < _Pg[1])
                    ++_Pg; }}
        size_t _M = _X.width() <= 0 || _X.width() <= _N
            ? 0 : _X.width() - _N;
        ios_base::fmtflags _Afl =
            _X.flags() & ios_base::adjustfield;
        if (_Afl != ios_base::left && _Afl != ios_base::internal)
            _F = _Rep(_F, _Fill, _M), _M = 0;
        else if (_Afl == ios_base::internal)
            {_F = _Putc(_F, _S, _Np), _S += _Np, _N -= _Np;
            _F = _Rep(_F, _Fill, _M), _M = 0; }
        if (!_Grp)
            _F = _Putc(_F, _S, _N);
        else
            for (; ; ++_S, --_N)
                {size_t _Nd = strcspn(_S, ",");
                _F = _Putc(_F, _S, _Nd);
                _S += _Nd, _N -= _Nd;
                if (_N == 0)
                    break;
                if (_Ks != (_E)0)
                    _F = _Rep(_F, _Ks, 1); }
        _X.width(0);
        return (_Rep(_F, _Fill, _M)); }
    static _OI _Put(_OI _F, const _E *_S, size_t _N)
        {for (; 0 < _N; --_N, ++_F, ++_S)
            *_F = *_S;
        return (_F); }
    static _OI _Putc(_OI _F, const char *_S, size_t _N)
        {for (; 0 < _N; --_N, ++_F, ++_S)
            *_F = _WIDEN(_E, *_S);
        return (_F); }
    static _OI _Rep(_OI _F, _E _C, size_t _N)
        {for (; 0 < _N; --_N, ++_F)
            *_F = _C;
        return (_F); }
    };
template<class _E, class _OI>
    locale::id num_put<_E, _OI>::id;
//End of File