This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/Borland/BCC55/Include/Rw/money.h

589 lines
20 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __MONEY_H
#define __MONEY_H
#pragma option push -b -a8 -pc -Vx- -Ve- -w-inl -w-aus -w-sig
// -*- C++ -*-
/***************************************************************************
*
* money - Declarations for the Standard Library money facets
*
***************************************************************************
*
* Copyright (c) 1994-1999 Rogue Wave Software, Inc. All Rights Reserved.
*
* This computer software is owned by Rogue Wave Software, Inc. and is
* protected by U.S. copyright laws and other laws and by international
* treaties. This computer software is furnished by Rogue Wave Software,
* Inc. pursuant to a written license agreement and may be used, copied,
* transmitted, and stored only in accordance with the terms of such
* license and with the inclusion of the above copyright notice. This
* computer software or any other copies thereof may not be provided or
* otherwise made available to any other person.
*
* U.S. Government Restricted Rights. This computer software is provided
* with Restricted Rights. Use, duplication, or disclosure by the
* Government is subject to restrictions as set forth in subparagraph (c)
* (1) (ii) of The Rights in Technical Data and Computer Software clause
* at DFARS 252.227-7013 or subparagraphs (c) (1) and (2) of the
* Commercial Computer Software Restricted Rights at 48 CFR 52.227-19,
* as applicable. Manufacturer is Rogue Wave Software, Inc., 5500
* Flatiron Parkway, Boulder, Colorado 80301 USA.
*
**************************************************************************/
#ifndef __STD_MONEY__
#define __STD_MONEY__
#ifndef __STD_RWLOCALE__
#include <rw/rwlocale>
#endif
#ifndef __STD_RW_LOCNUMRW__
#include <rw/numbrw>
#endif
#ifndef _RWSTD_NO_NAMESPACE
namespace std {
#endif
struct _RWSTDExport money_base {
enum part { none, space, symbol, sign, value };
struct pattern { char field[4]; };
};
#ifndef _RWSTD_NO_NAMESPACE
} namespace __rwstd {
#endif
template <class charT> class money_handler_base_1;
template <class charT> class money_reader_base_1;
template <class charT> class money_writer_base_1;
template <class charT,class OutputIterator> class money_reader_base_2;
template <class charT,class OutputIterator> class money_writer_base_2;
// --------------------------------------------------------
// Implementation class template -- moneypunct_init<charT>.
// --------------------------------------------------------
// Structure used to initialize a rwstd::moneypunct_data<charT>.
template <class charT>
class moneypunct_init {
public:
bool del_; // Delete when initialization is done
charT dp_, ts_; // Decimal point and thousands separator
const char *gr_; // Grouping pattern
const charT *cs_; // Currency symbol string
const charT *ps_, *ns_; // Positive and negative sign strings
int fd_; // Number of fractional digits
_RW_STD::money_base::pattern pf_; // Positive format pattern
_RW_STD::money_base::pattern nf_; // Negative format pattern
};
// ----------------------------------------
// Implementation class -- moneypunct_base.
// ----------------------------------------
// Contains parts of moneypunct_data<charT> that do not depend on the template
// parameter.
class _RWSTDExport moneypunct_base {
public:
static __RWSTD::moneypunct_init<char> *__get_named_init
(const char*,bool);
};
// --------------------------------------------------------
// Implementation class template -- moneypunct_data<charT>.
// --------------------------------------------------------
// moneypunct<charT,Intl> derives from this (via moneypunct_impl<charT,Intl>)
// to get its private data members.
template <class charT>
class moneypunct_data :
public moneypunct_base,
public punct_data<charT>
{
friend class money_handler_base_1<charT>;
#ifndef _RWSTD_NO_NAMESPACE
friend class _RW_STD::moneypunct<charT,false>;
friend class _RW_STD::moneypunct<charT,true>;
#else
friend class moneypunct<charT,false>;
friend class moneypunct<charT,true>;
#endif
typedef _RW_STD::basic_string<charT,_RW_STD::char_traits<charT>,_RW_STD::allocator<charT> > string_type;
string_type cs_; // Currency symbol
string_type ps_, ns_; // Positive and negative sign strings
int fd_; // Number of fractional digits
_RW_STD::money_base::pattern pf_, nf_; // Positive and negative format patterns
protected:
moneypunct_data (moneypunct_init<charT>*);
void __initfacetbase (const locale*);
moneypunct_init<charT> *get_init_by_name_ (const char*,bool);
};
// -------------------------------------------------------------
// Implementation class template -- money_handler_base_1<charT>.
// -------------------------------------------------------------
// Contains common money_reader and money_writer functionality that depends
// only on the charT template parameter.
template <class charT>
class money_handler_base_1
{
const moneypunct_data<charT> &mpunct;
protected:
typedef _RW_STD::basic_string<charT,_RW_STD::char_traits<charT>,_RW_STD::allocator<charT> > string_type;
money_handler_base_1
(const moneypunct_data<charT> &p): mpunct(p) { }
inline static const moneypunct_data<charT>&
get_punct_data (const _RW_STD::locale &loc,bool intl);
const _RW_STD::money_base::pattern &get_pos_format() const { return mpunct.pf_; }
const _RW_STD::money_base::pattern &get_neg_format() const { return mpunct.nf_; }
const string_type &get_positive_sign() const { return mpunct.ps_; }
const string_type &get_negative_sign() const { return mpunct.ns_; }
const string_type &get_curr_symbol() const { return mpunct.cs_; }
int get_frac_digits() const { return mpunct.fd_; }
};
// ------------------------------------------------------------
// Implementation class template -- money_reader_base_1<charT>.
// ------------------------------------------------------------
// Contains parts of money_reader<charT,InputIterator> that depend only on the
// charT template parameter.
template <class charT>
class money_reader_base_1:
public money_handler_base_1<charT>
{
protected:
typedef _RW_STD::basic_string<charT,_RW_STD::char_traits<charT>,_RW_STD::allocator<charT> > string_type;
digit_reader_base_1<charT> &reader;
money_reader_base_1
(digit_reader_base_1<charT> &r,
const moneypunct_data<charT> &mp);
public:
void get_money_string (string_type&,const char*);
};
// --------------------------------------------------------------------------
// Implementation class template -- money_reader_base_2<charT,InputIterator>.
// --------------------------------------------------------------------------
// Contains parts of money_reader<charT,InputIterator> that do not depend on
// the intl constructor parameter.
template <class charT, class InputIterator>
class money_reader_base_2 :
public digit_reader<charT,InputIterator>,
public money_reader_base_1<charT>
{
protected:
typedef _RW_STD::basic_string<charT,_RW_STD::char_traits<charT>,
_RW_STD::allocator<charT> > string_type;
money_reader_base_2 (InputIterator &i,InputIterator &e,
_RW_STD::ios_base &b,const moneypunct_data<charT> &mp);
inline digit_reader_base_1<charT> &this_as_digit_reader () { return *this; }
public:
char *get_money_digits (void); // Get monetary-format digits
};
// -------------------------------------------------------------------
// Implementation class template -- money_reader<charT,InputIterator>.
// -------------------------------------------------------------------
template <class charT, class InputIterator>
class money_reader :
public money_reader_base_2<charT,InputIterator>
{
public:
money_reader (InputIterator &i,InputIterator &e,
_RW_STD::ios_base &b,bool intl);
};
// ------------------------------------------------------------
// Implementation class template -- money_writer_base_1<charT>.
// ------------------------------------------------------------
// Contains parts of money_writer<charT,Intl,OutputIterator> that depend only
// on the charT template parameter.
template <class charT>
class money_writer_base_1 :
public money_handler_base_1<charT>
{
public:
typedef _RW_STD::basic_string<charT,_RW_STD::char_traits<charT>,_RW_STD::allocator<charT> > string_type;
void put_money (charT fill);
void put_money (const string_type&,charT fill);
protected:
digit_writer_base_1<charT> &writer;
money_writer_base_1
(digit_writer_base_1<charT> &w,
const moneypunct_data<charT> &mp);
virtual void put_money_sub (const charT*,const charT*,bool,charT)=0;
};
// ---------------------------------------------------------------------------
// Implementation class template -- money_writer_base_2<charT,OutputIterator>.
// ---------------------------------------------------------------------------
// Contains parts of money_writer<charT,OutputIterator> that do not depend on
// the intl constructor parameter.
template <class charT,class OutputIterator>
class money_writer_base_2:
public digit_writer<charT,OutputIterator>,
public money_writer_base_1<charT>
{
protected:
typedef _RW_STD::basic_string<charT,_RW_STD::char_traits<charT>,
_RW_STD::allocator<charT> > string_type;
money_writer_base_2 (OutputIterator &os,_RW_STD::ios_base &io,
const moneypunct_data<charT> &mp);
inline digit_writer_base_1<charT> &this_as_digit_writer () { return *this; }
virtual void put_money_sub (const charT*,const charT*,bool,charT fill);
};
// --------------------------------------------------------------------
// Implementation class template -- money_writer<charT,OutputIterator>.
// --------------------------------------------------------------------
template <class charT,class OutputIterator>
class money_writer :
public money_writer_base_2<charT,OutputIterator>
{
public:
money_writer (OutputIterator &os,_RW_STD::ios_base &io,bool intl);
};
template <class charT>
moneypunct_init<charT>* _RWSTDExportTemplate
fixup_moneypunct_init (moneypunct_init<char>*,charT*);
#ifndef _RWSTD_NO_NEW_TEMPLATE_SYNTAX
template <>
inline moneypunct_init<char>* fixup_moneypunct_init<char>
(moneypunct_init<char> *init,char*)
#else
inline moneypunct_init<char>* fixup_moneypunct_init
(moneypunct_init<char> *init,char*)
#endif // _RWSTD_NO_NEW_TEMPLATE_SYNTAX
{
return init;
}
// -------------------------------------------------------------
// Implementation class template -- moneypunct_impl<charT,Intl>.
// -------------------------------------------------------------
// moneypunct<charT,Intl> derives from this to get the parts of its behavior
// that are specialized for the character type and the Intl format selection.
template <class charT,bool Intl>
class moneypunct_impl:
public moneypunct_data<charT>
{
protected:
moneypunct_impl (void);
};
_RWSTD_TEMPLATE
class _RWSTDExport moneypunct_impl<char,false>: // Specialization
public moneypunct_data<char>
{
friend class moneypunct_base;
protected:
typedef moneypunct_data<char> parent_type;
static _RWSTDExportStatic moneypunct_init<char> ivals_; // Vendor-supplied
moneypunct_impl
( moneypunct_init<char> *init=&ivals_ ):
parent_type(init) { }
};
_RWSTD_TEMPLATE
class _RWSTDExport moneypunct_impl<char,true>: // Specialization
public moneypunct_data<char>
{
friend class moneypunct_base;
protected:
typedef moneypunct_data<char> parent_type;
static _RWSTDExportStatic moneypunct_init<char> ivals_; // Vendor-supplied
moneypunct_impl
( moneypunct_init<char> *init=&ivals_ ):
parent_type(init) { }
};
#ifndef _RWSTD_NO_WIDE_CHAR
_RWSTD_TEMPLATE
class _RWSTDExport moneypunct_impl<wchar_t,false>: // Specialization
public moneypunct_data<wchar_t>
{
protected:
typedef moneypunct_data<wchar_t> parent_type;
static _RWSTDExportStatic moneypunct_init<wchar_t> ivals_; // Vendor-supplied
moneypunct_impl
( moneypunct_init<wchar_t> *init=&ivals_ ):
parent_type(init) { }
};
_RWSTD_TEMPLATE
class _RWSTDExport moneypunct_impl<wchar_t,true>: // Specialization
public moneypunct_data<wchar_t>
{
protected:
typedef moneypunct_data<wchar_t> parent_type;
static _RWSTDExportStatic moneypunct_init<wchar_t> ivals_; // Vendor-supplied
moneypunct_impl
( moneypunct_init<wchar_t> *init=&ivals_ ):
parent_type(init) { }
};
#endif // _RWSTD_NO_WIDE_CHAR
#ifndef _RWSTD_NO_NAMESPACE
} namespace std {
#endif
// ---------------------------------------------------------------
// Standard money parsing facet -- money_get<charT,InputIterator>.
// ---------------------------------------------------------------
template <class charT, class InputIterator>
class _RWSTDExportTemplate money_get: public locale::facet {
public:
typedef charT char_type;
typedef InputIterator iter_type;
typedef basic_string<charT,char_traits<charT>,allocator<charT> > string_type;
_EXPLICIT money_get (size_t refs=0): locale::facet(refs,locale::monetary) { }
iter_type get (iter_type s, iter_type e, bool intl, ios_base& f,
ios_base::iostate& err, long double& units) const
{ return do_get(s,e,intl,f,err,units); }
iter_type get (iter_type s, iter_type e, bool intl, ios_base& f,
ios_base::iostate& err, string_type& digits) const
{ return do_get(s,e,intl,f,err,digits); }
static locale::id id;
// Implementation:
enum { __facet_cat = locale::monetary, __ok_implicit = 1 };
protected:
virtual ~money_get();
virtual iter_type do_get (iter_type, iter_type, bool, ios_base&,
ios_base::iostate&, long double& units) const;
virtual iter_type do_get (iter_type, iter_type, bool, ios_base&,
ios_base::iostate&, string_type& digits) const;
private:
#ifdef _RWSTD_NO_MEMBER_TEMPLATES
locale::id &__get_id (void) const { return id; }
#endif
};
// -------------------------------------------------------------------
// Standard money formatting facet -- money_put<charT,OutputIterator>.
// -------------------------------------------------------------------
template <class charT, class OutputIterator>
class _RWSTDExportTemplate money_put: public locale::facet {
public:
typedef charT char_type;
typedef OutputIterator iter_type;
typedef basic_string<charT,char_traits<charT>,allocator<charT> > string_type;
_EXPLICIT money_put (size_t refs=0): locale::facet(refs,locale::monetary) { }
#ifndef _RWSTD_NO_LONG_DOUBLE
iter_type put (iter_type out, bool intl, ios_base& io, char_type fill,
long double quant) const
#else
iter_type put (iter_type out, bool intl, ios_base& io, char_type fill,
double quant) const
#endif
{ return do_put(out,intl,io,fill,quant); }
iter_type put (iter_type out, bool intl, ios_base& io, char_type fill,
const string_type& digits) const
{ return do_put(out,intl,io,fill,digits); }
static locale::id id;
// Implementation:
enum { __facet_cat = locale::monetary, __ok_implicit = 1 };
protected:
virtual ~money_put();
#ifndef _RWSTD_NO_LONG_DOUBLE
virtual iter_type do_put (iter_type out, bool intl, ios_base& io,
char_type fill, long double quant) const;
#else
virtual iter_type do_put (iter_type out, bool intl, ios_base& io,
char_type fill, double quant) const;
#endif
virtual iter_type do_put (iter_type out, bool intl, ios_base& io,
char_type fill, const string_type &digits) const;
private:
#ifdef _RWSTD_NO_MEMBER_TEMPLATES
locale::id &__get_id (void) const { return id; }
#endif
};
// -----------------------------------------------------------
// Standard money punctuation facet -- moneypunct<charT,bool>.
// -----------------------------------------------------------
template <class charT, bool Intl>
class _RWSTDExportTemplate moneypunct: public locale::facet, public money_base,
public __RWSTD::moneypunct_impl<charT,Intl>
{
public:
typedef charT char_type;
typedef basic_string<charT,char_traits<charT>,allocator<charT> > string_type;
#ifndef _RWSTD_NO_STI_SIMPLE
static const bool intl = Intl;
#else
enum { intl = Intl };
#endif
// The second parameter (i) to the constructor is implementation specific.
// For portable code, always let it default as shown.
_EXPLICIT moneypunct (size_t refs=0,
__RWSTD::moneypunct_init<charT> *i = get_ivals_());
char_type decimal_point() const { return do_decimal_point(); }
char_type thousands_sep() const { return do_thousands_sep(); }
string grouping() const { return do_grouping(); }
string_type curr_symbol() const { return do_curr_symbol(); };
string_type positive_sign() const { return do_positive_sign(); }
string_type negative_sign() const { return do_negative_sign(); }
int frac_digits() const { return do_frac_digits(); }
pattern pos_format() const { return do_pos_format(); }
pattern neg_format() const { return do_neg_format(); }
static locale::id id;
// Implementation:
enum { __facet_cat = locale::monetary, __ok_implicit = 1 };
protected:
virtual ~moneypunct();
virtual char_type do_decimal_point() const;
virtual char_type do_thousands_sep() const;
virtual string do_grouping() const;
virtual string_type do_curr_symbol() const;
virtual string_type do_positive_sign() const;
virtual string_type do_negative_sign() const;
virtual int do_frac_digits() const;
virtual pattern do_pos_format() const;
virtual pattern do_neg_format() const;
private:
void __initfacet (const locale*);
#ifdef _RWSTD_NO_MEMBER_TEMPLATES
locale::id &__get_id (void) const { return id; }
#endif
public:
static __RWSTD::moneypunct_init<charT> *get_ivals_ ()
{ return &__RWSTD::moneypunct_impl<charT,Intl>::ivals_; }
};
template <class charT,bool Intl>
inline moneypunct<charT,Intl>::moneypunct
(size_t refs,__RWSTD::moneypunct_init<charT> *init):
locale::facet(refs,locale::monetary),
__RWSTD::moneypunct_impl<charT,Intl>(init) { }
// --------------------------------------------------------
// Standard derived facet -- moneypunct_byname<charT,Intl>.
// --------------------------------------------------------
template <class charT, bool Intl>
class moneypunct_byname: public moneypunct<charT,Intl> {
public:
_EXPLICIT moneypunct_byname (const char*, size_t refs=0);
protected:
virtual ~moneypunct_byname();
// Virtual member functions inherited from moneypunct<charT,Intl>:
// virtual char_type do_decimal_point () const;
// virtual char_type do_thousands_sep () const;
// virtual string do_grouping () const;
// virtual string_type do_curr_symbol () const;
// virtual string_type do_positive_sign () const;
// virtual string_type do_negative_sign () const;
// virtual int do_frac_digits () const;
// virtual pattern do_pos_format () const;
// virtual pattern do_neg_format () const;
};
#ifndef _RWSTD_NO_NAMESPACE
} namespace __rwstd {
#endif
#ifndef _RWSTD_NO_FUNC_PARTIAL_SPEC
template <class charT,bool Intl>
inline _RW_STD::moneypunct<charT,Intl>* create_named_facet
(_RW_STD::moneypunct<charT,Intl>*,const char *name,size_t refs)
{ return new _RW_STD::moneypunct_byname<charT,Intl>(name,refs); }
#else
inline _RW_STD::moneypunct<char,false>* create_named_facet
(_RW_STD::moneypunct<char,false>*,const char *name,size_t refs)
{ return new _RW_STD::moneypunct_byname<char,false>(name,refs); }
inline _RW_STD::moneypunct<char,true>* create_named_facet
(_RW_STD::moneypunct<char,true>*,const char *name,size_t refs)
{ return new _RW_STD::moneypunct_byname<char,true>(name,refs); }
#ifndef _RWSTD_NO_WIDE_CHAR
inline _RW_STD::moneypunct<wchar_t,false>* create_named_facet
(_RW_STD::moneypunct<wchar_t,false>*,const char *name,size_t refs)
{ return new _RW_STD::moneypunct_byname<wchar_t,false>(name,refs); }
inline _RW_STD::moneypunct<wchar_t,true>* create_named_facet
(_RW_STD::moneypunct<wchar_t,true>*,const char *name,size_t refs)
{ return new _RW_STD::moneypunct_byname<wchar_t,true>(name,refs); }
#endif
#endif
#ifndef _RWSTD_NO_NAMESPACE
}
#endif
#ifdef _RWSTD_COMPILE_INSTANTIATE
#include <rw/money.cc>
#endif
#endif // __STD_MONEY__
#pragma option pop
#endif /* __MONEY_H */