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 #ifndef _STLP_INTERNAL_CTYPE_H
     23 #define _STLP_INTERNAL_CTYPE_H
     24 
     25 #ifndef _STLP_C_LOCALE_H
     26 #  include <stl/c_locale.h>
     27 #endif
     28 
     29 #ifndef _STLP_INTERNAL_LOCALE_H
     30 #  include <stl/_locale.h>
     31 #endif
     32 
     33 #ifndef _STLP_INTERNAL_ALGOBASE_H
     34 #  include <stl/_algobase.h>
     35 #endif
     36 
     37 _STLP_BEGIN_NAMESPACE
     38 
     39 class _STLP_CLASS_DECLSPEC ctype_base {
     40 public:
     41   enum mask {
     42     space   = _Locale_SPACE,
     43     print   = _Locale_PRINT,
     44     cntrl   = _Locale_CNTRL,
     45     upper   = _Locale_UPPER,
     46     lower   = _Locale_LOWER,
     47     alpha   = _Locale_ALPHA,
     48     digit   = _Locale_DIGIT,
     49     punct   = _Locale_PUNCT,
     50     xdigit  = _Locale_XDIGIT,
     51     alnum   = alpha | digit,
     52     graph   = alnum | punct
     53   };
     54 };
     55 
     56 // ctype<> template
     57 
     58 template <class charT> class ctype {};
     59 template <class charT> class ctype_byname {};
     60 
     61 //ctype specializations
     62 
     63 _STLP_TEMPLATE_NULL
     64 class _STLP_CLASS_DECLSPEC ctype<char> : public locale::facet, public ctype_base {
     65 #ifndef _STLP_NO_WCHAR_T
     66 #  ifdef _STLP_MSVC
     67     typedef ctype<wchar_t> _Wctype;
     68     friend _Wctype;
     69 #  else
     70     friend class ctype<wchar_t>;
     71 #  endif
     72 #endif
     73 public:
     74 
     75   typedef char char_type;
     76 
     77   explicit ctype(const mask* __tab = 0, bool __del = false, size_t __refs = 0);
     78   bool is(mask __m, char __c) const
     79   { return ((*(_M_ctype_table+(unsigned char)__c)) & __m) != 0; }
     80 
     81   const char* is(const char* __low, const char* __high, mask* __vec) const {
     82     for (const char* __p = __low;__p != __high; ++__p, ++__vec) {
     83       *__vec = _M_ctype_table[(unsigned char)*__p];
     84     }
     85     return __high;
     86   }
     87 
     88   const char* scan_is(mask __m, const char* __low, const char* __high) const;
     89   const char* scan_not(mask __m, const char* __low, const char* __high) const;
     90 
     91   char        (toupper)(char __c) const { return do_toupper(__c); }
     92   const char* (toupper)(char* __low, const char* __high) const {
     93     return do_toupper(__low, __high);
     94   }
     95 
     96   char        (tolower)(char __c) const { return do_tolower(__c); }
     97   const char* (tolower)(char* __low, const char* __high) const {
     98     return do_tolower(__low, __high);
     99   }
    100 
    101   char        widen(char __c) const { return do_widen(__c); }
    102   const char* widen(const char* __low, const char* __high, char* __to) const {
    103     return do_widen(__low, __high, __to);
    104   }
    105 
    106   char        narrow(char __c, char __dfault) const {
    107     return do_narrow(__c, __dfault);
    108   }
    109   const char* narrow(const char* __low, const char* __high,
    110                      char __dfault, char* __to) const {
    111     return do_narrow(__low, __high, __dfault, __to);
    112   }
    113 
    114   static _STLP_STATIC_DECLSPEC locale::id id;
    115   _STLP_STATIC_CONSTANT(size_t, table_size = 256);
    116 
    117 protected:
    118   const mask* table() const _STLP_NOTHROW { return _M_ctype_table; }
    119   static const mask* _STLP_CALL classic_table() _STLP_NOTHROW;
    120 
    121   ~ctype();
    122 
    123   virtual char        do_toupper(char __c) const;
    124   virtual char        do_tolower(char __c) const;
    125   virtual const char* do_toupper(char* __low, const char* __high) const;
    126   virtual const char* do_tolower(char* __low, const char* __high) const;
    127   virtual char        do_widen(char __c) const;
    128   virtual const char* do_widen(const char* __low, const char* __high,
    129                                char* __to) const;
    130   virtual char        do_narrow(char __c, char /* dfault */ ) const;
    131   virtual const char* do_narrow(const char* __low, const char* __high,
    132                                 char /* dfault */, char* __to) const;
    133 private:
    134   struct _Is_mask {
    135     mask __m;
    136     _Is_mask(mask __x): __m(__x) {}
    137    bool operator()(char __c) {return (__m & (unsigned char) __c) != 0;}
    138   };
    139 
    140 protected:
    141   const mask* _M_ctype_table;
    142 private:
    143   bool _M_delete;
    144 };
    145 
    146 _STLP_TEMPLATE_NULL
    147 class _STLP_CLASS_DECLSPEC ctype_byname<char>: public ctype<char> {
    148   friend class _Locale_impl;
    149 public:
    150   explicit ctype_byname(const char*, size_t = 0);
    151   ~ctype_byname();
    152 
    153   virtual char        do_toupper(char __c) const;
    154   virtual char        do_tolower(char __c) const;
    155 
    156   virtual const char* do_toupper(char*, const char*) const;
    157   virtual const char* do_tolower(char*, const char*) const;
    158 
    159 private:
    160   ctype_byname(_Locale_ctype* __ctype)
    161     : _M_ctype(__ctype)
    162   { _M_init(); }
    163 
    164   void _M_init();
    165 
    166   //explicitely defined as private to avoid warnings:
    167   typedef ctype_byname<char> _Self;
    168   ctype_byname(_Self const&);
    169   _Self& operator = (_Self const&);
    170 
    171   mask _M_byname_table[table_size];
    172   _Locale_ctype* _M_ctype;
    173 };
    174 
    175 #  ifndef _STLP_NO_WCHAR_T
    176 _STLP_TEMPLATE_NULL
    177 class _STLP_CLASS_DECLSPEC ctype<wchar_t> : public locale::facet, public ctype_base {
    178 public:
    179   typedef wchar_t char_type;
    180 
    181   explicit ctype(size_t __refs = 0) : locale::facet(__refs) {}
    182 
    183   bool is(mask __m, wchar_t __c) const
    184     { return do_is(__m, __c); }
    185 
    186   const wchar_t* is(const wchar_t* __low, const wchar_t* __high,
    187                     mask* __vec) const
    188     { return do_is(__low, __high, __vec); }
    189 
    190   const wchar_t* scan_is(mask __m,
    191                          const wchar_t* __low, const wchar_t* __high) const
    192     { return do_scan_is(__m, __low, __high); }
    193 
    194   const wchar_t* scan_not (mask __m,
    195                            const wchar_t* __low, const wchar_t* __high) const
    196     { return do_scan_not(__m, __low, __high); }
    197 
    198   wchar_t (toupper)(wchar_t __c) const { return do_toupper(__c); }
    199   const wchar_t* (toupper)(wchar_t* __low, const wchar_t* __high) const
    200     { return do_toupper(__low, __high); }
    201 
    202   wchar_t (tolower)(wchar_t __c) const { return do_tolower(__c); }
    203   const wchar_t* (tolower)(wchar_t* __low, const wchar_t* __high) const
    204     { return do_tolower(__low, __high); }
    205 
    206   wchar_t widen(char __c) const { return do_widen(__c); }
    207   const char* widen(const char* __low, const char* __high,
    208                     wchar_t* __to) const
    209     { return do_widen(__low, __high, __to); }
    210 
    211   char narrow(wchar_t __c, char __dfault) const
    212     { return do_narrow(__c, __dfault); }
    213   const wchar_t* narrow(const wchar_t* __low, const wchar_t* __high,
    214                         char __dfault, char* __to) const
    215     { return do_narrow(__low, __high, __dfault, __to); }
    216 
    217   static _STLP_STATIC_DECLSPEC locale::id id;
    218 
    219 protected:
    220   ~ctype();
    221 
    222   virtual bool           do_is(mask __m, wchar_t __c) const;
    223   virtual const wchar_t* do_is(const wchar_t*, const wchar_t*, mask*) const;
    224   virtual const wchar_t* do_scan_is(mask,
    225                                     const wchar_t*, const wchar_t*) const;
    226   virtual const wchar_t* do_scan_not(mask,
    227                                      const wchar_t*, const wchar_t*) const;
    228   virtual wchar_t do_toupper(wchar_t __c) const;
    229   virtual const wchar_t* do_toupper(wchar_t*, const wchar_t*) const;
    230   virtual wchar_t do_tolower(wchar_t c) const;
    231   virtual const wchar_t* do_tolower(wchar_t*, const wchar_t*) const;
    232   virtual wchar_t do_widen(char c) const;
    233   virtual const char* do_widen(const char*, const char*, wchar_t*) const;
    234   virtual char  do_narrow(wchar_t __c, char __dfault) const;
    235   virtual const wchar_t* do_narrow(const wchar_t*, const wchar_t*,
    236                                    char, char*) const;
    237 };
    238 
    239 _STLP_TEMPLATE_NULL
    240 class _STLP_CLASS_DECLSPEC ctype_byname<wchar_t>: public ctype<wchar_t> {
    241   friend class _Locale_impl;
    242 public:
    243   explicit ctype_byname(const char* __name, size_t __refs = 0);
    244 
    245 protected:
    246   ~ctype_byname();
    247 
    248   virtual bool           do_is(mask __m, wchar_t __c) const;
    249   virtual const wchar_t* do_is(const wchar_t*, const wchar_t*, mask*) const;
    250   virtual const wchar_t* do_scan_is(mask,
    251                                     const wchar_t*, const wchar_t*) const;
    252   virtual const wchar_t* do_scan_not(mask,
    253                                      const wchar_t*, const wchar_t*) const;
    254   virtual wchar_t do_toupper(wchar_t __c) const;
    255   virtual const wchar_t* do_toupper(wchar_t*, const wchar_t*) const;
    256   virtual wchar_t do_tolower(wchar_t c) const;
    257   virtual const wchar_t* do_tolower(wchar_t*, const wchar_t*) const;
    258 
    259 private:
    260   ctype_byname(_Locale_ctype* __ctype)
    261     : _M_ctype(__ctype) {}
    262 
    263   //explicitely defined as private to avoid warnings:
    264   typedef ctype_byname<wchar_t> _Self;
    265   ctype_byname(_Self const&);
    266   _Self& operator = (_Self const&);
    267 
    268   _Locale_ctype* _M_ctype;
    269 };
    270 
    271 #  endif /* WCHAR_T */
    272 
    273 _STLP_END_NAMESPACE
    274 
    275 #endif /* _STLP_INTERNAL_CTYPE_H */
    276 
    277 // Local Variables:
    278 // mode:C++
    279 // End:
    280 
    281