]> git.tdb.fi Git - libs/core.git/blob - source/stringcodec/utf16.h
Add move semantics to Variant
[libs/core.git] / source / stringcodec / utf16.h
1 #ifndef MSP_STRINGCODEC_UTF16_H_
2 #define MSP_STRINGCODEC_UTF16_H_
3
4 #include <msp/core/mspcore_api.h>
5 #include "codec.h"
6
7 namespace Msp {
8 namespace StringCodec {
9
10 /**
11 The UTF-16 codec, as specified in the Unicode standard.  Both little and big
12 endian are supported, as well as autodetection with the BOM.  In the absence
13 of a BOM, big endian is assumed.
14 */
15 class MSPCORE_API Utf16: public StandardCodec<Utf16>
16 {
17 public:
18         enum Endian
19         {
20                 AUTO,
21                 BIG,
22                 LITTLE
23         };
24
25         class MSPCORE_API Encoder: public Codec::Encoder
26         {
27         private:
28                 Endian endian = BIG;
29                 bool emit_bom = true;
30
31         public:
32                 Encoder(ErrorMode em = DEFAULT, Endian en = BIG);
33
34                 void encode_char(unichar, std::string &) override;
35         private:
36                 void transliterate(unichar, std::string &) override;
37         };
38
39         class MSPCORE_API Decoder: public Codec::Decoder
40         {
41         private:
42                 Endian endian = AUTO;
43
44         public:
45                 Decoder(ErrorMode em = DEFAULT, Endian en = AUTO);
46
47                 unichar decode_char(const std::string &, std::string::const_iterator &) override;
48         private:
49                 unichar decode_unit(const std::string &, const std::string::const_iterator &, std::string::const_iterator &);
50         };
51
52 private:
53         Endian endian = AUTO;
54
55 public:
56         Utf16(ErrorMode em = DEFAULT, Endian en = AUTO):
57                 StandardCodec<Utf16>(em),
58                 endian(en)
59         { }
60
61         const char *get_name() const override
62         { return endian==BIG ? "UTF-16-BE" : endian==LITTLE ? "UTF-16-LE" : "UTF-16"; }
63
64         Encoder *create_encoder(ErrorMode em = DEFAULT) const override
65         { return new Encoder(get_error_mode(em), endian); }
66
67         Decoder *create_decoder(ErrorMode em = DEFAULT) const override
68         { return new Decoder(get_error_mode(em), endian); }
69 };
70
71
72 /**
73 A helper template to define the Utf16Be and Utf16Le types.
74 */
75 template<Utf16::Endian en>
76 class Utf16E: public Utf16
77 {
78 public:
79         class Encoder: public Utf16::Encoder
80         {
81         public:
82                 Encoder(ErrorMode em = DEFAULT): Utf16::Encoder(em, en) { }
83         };
84
85         class Decoder: public Utf16::Decoder
86         {
87         public:
88                 Decoder(ErrorMode em = DEFAULT): Utf16::Decoder(em, en) { }
89         };
90
91         Utf16E(ErrorMode em = DEFAULT): Utf16(em, en) { }
92 };
93
94 typedef Utf16E<Utf16::BIG> Utf16Be;
95 typedef Utf16E<Utf16::LITTLE> Utf16Le;
96
97 } // namespace StringCodec
98 } // namespace Msp
99
100 #endif