/***************************************************************************
 *
 * _numpunct.h - definition of the std::numpunct class templates
 *
 * This is an internal header file used to implement the C++ Standard
 * Library. It should never be #included directly by a program.
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  "License"); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 *
 * Copyright 1994-2006 Rogue Wave Software.
 * 
 **************************************************************************/

#ifndef _RWSTD_LOC_NUMPUNCT_H_INCLUDED
#define _RWSTD_LOC_NUMPUNCT_H_INCLUDED


#if __GNUG__ >= 3
#  pragma GCC system_header
#endif   // gcc >= 3


#include <string>
#include <loc/_facet.h>
#include <loc/_punct.h>
#include <rw/_defs.h>


_RWSTD_NAMESPACE (_V3_LOCALE) { 


// FIXME: provide just required specializations when #defined
// #ifndef _RWSTD_NO_EXT_NUMPUNCT_PRIMARY

// 22.2.3.1
_EXPORT
template <class _CharT>
struct numpunct: _RW::__rw_facet
{
    typedef _CharT char_type;
    typedef
    basic_string<char_type, char_traits<char_type>, allocator<char_type> >
    string_type;

    _EXPLICIT numpunct (_RWSTD_SIZE_T __ref = 0)
        : _RW::__rw_facet (__ref), _C_flags (0) { }

    virtual ~numpunct ();

    // 22.2.3.1.1, p1
    char_type decimal_point () const;

    // 22.2.3.1.1, p2
    char_type thousands_sep () const;

    // 22.2.3.1.1, p3
    string grouping () const;

    // 22.2.3.1.1, p4
    string_type truename () const;

    // 22.2.3.1.1, p4
    string_type falsename () const;

    static _RW::__rw_facet_id id;

protected:

    // 22.2.3.1.2, p1
    virtual char_type do_decimal_point () const {
        return *_RW::__rw_get_punct (this, _RW::__rw_dp, char_type ());
    }

    // 22.2.3.1.2, p2
    virtual char_type do_thousands_sep () const {
        return *_RW::__rw_get_punct (this, _RW::__rw_ts, char_type ());
    }

    // 22.2.3.1.2, p3
    virtual string do_grouping () const {
        return _RWSTD_REINTERPRET_CAST (const char*,
                   _RW::__rw_get_punct (this, _RW::__rw_gr, char_type ()));
    }

    // 22.2.3.1.2, p4
    virtual string_type do_truename () const {
        return _RW::__rw_get_punct (this, _RW::__rw_tn, char_type ());
    }

    // 22.2.3.1.2, p4
    virtual string_type do_falsename () const {
        return _RW::__rw_get_punct (this, _RW::__rw_fn, char_type ());
    }

private:

    int         _C_flags;           // bitmap of "cached data valid" flags
    string      _C_grouping;        // cached results of virtual members
    string_type _C_truename;
    string_type _C_falsename;
    char_type   _C_decimal_point;
    char_type   _C_thousands_sep;
};


#ifndef _RWSTD_NO_SPECIALIZED_FACET_ID

_RWSTD_SPECIALIZED_CLASS
_RW::__rw_facet_id numpunct<char>::id;

#  ifndef _RWSTD_NO_WCHAR_T

_RWSTD_SPECIALIZED_CLASS
_RW::__rw_facet_id numpunct<wchar_t>::id;

#  endif   // _RWSTD_NO_WCHAR_T
#endif   // _RWSTD_NO_SPECIALIZED_FACET_ID


template <class _CharT>
inline _TYPENAME numpunct<_CharT>::char_type
numpunct<_CharT>::decimal_point () const
{
    if (!(_C_flags & _RW::__rw_dp)) {

        numpunct* const __self = _RWSTD_CONST_CAST (numpunct*, this);

        // [try to] get the decimal point first (may throw)
        // then set a flag to avoid future initializations
        __self->_C_decimal_point  = do_decimal_point ();
        __self->_C_flags         |= _RW::__rw_dp;
    }

    return _C_decimal_point;
}


template <class _CharT>
inline _TYPENAME numpunct<_CharT>::char_type
numpunct<_CharT>::thousands_sep () const
{
    if (!(_C_flags & _RW::__rw_ts)) {

        numpunct* const __self = _RWSTD_CONST_CAST (numpunct*, this);

        // [try to] get the thousands_sep first (may throw)
        // then set a flag to avoid future initializations
        __self->_C_thousands_sep  = do_thousands_sep ();
        __self->_C_flags         |= _RW::__rw_ts;
    }

    return _C_thousands_sep;
}


template <class _CharT>
inline string numpunct<_CharT>::grouping () const
{
    if (!(_C_flags & _RW::__rw_gr)) {

        numpunct* const __self = _RWSTD_CONST_CAST (numpunct*, this);

        // [try to] get the grouping first (may throw)
        // then set a flag to avoid future initializations
        __self->_C_grouping  = do_grouping ();
        __self->_C_flags    |= _RW::__rw_gr;
    }

    return _C_grouping;
}


template <class _CharT>
inline _TYPENAME numpunct<_CharT>::string_type
numpunct<_CharT>::truename () const
{
    if (!(_C_flags & _RW::__rw_tn)) {

        numpunct* const __self = _RWSTD_CONST_CAST (numpunct*, this);

        // [try to] get the true name first (may throw)
        // then set a flag to avoid future initializations
        __self->_C_truename  = do_truename ();
        __self->_C_flags    |= _RW::__rw_tn;
    }

    return _C_truename;
}


template <class _CharT>
inline _TYPENAME numpunct<_CharT>::string_type
numpunct<_CharT>::falsename () const
{
    if (!(_C_flags & _RW::__rw_fn)) {

        numpunct* const __self = _RWSTD_CONST_CAST (numpunct*, this);

        // [try to] get the false name first (may throw)
        // then set a flag to avoid future initializations
        __self->_C_falsename  = do_falsename ();
        __self->_C_flags     |= _RW::__rw_fn;
    }

    return _C_falsename;
}

// #endif _RWSTD_NO_EXT_NUMPUNCT_PRIMARY


// 22.2.3.2
template <class _CharT>
class numpunct_byname: public numpunct<_CharT>
{
    char _C_namebuf [32];

public:

    _EXPLICIT numpunct_byname (const char *__name, _RWSTD_SIZE_T __refs = 0)
        : numpunct<_CharT>(__refs) {
        this->_C_set_name (__name, _C_namebuf, sizeof _C_namebuf);
    }
};

}   // namespace _V3_LOCALE


