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_NUM_GET_H
     24 #define _STLP_INTERNAL_NUM_GET_H
     25 
     26 #ifndef _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H
     27 #  include <stl/_istreambuf_iterator.h>
     28 #endif
     29 
     30 #ifndef _STLP_C_LOCALE_H
     31 #  include <stl/c_locale.h>
     32 #endif
     33 
     34 #ifndef _STLP_INTERNAL_NUMPUNCT_H
     35 #  include <stl/_numpunct.h>
     36 #endif
     37 
     38 #ifndef _STLP_INTERNAL_CTYPE_H
     39 #  include <stl/_ctype.h>
     40 #endif
     41 
     42 #ifndef _STLP_INTERNAL_IOSTREAM_STRING_H
     43 #  include <stl/_iostream_string.h>
     44 #endif
     45 
     46 #ifndef _STLP_FACETS_FWD_H
     47 #  include <stl/_facets_fwd.h>
     48 #endif
     49 
     50 _STLP_BEGIN_NAMESPACE
     51 
     52 //----------------------------------------------------------------------
     53 // num_get facets
     54 
     55 template <class _CharT, class _InputIter>
     56 class num_get: public locale::facet {
     57 public:
     58   typedef _CharT     char_type;
     59   typedef _InputIter iter_type;
     60 
     61   explicit num_get(size_t __refs = 0): locale::facet(__refs) {}
     62 
     63 #if !defined (_STLP_NO_BOOL)
     64   _InputIter get(_InputIter __ii, _InputIter __end, ios_base& __str,
     65                  ios_base::iostate& __err, bool& __val) const
     66   { return do_get(__ii, __end, __str, __err, __val); }
     67 #endif
     68 
     69 #if defined (_STLP_FIX_LIBRARY_ISSUES)
     70   _InputIter get(_InputIter __ii, _InputIter __end, ios_base& __str,
     71                  ios_base::iostate& __err, short& __val) const
     72   { return do_get(__ii, __end, __str, __err, __val); }
     73 
     74   _InputIter get(_InputIter __ii, _InputIter __end, ios_base& __str,
     75                  ios_base::iostate& __err, int& __val) const
     76   { return do_get(__ii, __end, __str, __err, __val); }
     77 #endif
     78 
     79   _InputIter get(_InputIter __ii, _InputIter __end, ios_base& __str,
     80                  ios_base::iostate& __err, long& __val) const
     81   { return do_get(__ii, __end, __str, __err, __val); }
     82 
     83   _InputIter get(_InputIter __ii, _InputIter __end, ios_base& __str,
     84                  ios_base::iostate& __err, unsigned short& __val) const
     85   { return do_get(__ii, __end, __str, __err, __val); }
     86 
     87   _InputIter get(_InputIter __ii, _InputIter __end, ios_base& __str,
     88                  ios_base::iostate& __err, unsigned int& __val) const
     89   { return do_get(__ii, __end, __str, __err, __val); }
     90 
     91   _InputIter get(_InputIter __ii, _InputIter __end, ios_base& __str,
     92                  ios_base::iostate& __err, unsigned long& __val) const
     93   { return do_get(__ii, __end, __str, __err, __val); }
     94 
     95 #if defined (_STLP_LONG_LONG)
     96   _InputIter get(_InputIter __ii, _InputIter __end, ios_base& __str,
     97                  ios_base::iostate& __err, _STLP_LONG_LONG& __val) const
     98   { return do_get(__ii, __end, __str, __err, __val); }
     99 
    100   _InputIter get(_InputIter __ii, _InputIter __end, ios_base& __str,
    101                  ios_base::iostate& __err, unsigned _STLP_LONG_LONG& __val) const
    102   { return do_get(__ii, __end, __str, __err, __val); }
    103 #endif /* _STLP_LONG_LONG */
    104 
    105   _InputIter get(_InputIter __ii, _InputIter __end, ios_base& __str,
    106                  ios_base::iostate& __err, float& __val) const
    107   { return do_get(__ii, __end, __str, __err, __val); }
    108 
    109   _InputIter get(_InputIter __ii, _InputIter __end, ios_base& __str,
    110                  ios_base::iostate& __err, double& __val) const
    111   { return do_get(__ii, __end, __str, __err, __val); }
    112 
    113 #if !defined (_STLP_NO_LONG_DOUBLE)
    114   _InputIter get(_InputIter __ii, _InputIter __end, ios_base& __str,
    115                  ios_base::iostate& __err, long double& __val) const
    116   { return do_get(__ii, __end, __str, __err, __val); }
    117 # endif
    118 
    119   _InputIter get(_InputIter __ii, _InputIter __end, ios_base& __str,
    120                  ios_base::iostate& __err, void*& __val) const
    121   { return do_get(__ii, __end, __str, __err, __val); }
    122 
    123   static locale::id id;
    124 
    125 protected:
    126   ~num_get() {}
    127 
    128   typedef string               string_type;
    129   typedef ctype<_CharT>        _Ctype;
    130   typedef numpunct<_CharT>     _Numpunct;
    131 
    132 #if !defined (_STLP_NO_BOOL)
    133   virtual _InputIter do_get(_InputIter __ii, _InputIter __end, ios_base& __str,
    134                             ios_base::iostate& __err, bool& __val) const;
    135 #endif
    136 
    137   virtual _InputIter do_get(_InputIter __ii, _InputIter __end, ios_base& __str,
    138                             ios_base::iostate& __err, long& __val) const;
    139   virtual _InputIter do_get(_InputIter __ii, _InputIter __end, ios_base& __str,
    140                             ios_base::iostate& __err, unsigned short& __val) const;
    141   virtual _InputIter do_get(_InputIter __ii, _InputIter __end, ios_base& __str,
    142                             ios_base::iostate& __err, unsigned int& __val) const;
    143   virtual _InputIter do_get(_InputIter __ii, _InputIter __end, ios_base& __str,
    144                             ios_base::iostate& __err, unsigned long& __val) const;
    145 
    146 #if defined (_STLP_FIX_LIBRARY_ISSUES)
    147   // issue 118 : those are actually not supposed to be here
    148   virtual _InputIter do_get(_InputIter __ii, _InputIter __end, ios_base& __str,
    149                             ios_base::iostate& __err, short& __val) const;
    150   virtual _InputIter do_get(_InputIter __ii, _InputIter __end, ios_base& __str,
    151                             ios_base::iostate& __err, int& __val) const;
    152 #endif
    153 
    154   virtual _InputIter do_get(_InputIter __ii, _InputIter __end, ios_base& __str,
    155                             ios_base::iostate& __err, float& __val) const;
    156   virtual _InputIter do_get(_InputIter __ii, _InputIter __end, ios_base& __str,
    157                             ios_base::iostate& __err, double& __val) const;
    158   virtual _InputIter do_get(_InputIter __ii, _InputIter __end, ios_base& __str,
    159                             ios_base::iostate& __err, void*& __p) const;
    160 
    161 #if !defined (_STLP_NO_LONG_DOUBLE)
    162   virtual _InputIter do_get(_InputIter __ii, _InputIter __end, ios_base& __str,
    163                             ios_base::iostate& __err, long double& __val) const;
    164 #endif
    165 
    166 #if defined (_STLP_LONG_LONG)
    167   virtual _InputIter do_get(_InputIter __ii, _InputIter __end, ios_base& __str,
    168                             ios_base::iostate& __err, _STLP_LONG_LONG& __val) const;
    169   virtual _InputIter do_get(_InputIter __ii, _InputIter __end, ios_base& __str,
    170                             ios_base::iostate& __err, unsigned _STLP_LONG_LONG& __val) const;
    171 #endif
    172 
    173 };
    174 
    175 
    176 #if defined (_STLP_USE_TEMPLATE_EXPORT)
    177 _STLP_EXPORT_TEMPLATE_CLASS num_get<char, istreambuf_iterator<char, char_traits<char> > >;
    178 // _STLP_EXPORT_TEMPLATE_CLASS num_get<char, const char*>;
    179 #  if !defined (_STLP_NO_WCHAR_T)
    180 _STLP_EXPORT_TEMPLATE_CLASS num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
    181 // _STLP_EXPORT_TEMPLATE_CLASS num_get<wchar_t, const wchar_t*>;
    182 #  endif
    183 #endif
    184 
    185 #if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
    186 
    187 _STLP_MOVE_TO_PRIV_NAMESPACE
    188 
    189 _STLP_DECLSPEC bool _STLP_CALL __valid_grouping(const char*, const char*, const char*, const char*);
    190 
    191 template <class _InputIter, class _Integer, class _CharT>
    192 bool _STLP_CALL
    193 __get_decimal_integer(_InputIter& __first, _InputIter& __last, _Integer& __val, _CharT*);
    194 
    195 #  if !defined (_STLP_NO_WCHAR_T)
    196 bool _STLP_DECLSPEC _STLP_CALL __get_fdigit(wchar_t&, const wchar_t*);
    197 bool _STLP_DECLSPEC _STLP_CALL __get_fdigit_or_sep(wchar_t&, wchar_t, const wchar_t*);
    198 #  endif
    199 
    200 inline void  _STLP_CALL
    201 _Initialize_get_float(const ctype<char>&,
    202                        char& Plus, char& Minus,
    203                        char& pow_e, char& pow_E,
    204                        char*) {
    205   Plus = '+';
    206   Minus = '-';
    207   pow_e = 'e';
    208   pow_E = 'E';
    209 }
    210 
    211 #  if !defined (_STLP_NO_WCHAR_T)
    212 void _STLP_DECLSPEC _STLP_CALL _Initialize_get_float(const ctype<wchar_t>&,
    213                                                      wchar_t&, wchar_t&, wchar_t&, wchar_t&, wchar_t*);
    214 #  endif
    215 void _STLP_DECLSPEC _STLP_CALL __string_to_float(const __iostring&, float&);
    216 void _STLP_DECLSPEC _STLP_CALL __string_to_float(const __iostring&, double&);
    217 #  if !defined (_STLP_NO_LONG_DOUBLE)
    218 void _STLP_DECLSPEC _STLP_CALL __string_to_float(const __iostring&, long double&);
    219 #  endif
    220 
    221 _STLP_MOVE_TO_STD_NAMESPACE
    222 
    223 #endif /* _STLP_EXPOSE_STREAM_IMPLEMENTATION */
    224 
    225 
    226 _STLP_END_NAMESPACE
    227 
    228 #if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
    229 #  include <stl/_num_get.c>
    230 #endif
    231 
    232 #endif /* _STLP_INTERNAL_NUM_GET_H */
    233 
    234 // Local Variables:
    235 // mode:C++
    236 // End:
    237 
    238