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