Home | History | Annotate | Download | only in include
      1 // -*- C++ -*-
      2 //===-------------------------- codecvt -----------------------------------===//
      3 //
      4 //                     The LLVM Compiler Infrastructure
      5 //
      6 // This file is dual licensed under the MIT and the University of Illinois Open
      7 // Source Licenses. See LICENSE.TXT for details.
      8 //
      9 //===----------------------------------------------------------------------===//
     10 
     11 #ifndef _LIBCPP_CODECVT
     12 #define _LIBCPP_CODECVT
     13 
     14 /*
     15     codecvt synopsis
     16 
     17 namespace std
     18 {
     19 
     20 enum codecvt_mode
     21 {
     22     consume_header = 4,
     23     generate_header = 2,
     24     little_endian = 1
     25 };
     26 
     27 template <class Elem, unsigned long Maxcode = 0x10ffff,
     28           codecvt_mode Mode = (codecvt_mode)0>
     29 class codecvt_utf8
     30     : public codecvt<Elem, char, mbstate_t>
     31 {
     32     // unspecified
     33 };
     34 
     35 template <class Elem, unsigned long Maxcode = 0x10ffff,
     36           codecvt_mode Mode = (codecvt_mode)0>
     37 class codecvt_utf16
     38     : public codecvt<Elem, char, mbstate_t>
     39 {
     40     // unspecified
     41 };
     42 
     43 template <class Elem, unsigned long Maxcode = 0x10ffff,
     44           codecvt_mode Mode = (codecvt_mode)0>
     45 class codecvt_utf8_utf16
     46     : public codecvt<Elem, char, mbstate_t>
     47 {
     48     // unspecified
     49 };
     50 
     51 }  // std
     52 
     53 */
     54 
     55 #include <__config>
     56 #include <__locale>
     57 
     58 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
     59 #pragma GCC system_header
     60 #endif
     61 
     62 _LIBCPP_BEGIN_NAMESPACE_STD
     63 
     64 enum codecvt_mode
     65 {
     66     consume_header = 4,
     67     generate_header = 2,
     68     little_endian = 1
     69 };
     70 
     71 // codecvt_utf8
     72 
     73 template <class _Elem> class __codecvt_utf8;
     74 
     75 template <>
     76 class __codecvt_utf8<wchar_t>
     77     : public codecvt<wchar_t, char, mbstate_t>
     78 {
     79     unsigned long _Maxcode_;
     80     codecvt_mode _Mode_;
     81 public:
     82     typedef wchar_t   intern_type;
     83     typedef char      extern_type;
     84     typedef mbstate_t state_type;
     85 
     86     _LIBCPP_ALWAYS_INLINE
     87     explicit __codecvt_utf8(size_t __refs, unsigned long _Maxcode,
     88                             codecvt_mode _Mode)
     89         : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
     90           _Mode_(_Mode) {}
     91 protected:
     92     virtual result
     93         do_out(state_type& __st,
     94                const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
     95                extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
     96     virtual result
     97         do_in(state_type& __st,
     98               const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
     99               intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    100     virtual result
    101         do_unshift(state_type& __st,
    102                    extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    103     virtual int do_encoding() const throw();
    104     virtual bool do_always_noconv() const throw();
    105     virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
    106                           size_t __mx) const;
    107     virtual int do_max_length() const throw();
    108 };
    109 
    110 template <>
    111 class __codecvt_utf8<char16_t>
    112     : public codecvt<char16_t, char, mbstate_t>
    113 {
    114     unsigned long _Maxcode_;
    115     codecvt_mode _Mode_;
    116 public:
    117     typedef char16_t  intern_type;
    118     typedef char      extern_type;
    119     typedef mbstate_t state_type;
    120 
    121     _LIBCPP_ALWAYS_INLINE
    122     explicit __codecvt_utf8(size_t __refs, unsigned long _Maxcode,
    123                             codecvt_mode _Mode)
    124         : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
    125           _Mode_(_Mode) {}
    126 protected:
    127     virtual result
    128         do_out(state_type& __st,
    129                const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
    130                extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    131     virtual result
    132         do_in(state_type& __st,
    133               const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
    134               intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    135     virtual result
    136         do_unshift(state_type& __st,
    137                    extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    138     virtual int do_encoding() const throw();
    139     virtual bool do_always_noconv() const throw();
    140     virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
    141                           size_t __mx) const;
    142     virtual int do_max_length() const throw();
    143 };
    144 
    145 template <>
    146 class __codecvt_utf8<char32_t>
    147     : public codecvt<char32_t, char, mbstate_t>
    148 {
    149     unsigned long _Maxcode_;
    150     codecvt_mode _Mode_;
    151 public:
    152     typedef char32_t  intern_type;
    153     typedef char      extern_type;
    154     typedef mbstate_t state_type;
    155 
    156     _LIBCPP_ALWAYS_INLINE
    157     explicit __codecvt_utf8(size_t __refs, unsigned long _Maxcode,
    158                             codecvt_mode _Mode)
    159         : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
    160           _Mode_(_Mode) {}
    161 protected:
    162     virtual result
    163         do_out(state_type& __st,
    164                const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
    165                extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    166     virtual result
    167         do_in(state_type& __st,
    168               const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
    169               intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    170     virtual result
    171         do_unshift(state_type& __st,
    172                    extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    173     virtual int do_encoding() const throw();
    174     virtual bool do_always_noconv() const throw();
    175     virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
    176                           size_t __mx) const;
    177     virtual int do_max_length() const throw();
    178 };
    179 
    180 template <class _Elem, unsigned long _Maxcode = 0x10ffff,
    181           codecvt_mode _Mode = (codecvt_mode)0>
    182 class _LIBCPP_VISIBLE codecvt_utf8
    183     : public __codecvt_utf8<_Elem>
    184 {
    185 public:
    186     _LIBCPP_ALWAYS_INLINE
    187     explicit codecvt_utf8(size_t __refs = 0)
    188         : __codecvt_utf8<_Elem>(__refs, _Maxcode, _Mode) {}
    189 
    190     _LIBCPP_ALWAYS_INLINE
    191     ~codecvt_utf8() {}
    192 };
    193 
    194 // codecvt_utf16
    195 
    196 template <class _Elem, bool _LittleEndian> class __codecvt_utf16;
    197 
    198 template <>
    199 class __codecvt_utf16<wchar_t, false>
    200     : public codecvt<wchar_t, char, mbstate_t>
    201 {
    202     unsigned long _Maxcode_;
    203     codecvt_mode _Mode_;
    204 public:
    205     typedef wchar_t   intern_type;
    206     typedef char      extern_type;
    207     typedef mbstate_t state_type;
    208 
    209     _LIBCPP_ALWAYS_INLINE
    210     explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode,
    211                             codecvt_mode _Mode)
    212         : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
    213           _Mode_(_Mode) {}
    214 protected:
    215     virtual result
    216         do_out(state_type& __st,
    217                const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
    218                extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    219     virtual result
    220         do_in(state_type& __st,
    221               const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
    222               intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    223     virtual result
    224         do_unshift(state_type& __st,
    225                    extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    226     virtual int do_encoding() const throw();
    227     virtual bool do_always_noconv() const throw();
    228     virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
    229                           size_t __mx) const;
    230     virtual int do_max_length() const throw();
    231 };
    232 
    233 template <>
    234 class __codecvt_utf16<wchar_t, true>
    235     : public codecvt<wchar_t, char, mbstate_t>
    236 {
    237     unsigned long _Maxcode_;
    238     codecvt_mode _Mode_;
    239 public:
    240     typedef wchar_t   intern_type;
    241     typedef char      extern_type;
    242     typedef mbstate_t state_type;
    243 
    244     _LIBCPP_ALWAYS_INLINE
    245     explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode,
    246                             codecvt_mode _Mode)
    247         : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
    248           _Mode_(_Mode) {}
    249 protected:
    250     virtual result
    251         do_out(state_type& __st,
    252                const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
    253                extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    254     virtual result
    255         do_in(state_type& __st,
    256               const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
    257               intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    258     virtual result
    259         do_unshift(state_type& __st,
    260                    extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    261     virtual int do_encoding() const throw();
    262     virtual bool do_always_noconv() const throw();
    263     virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
    264                           size_t __mx) const;
    265     virtual int do_max_length() const throw();
    266 };
    267 
    268 template <>
    269 class __codecvt_utf16<char16_t, false>
    270     : public codecvt<char16_t, char, mbstate_t>
    271 {
    272     unsigned long _Maxcode_;
    273     codecvt_mode _Mode_;
    274 public:
    275     typedef char16_t  intern_type;
    276     typedef char      extern_type;
    277     typedef mbstate_t state_type;
    278 
    279     _LIBCPP_ALWAYS_INLINE
    280     explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode,
    281                             codecvt_mode _Mode)
    282         : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
    283           _Mode_(_Mode) {}
    284 protected:
    285     virtual result
    286         do_out(state_type& __st,
    287                const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
    288                extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    289     virtual result
    290         do_in(state_type& __st,
    291               const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
    292               intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    293     virtual result
    294         do_unshift(state_type& __st,
    295                    extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    296     virtual int do_encoding() const throw();
    297     virtual bool do_always_noconv() const throw();
    298     virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
    299                           size_t __mx) const;
    300     virtual int do_max_length() const throw();
    301 };
    302 
    303 template <>
    304 class __codecvt_utf16<char16_t, true>
    305     : public codecvt<char16_t, char, mbstate_t>
    306 {
    307     unsigned long _Maxcode_;
    308     codecvt_mode _Mode_;
    309 public:
    310     typedef char16_t  intern_type;
    311     typedef char      extern_type;
    312     typedef mbstate_t state_type;
    313 
    314     _LIBCPP_ALWAYS_INLINE
    315     explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode,
    316                             codecvt_mode _Mode)
    317         : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
    318           _Mode_(_Mode) {}
    319 protected:
    320     virtual result
    321         do_out(state_type& __st,
    322                const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
    323                extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    324     virtual result
    325         do_in(state_type& __st,
    326               const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
    327               intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    328     virtual result
    329         do_unshift(state_type& __st,
    330                    extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    331     virtual int do_encoding() const throw();
    332     virtual bool do_always_noconv() const throw();
    333     virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
    334                           size_t __mx) const;
    335     virtual int do_max_length() const throw();
    336 };
    337 
    338 template <>
    339 class __codecvt_utf16<char32_t, false>
    340     : public codecvt<char32_t, char, mbstate_t>
    341 {
    342     unsigned long _Maxcode_;
    343     codecvt_mode _Mode_;
    344 public:
    345     typedef char32_t  intern_type;
    346     typedef char      extern_type;
    347     typedef mbstate_t state_type;
    348 
    349     _LIBCPP_ALWAYS_INLINE
    350     explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode,
    351                             codecvt_mode _Mode)
    352         : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
    353           _Mode_(_Mode) {}
    354 protected:
    355     virtual result
    356         do_out(state_type& __st,
    357                const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
    358                extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    359     virtual result
    360         do_in(state_type& __st,
    361               const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
    362               intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    363     virtual result
    364         do_unshift(state_type& __st,
    365                    extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    366     virtual int do_encoding() const throw();
    367     virtual bool do_always_noconv() const throw();
    368     virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
    369                           size_t __mx) const;
    370     virtual int do_max_length() const throw();
    371 };
    372 
    373 template <>
    374 class __codecvt_utf16<char32_t, true>
    375     : public codecvt<char32_t, char, mbstate_t>
    376 {
    377     unsigned long _Maxcode_;
    378     codecvt_mode _Mode_;
    379 public:
    380     typedef char32_t  intern_type;
    381     typedef char      extern_type;
    382     typedef mbstate_t state_type;
    383 
    384     _LIBCPP_ALWAYS_INLINE
    385     explicit __codecvt_utf16(size_t __refs, unsigned long _Maxcode,
    386                             codecvt_mode _Mode)
    387         : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
    388           _Mode_(_Mode) {}
    389 protected:
    390     virtual result
    391         do_out(state_type& __st,
    392                const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
    393                extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    394     virtual result
    395         do_in(state_type& __st,
    396               const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
    397               intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    398     virtual result
    399         do_unshift(state_type& __st,
    400                    extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    401     virtual int do_encoding() const throw();
    402     virtual bool do_always_noconv() const throw();
    403     virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
    404                           size_t __mx) const;
    405     virtual int do_max_length() const throw();
    406 };
    407 
    408 template <class _Elem, unsigned long _Maxcode = 0x10ffff,
    409           codecvt_mode _Mode = (codecvt_mode)0>
    410 class _LIBCPP_VISIBLE codecvt_utf16
    411     : public __codecvt_utf16<_Elem, _Mode & little_endian>
    412 {
    413 public:
    414     _LIBCPP_ALWAYS_INLINE
    415     explicit codecvt_utf16(size_t __refs = 0)
    416         : __codecvt_utf16<_Elem, _Mode & little_endian>(__refs, _Maxcode, _Mode) {}
    417 
    418     _LIBCPP_ALWAYS_INLINE
    419     ~codecvt_utf16() {}
    420 };
    421 
    422 // codecvt_utf8_utf16
    423 
    424 template <class _Elem> class __codecvt_utf8_utf16;
    425 
    426 template <>
    427 class __codecvt_utf8_utf16<wchar_t>
    428     : public codecvt<wchar_t, char, mbstate_t>
    429 {
    430     unsigned long _Maxcode_;
    431     codecvt_mode _Mode_;
    432 public:
    433     typedef wchar_t   intern_type;
    434     typedef char      extern_type;
    435     typedef mbstate_t state_type;
    436 
    437     _LIBCPP_ALWAYS_INLINE
    438     explicit __codecvt_utf8_utf16(size_t __refs, unsigned long _Maxcode,
    439                             codecvt_mode _Mode)
    440         : codecvt<wchar_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
    441           _Mode_(_Mode) {}
    442 protected:
    443     virtual result
    444         do_out(state_type& __st,
    445                const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
    446                extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    447     virtual result
    448         do_in(state_type& __st,
    449               const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
    450               intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    451     virtual result
    452         do_unshift(state_type& __st,
    453                    extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    454     virtual int do_encoding() const throw();
    455     virtual bool do_always_noconv() const throw();
    456     virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
    457                           size_t __mx) const;
    458     virtual int do_max_length() const throw();
    459 };
    460 
    461 template <>
    462 class __codecvt_utf8_utf16<char32_t>
    463     : public codecvt<char32_t, char, mbstate_t>
    464 {
    465     unsigned long _Maxcode_;
    466     codecvt_mode _Mode_;
    467 public:
    468     typedef char32_t  intern_type;
    469     typedef char      extern_type;
    470     typedef mbstate_t state_type;
    471 
    472     _LIBCPP_ALWAYS_INLINE
    473     explicit __codecvt_utf8_utf16(size_t __refs, unsigned long _Maxcode,
    474                             codecvt_mode _Mode)
    475         : codecvt<char32_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
    476           _Mode_(_Mode) {}
    477 protected:
    478     virtual result
    479         do_out(state_type& __st,
    480                const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
    481                extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    482     virtual result
    483         do_in(state_type& __st,
    484               const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
    485               intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    486     virtual result
    487         do_unshift(state_type& __st,
    488                    extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    489     virtual int do_encoding() const throw();
    490     virtual bool do_always_noconv() const throw();
    491     virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
    492                           size_t __mx) const;
    493     virtual int do_max_length() const throw();
    494 };
    495 
    496 template <>
    497 class __codecvt_utf8_utf16<char16_t>
    498     : public codecvt<char16_t, char, mbstate_t>
    499 {
    500     unsigned long _Maxcode_;
    501     codecvt_mode _Mode_;
    502 public:
    503     typedef char16_t  intern_type;
    504     typedef char      extern_type;
    505     typedef mbstate_t state_type;
    506 
    507     _LIBCPP_ALWAYS_INLINE
    508     explicit __codecvt_utf8_utf16(size_t __refs, unsigned long _Maxcode,
    509                             codecvt_mode _Mode)
    510         : codecvt<char16_t, char, mbstate_t>(__refs), _Maxcode_(_Maxcode),
    511           _Mode_(_Mode) {}
    512 protected:
    513     virtual result
    514         do_out(state_type& __st,
    515                const intern_type* __frm, const intern_type* __frm_end, const intern_type*& __frm_nxt,
    516                extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    517     virtual result
    518         do_in(state_type& __st,
    519               const extern_type* __frm, const extern_type* __frm_end, const extern_type*& __frm_nxt,
    520               intern_type* __to, intern_type* __to_end, intern_type*& __to_nxt) const;
    521     virtual result
    522         do_unshift(state_type& __st,
    523                    extern_type* __to, extern_type* __to_end, extern_type*& __to_nxt) const;
    524     virtual int do_encoding() const throw();
    525     virtual bool do_always_noconv() const throw();
    526     virtual int do_length(state_type&, const extern_type* __frm, const extern_type* __end,
    527                           size_t __mx) const;
    528     virtual int do_max_length() const throw();
    529 };
    530 
    531 template <class _Elem, unsigned long _Maxcode = 0x10ffff,
    532           codecvt_mode _Mode = (codecvt_mode)0>
    533 class _LIBCPP_VISIBLE codecvt_utf8_utf16
    534     : public __codecvt_utf8_utf16<_Elem>
    535 {
    536 public:
    537     _LIBCPP_ALWAYS_INLINE
    538     explicit codecvt_utf8_utf16(size_t __refs = 0)
    539         : __codecvt_utf8_utf16<_Elem>(__refs, _Maxcode, _Mode) {}
    540 
    541     _LIBCPP_ALWAYS_INLINE
    542     ~codecvt_utf8_utf16() {}
    543 };
    544 
    545 _LIBCPP_END_NAMESPACE_STD
    546 
    547 #endif  // _LIBCPP_CODECVT
    548