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