#if _RWSTD_DEFINE_TEMPLATE_FIRST (_NUMPUNCT)
#  include <loc/_numpunct.cc>
#endif   // _RWSTD_DEFINE_TEMPLATE_FIRST (_NUMPUNCT)


_RWSTD_NAMESPACE (_V3_LOCALE) { 

#if _RWSTD_INSTANTIATE (_NUMPUNCT, _CHAR)

_RWSTD_INSTANTIATE_1 (struct _RWSTD_EXPORT numpunct<char>);

#endif   // _RWSTD_INSTANTIATE (_NUMPUNCT, _CHAR)

#if _RWSTD_INSTANTIATE (_NUMPUNCT, _WCHAR_T)

_RWSTD_INSTANTIATE_1 (struct _RWSTD_EXPORT numpunct<wchar_t>);

#endif   // _RWSTD_INSTANTIATE (_NUMPUNCT, _WCHAR_T)

}   // namespace _V3_LOCALE


#if _RWSTD_DEFINE_TEMPLATE_LAST (_NUMPUNCT)
#  include <loc/_numpunct.cc>
#endif   // _RWSTD_DEFINE_TEMPLATE_LAST (_NUMPUNCT)


#endif   // _RWSTD_LOC_NUMPUNCT_H_INCLUDED
