Home | History | Annotate | Download | only in stl
      1 /*
      2  * Copyright (c) 1999
      3  * Silicon Graphics Computer Systems, Inc.
      4  *
      5  * Copyright (c) 1999
      6  * Boris Fomitchev
      7  *
      8  * This material is provided "as is", with absolutely no warranty expressed
      9  * or implied. Any use is at your own risk.
     10  *
     11  * Permission to use or copy this software for any purpose is hereby granted
     12  * without fee, provided the above notices are retained on all copies.
     13  * Permission to modify the code and to distribute modified code is granted,
     14  * provided the above notices are retained, and a notice that the code was
     15  * modified is included with the above copyright notice.
     16  *
     17  */
     18 // WARNING: This is an internal header file, included by other C++
     19 // standard library headers.  You should not attempt to use this header
     20 // file directly.
     21 
     22 
     23 #ifndef _STLP_INTERNAL_MONETARY_H
     24 #define _STLP_INTERNAL_MONETARY_H
     25 
     26 #ifndef _STLP_INTERNAL_OSTREAMBUF_ITERATOR_H
     27 #  include <stl/_ostreambuf_iterator.h>
     28 #endif
     29 
     30 #ifndef _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H
     31 #  include <stl/_istreambuf_iterator.h>
     32 #endif
     33 
     34 #ifndef _STLP_FACETS_FWD_H
     35 #  include <stl/_facets_fwd.h>
     36 #endif
     37 
     38 _STLP_BEGIN_NAMESPACE
     39 
     40 class money_base {
     41 public:
     42   enum part {none, space, symbol, sign, value};
     43   struct pattern {
     44     char field[4];
     45   };
     46 };
     47 
     48 // moneypunct facets: forward declaration
     49 template <class _charT, _STLP_DFL_NON_TYPE_PARAM(bool, _International, false) > class moneypunct {};
     50 
     51 // money_get facets
     52 
     53 template <class _CharT, class _InputIter>
     54 class money_get : public locale::facet {
     55 public:
     56   typedef _CharT               char_type;
     57   typedef _InputIter           iter_type;
     58   typedef basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > string_type;
     59 
     60   explicit money_get(size_t __refs = 0) : locale::facet(__refs) {}
     61   iter_type get(iter_type __s, iter_type  __end, bool __intl,
     62                 ios_base&  __str, ios_base::iostate&  __err,
     63                 _STLP_LONGEST_FLOAT_TYPE& __units) const
     64   { return do_get(__s,  __end, __intl,  __str,  __err, __units); }
     65   iter_type get(iter_type __s, iter_type  __end, bool __intl,
     66                 ios_base&  __str, ios_base::iostate& __err,
     67                 string_type& __digits) const
     68   { return do_get(__s,  __end, __intl,  __str,  __err, __digits); }
     69 
     70   static locale::id id;
     71 
     72 protected:
     73   ~money_get() {}
     74   virtual iter_type do_get(iter_type __s, iter_type  __end, bool  __intl,
     75                            ios_base&  __str, ios_base::iostate& __err,
     76                            _STLP_LONGEST_FLOAT_TYPE& __units) const;
     77   virtual iter_type do_get(iter_type __s, iter_type __end, bool __intl,
     78                            ios_base&  __str, ios_base::iostate& __err,
     79                            string_type& __digits) const;
     80 };
     81 
     82 
     83 // moneypunct facets: definition of specializations
     84 
     85 _STLP_TEMPLATE_NULL
     86 class _STLP_CLASS_DECLSPEC moneypunct<char, true> : public locale::facet, public money_base {
     87 public:
     88   typedef char                 char_type;
     89   typedef string               string_type;
     90   explicit moneypunct _STLP_PSPEC2(char, true) (size_t __refs = 0);
     91 
     92   char        decimal_point() const { return do_decimal_point(); }
     93   char        thousands_sep() const { return do_thousands_sep(); }
     94   string      grouping()      const { return do_grouping(); }
     95   string_type curr_symbol()   const { return do_curr_symbol(); }
     96   string_type positive_sign() const { return do_positive_sign(); }
     97   string_type negative_sign() const { return do_negative_sign(); }
     98   int         frac_digits()   const { return do_frac_digits(); }
     99   pattern     pos_format()    const { return do_pos_format(); }
    100   pattern     neg_format()    const { return do_neg_format(); }
    101 
    102   static _STLP_STATIC_DECLSPEC locale::id id;
    103   _STLP_STATIC_CONSTANT(bool, intl = true);
    104 
    105 protected:
    106   pattern _M_pos_format;
    107   pattern _M_neg_format;
    108 
    109   ~moneypunct _STLP_PSPEC2(char, true) ();
    110 
    111   virtual char        do_decimal_point() const;
    112   virtual char        do_thousands_sep() const;
    113   virtual string      do_grouping()      const;
    114 
    115   virtual string      do_curr_symbol()   const;
    116 
    117   virtual string      do_positive_sign() const;
    118   virtual string      do_negative_sign() const;
    119   virtual int         do_frac_digits()   const;
    120   virtual pattern     do_pos_format()    const;
    121   virtual pattern     do_neg_format()    const;
    122 };
    123 
    124 _STLP_TEMPLATE_NULL
    125 class _STLP_CLASS_DECLSPEC moneypunct<char, false> : public locale::facet, public money_base {
    126 public:
    127   typedef char                 char_type;
    128   typedef string               string_type;
    129 
    130   explicit moneypunct _STLP_PSPEC2(char, false) (size_t __refs = 0);
    131 
    132   char        decimal_point() const { return do_decimal_point(); }
    133   char        thousands_sep() const { return do_thousands_sep(); }
    134   string      grouping()      const { return do_grouping(); }
    135   string_type curr_symbol()   const { return do_curr_symbol(); }
    136   string_type positive_sign() const { return do_positive_sign(); }
    137   string_type negative_sign() const { return do_negative_sign(); }
    138   int         frac_digits()   const { return do_frac_digits(); }
    139   pattern     pos_format()    const { return do_pos_format(); }
    140   pattern     neg_format()    const { return do_neg_format(); }
    141 
    142   static _STLP_STATIC_DECLSPEC locale::id id;
    143   _STLP_STATIC_CONSTANT(bool, intl = false);
    144 
    145 protected:
    146   pattern _M_pos_format;
    147   pattern _M_neg_format;
    148 
    149   ~moneypunct _STLP_PSPEC2(char, false) ();
    150 
    151   virtual char        do_decimal_point() const;
    152   virtual char        do_thousands_sep() const;
    153   virtual string      do_grouping()      const;
    154 
    155   virtual string      do_curr_symbol()   const;
    156 
    157   virtual string      do_positive_sign() const;
    158   virtual string      do_negative_sign() const;
    159   virtual int         do_frac_digits()   const;
    160   virtual pattern     do_pos_format()    const;
    161   virtual pattern     do_neg_format()    const;
    162 };
    163 
    164 
    165 #ifndef _STLP_NO_WCHAR_T
    166 
    167 _STLP_TEMPLATE_NULL
    168 class _STLP_CLASS_DECLSPEC moneypunct<wchar_t, true> : public locale::facet, public money_base {
    169 public:
    170   typedef wchar_t                 char_type;
    171   typedef wstring                 string_type;
    172   explicit moneypunct _STLP_PSPEC2(wchar_t, true) (size_t __refs = 0);
    173   wchar_t     decimal_point() const { return do_decimal_point(); }
    174   wchar_t     thousands_sep() const { return do_thousands_sep(); }
    175   string      grouping()      const { return do_grouping(); }
    176   string_type curr_symbol()   const { return do_curr_symbol(); }
    177   string_type positive_sign() const { return do_positive_sign(); }
    178   string_type negative_sign() const { return do_negative_sign(); }
    179   int         frac_digits()   const { return do_frac_digits(); }
    180   pattern     pos_format()    const { return do_pos_format(); }
    181   pattern     neg_format()    const { return do_neg_format(); }
    182 
    183   static _STLP_STATIC_DECLSPEC locale::id id;
    184   _STLP_STATIC_CONSTANT(bool, intl = true);
    185 
    186 protected:
    187   pattern _M_pos_format;
    188   pattern _M_neg_format;
    189 
    190   ~moneypunct _STLP_PSPEC2(wchar_t, true) ();
    191 
    192   virtual wchar_t     do_decimal_point() const;
    193   virtual wchar_t     do_thousands_sep() const;
    194   virtual string      do_grouping()      const;
    195 
    196   virtual string_type do_curr_symbol()   const;
    197 
    198   virtual string_type do_positive_sign() const;
    199   virtual string_type do_negative_sign() const;
    200   virtual int         do_frac_digits()   const;
    201   virtual pattern     do_pos_format()    const;
    202   virtual pattern     do_neg_format()    const;
    203 };
    204 
    205 
    206 _STLP_TEMPLATE_NULL
    207 class _STLP_CLASS_DECLSPEC moneypunct<wchar_t, false> : public locale::facet, public money_base {
    208 public:
    209   typedef wchar_t                 char_type;
    210   typedef wstring                 string_type;
    211   explicit moneypunct _STLP_PSPEC2(wchar_t, false) (size_t __refs = 0);
    212   wchar_t     decimal_point() const { return do_decimal_point(); }
    213   wchar_t     thousands_sep() const { return do_thousands_sep(); }
    214   string      grouping()      const { return do_grouping(); }
    215   string_type curr_symbol()   const { return do_curr_symbol(); }
    216   string_type positive_sign() const { return do_positive_sign(); }
    217   string_type negative_sign() const { return do_negative_sign(); }
    218   int         frac_digits()   const { return do_frac_digits(); }
    219   pattern     pos_format()    const { return do_pos_format(); }
    220   pattern     neg_format()    const { return do_neg_format(); }
    221 
    222   static _STLP_STATIC_DECLSPEC locale::id id;
    223   _STLP_STATIC_CONSTANT(bool, intl = false);
    224 
    225 protected:
    226   pattern _M_pos_format;
    227   pattern _M_neg_format;
    228 
    229   ~moneypunct _STLP_PSPEC2(wchar_t, false) ();
    230 
    231   virtual wchar_t     do_decimal_point() const;
    232   virtual wchar_t     do_thousands_sep() const;
    233   virtual string      do_grouping()      const;
    234 
    235   virtual string_type do_curr_symbol()   const;
    236 
    237   virtual string_type do_positive_sign() const;
    238   virtual string_type do_negative_sign() const;
    239   virtual int         do_frac_digits()   const;
    240   virtual pattern     do_pos_format()    const;
    241   virtual pattern     do_neg_format()    const;
    242 };
    243 
    244 # endif
    245 
    246 template <class _charT, _STLP_DFL_NON_TYPE_PARAM(bool , _International , false) > class moneypunct_byname {};
    247 
    248 _STLP_TEMPLATE_NULL
    249 class _STLP_CLASS_DECLSPEC moneypunct_byname<char, true> : public moneypunct<char, true> {
    250   friend class _Locale_impl;
    251 public:
    252   typedef money_base::pattern   pattern;
    253   typedef char                  char_type;
    254   typedef string                string_type;
    255 
    256   explicit moneypunct_byname _STLP_PSPEC2(char, true) (const char * __name, size_t __refs = 0);
    257 
    258 protected:
    259   ~moneypunct_byname _STLP_PSPEC2(char, true) ();
    260   virtual char        do_decimal_point() const;
    261   virtual char        do_thousands_sep() const;
    262   virtual string      do_grouping()      const;
    263 
    264   virtual string_type do_curr_symbol()   const;
    265 
    266   virtual string_type do_positive_sign() const;
    267   virtual string_type do_negative_sign() const;
    268   virtual int         do_frac_digits()   const;
    269 
    270 private:
    271   moneypunct_byname _STLP_PSPEC2(char, true) (_Locale_monetary *__monetary);
    272 
    273   typedef moneypunct_byname<char, true> _Self;
    274   //explicitely defined as private to avoid warnings:
    275   moneypunct_byname(_Self const&);
    276   _Self& operator = (_Self const&);
    277 
    278   _Locale_monetary* _M_monetary;
    279 };
    280 
    281 _STLP_TEMPLATE_NULL
    282 class _STLP_CLASS_DECLSPEC moneypunct_byname<char, false> : public moneypunct<char, false> {
    283   friend class _Locale_impl;
    284 public:
    285   typedef money_base::pattern   pattern;
    286   typedef char                  char_type;
    287   typedef string                string_type;
    288 
    289   explicit moneypunct_byname _STLP_PSPEC2(char, false) (const char * __name, size_t __refs = 0);
    290 
    291 protected:
    292   ~moneypunct_byname _STLP_PSPEC2(char, false) ();
    293   virtual char        do_decimal_point() const;
    294   virtual char        do_thousands_sep() const;
    295   virtual string      do_grouping()      const;
    296 
    297   virtual string_type do_curr_symbol()   const;
    298 
    299   virtual string_type do_positive_sign() const;
    300   virtual string_type do_negative_sign() const;
    301   virtual int         do_frac_digits()   const;
    302 
    303 private:
    304   moneypunct_byname _STLP_PSPEC2(char, false) (_Locale_monetary *__monetary);
    305 
    306   typedef moneypunct_byname<char, false> _Self;
    307   //explicitely defined as private to avoid warnings:
    308   moneypunct_byname(_Self const&);
    309   _Self& operator = (_Self const&);
    310 
    311   _Locale_monetary* _M_monetary;
    312 };
    313 
    314 #if !defined (_STLP_NO_WCHAR_T)
    315 _STLP_TEMPLATE_NULL
    316 class _STLP_CLASS_DECLSPEC moneypunct_byname<wchar_t, true> : public moneypunct<wchar_t, true> {
    317   friend class _Locale_impl;
    318 public:
    319   typedef money_base::pattern   pattern;
    320   typedef wchar_t               char_type;
    321   typedef wstring               string_type;
    322 
    323   explicit moneypunct_byname _STLP_PSPEC2(wchar_t, true) (const char * __name, size_t __refs = 0);
    324 
    325 protected:
    326   ~moneypunct_byname _STLP_PSPEC2(wchar_t, true) ();
    327   virtual wchar_t     do_decimal_point() const;
    328   virtual wchar_t     do_thousands_sep() const;
    329   virtual string      do_grouping()      const;
    330 
    331   virtual string_type do_curr_symbol()   const;
    332 
    333   virtual string_type do_positive_sign() const;
    334   virtual string_type do_negative_sign() const;
    335   virtual int         do_frac_digits()   const;
    336 
    337 private:
    338   moneypunct_byname _STLP_PSPEC2(wchar_t, true) (_Locale_monetary *__monetary);
    339 
    340   typedef moneypunct_byname<wchar_t, true> _Self;
    341   //explicitely defined as private to avoid warnings:
    342   moneypunct_byname(_Self const&);
    343   _Self& operator = (_Self const&);
    344 
    345   _Locale_monetary* _M_monetary;
    346 };
    347 
    348 _STLP_TEMPLATE_NULL
    349 class _STLP_CLASS_DECLSPEC moneypunct_byname<wchar_t, false> : public moneypunct<wchar_t, false> {
    350   friend class _Locale_impl;
    351 public:
    352   typedef money_base::pattern   pattern;
    353   typedef wchar_t               char_type;
    354   typedef wstring               string_type;
    355 
    356   explicit moneypunct_byname _STLP_PSPEC2(wchar_t, false) (const char * __name, size_t __refs = 0);
    357 
    358 protected:
    359   ~moneypunct_byname _STLP_PSPEC2(wchar_t, false) ();
    360   virtual wchar_t     do_decimal_point() const;
    361   virtual wchar_t     do_thousands_sep() const;
    362   virtual string      do_grouping()      const;
    363 
    364   virtual string_type do_curr_symbol()   const;
    365 
    366   virtual string_type do_positive_sign() const;
    367   virtual string_type do_negative_sign() const;
    368   virtual int         do_frac_digits()   const;
    369 
    370 private:
    371   moneypunct_byname _STLP_PSPEC2(wchar_t, false) (_Locale_monetary *__monetary);
    372 
    373   typedef moneypunct_byname<wchar_t, false> _Self;
    374   //explicitely defined as private to avoid warnings:
    375   moneypunct_byname(_Self const&);
    376   _Self& operator = (_Self const&);
    377 
    378   _Locale_monetary* _M_monetary;
    379 };
    380 #endif
    381 
    382 //===== methods ======
    383 
    384 
    385 // money_put facets
    386 
    387 template <class _CharT, class _OutputIter>
    388 class money_put : public locale::facet {
    389 public:
    390   typedef _CharT               char_type;
    391   typedef _OutputIter          iter_type;
    392   typedef basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > string_type;
    393 
    394   explicit money_put(size_t __refs = 0) : locale::facet(__refs) {}
    395   iter_type put(iter_type __s, bool __intl, ios_base& __str,
    396                 char_type  __fill, _STLP_LONGEST_FLOAT_TYPE __units) const
    397     { return do_put(__s, __intl, __str, __fill, __units); }
    398   iter_type put(iter_type __s, bool __intl, ios_base& __str,
    399                 char_type  __fill,
    400                 const string_type& __digits) const
    401     { return do_put(__s, __intl, __str, __fill, __digits); }
    402 
    403   static locale::id id;
    404 
    405 protected:
    406   ~money_put() {}
    407   virtual iter_type do_put(iter_type __s, bool  __intl, ios_base&  __str,
    408                            char_type __fill, _STLP_LONGEST_FLOAT_TYPE __units) const;
    409   virtual iter_type do_put(iter_type __s, bool  __intl, ios_base&  __str,
    410                            char_type __fill,
    411                            const string_type& __digits) const;
    412 };
    413 
    414 #if defined (_STLP_USE_TEMPLATE_EXPORT)
    415 _STLP_EXPORT_TEMPLATE_CLASS money_get<char, istreambuf_iterator<char, char_traits<char> > >;
    416 _STLP_EXPORT_TEMPLATE_CLASS money_put<char, ostreambuf_iterator<char, char_traits<char> > >;
    417 #  if ! defined (_STLP_NO_WCHAR_T)
    418 _STLP_EXPORT_TEMPLATE_CLASS money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
    419 _STLP_EXPORT_TEMPLATE_CLASS money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
    420 #  endif
    421 #endif
    422 
    423 _STLP_END_NAMESPACE
    424 
    425 #if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
    426 #  include <stl/_monetary.c>
    427 #endif
    428 
    429 #endif /* _STLP_INTERNAL_MONETARY_H */
    430 
    431 // Local Variables:
    432 // mode:C++
    433 // End:
    434 
    435 
    436