Listing 1: Class locale

class locale {
public:
    enum category {collate, ctype, monetary,
        numeric, time, messages, all, none};
            // CLASS id
    class id {
    public:
        id(size_t _X = 0)
            : _Id(_X) {}
        operator size_t()
            {_Lockit _Lk;
            if (_Id == 0)
                _Id = ++_Id_cnt;
            return (_Id); }
    private:
        size_t _Id;
        static int _Id_cnt;
        };
    class _Locimp;
            // class facet
    class facet {
        friend class locale;
        friend class _Locimp;
    public:
        static size_t _Getcat()
            {return ((size_t)(-1)); }
        void _Incref()
            {_Lockit _Lk;
            if (_Refs < (size_t)(-1))
                ++_Refs; }
        facet *_Decref()
            {_Lockit _Lk;
            if (0 < _Refs && _Refs < (size_t)(-1))
                --_Refs;
            return (_Refs == 0 ? this : 0); }
    protected:
        virtual ~facet()
            {}
        explicit facet(size_t _R = 0)
            : _Refs(_R) {}
    private:
        facet(const facet&);    // undefined
        const facet& operator=(const facet&);    // undefined
        size_t _Refs;
        };
            // CLASS _Locimp
    class _Locimp : public facet {
    protected:
        ~_Locimp();
    private:
        friend class locale;
        _Locimp(bool _Xp = false);
        _Locimp(const _Locimp&);
        void _Addfac(facet *, size_t);
        static _Locimp * _Makeloc(const _Locinfo&,
            category, _Locimp *, const locale *);
        facet **_Fv;
        size_t _Nfv;
        category _Cat;
        bool _Xpar;
        string _Name;
        static _Locimp *_Clocptr, *_Global;
        };
    template<class _E, class _Tr, class _A>
        bool operator()(const basic_string<_E, _Tr, _A>&,
            const basic_string<_E, _Tr, _A>&) const;
    template<class _F>
        locale(const locale& _X, _F *_Fac);
    template<class _F>
        locale combine(
            const locale& _X);
    locale() throw()
        : _Ptr(_Init())
        {_Locimp::_Global->_Incref(); }
    locale(_Uninitialized)
        {}
    locale(const locale& _X) throw()
        : _Ptr(_X._Ptr)
        {_Ptr->_Incref(); }
    locale(const locale&, const locale&, category);
    explicit locale(const char *, category = all);
    locale(const locale&, const char *, category);
    ~locale() throw()
        {if (_Ptr != 0)
            delete _Ptr->_Decref(); }
    locale& operator=(const locale& _X) throw()
        {if (_Ptr != _X._Ptr)
            {delete _Ptr->_Decref();
            _Ptr = _X._Ptr;
            _Ptr->_Incref(); }
        return (*this); }
    string name() const
        {return (_Ptr->_Name); }
    const facet *_Getfacet(size_t _Id) const;
    bool operator==(const locale&) const;
    bool operator!=(const locale& _X) const
        {return (!(*this == _X)); }
    static const locale& classic();
    static locale global(const locale&);
    static locale empty();
private:
    locale(_Locimp *_P)
        : _Ptr(_P) {}
    static _Locimp *_Init();
    _Locimp *_Ptr;
    };
//End of File