34 #ifndef _CHAR_TRAITS_H 35 #define _CHAR_TRAITS_H 1 37 #pragma GCC system_header 43 #ifndef _GLIBCXX_ALWAYS_INLINE 44 #define _GLIBCXX_ALWAYS_INLINE inline __attribute__((__always_inline__)) 47 namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
49 _GLIBCXX_BEGIN_NAMESPACE_VERSION
61 template<
typename _CharT>
64 typedef unsigned long int_type;
67 typedef std::mbstate_t state_type;
86 template<
typename _CharT>
89 typedef _CharT char_type;
90 typedef typename _Char_types<_CharT>::int_type int_type;
92 typedef typename _Char_types<_CharT>::off_type off_type;
93 typedef typename _Char_types<_CharT>::state_type state_type;
95 static _GLIBCXX14_CONSTEXPR
void 96 assign(char_type& __c1,
const char_type& __c2)
99 static _GLIBCXX_CONSTEXPR
bool 100 eq(
const char_type& __c1,
const char_type& __c2)
101 {
return __c1 == __c2; }
103 static _GLIBCXX_CONSTEXPR
bool 104 lt(
const char_type& __c1,
const char_type& __c2)
105 {
return __c1 < __c2; }
107 static _GLIBCXX14_CONSTEXPR
int 108 compare(
const char_type* __s1,
const char_type* __s2, std::size_t __n);
110 static _GLIBCXX14_CONSTEXPR std::size_t
111 length(
const char_type* __s);
113 static _GLIBCXX14_CONSTEXPR
const char_type*
114 find(
const char_type* __s, std::size_t __n,
const char_type& __a);
117 move(char_type* __s1,
const char_type* __s2, std::size_t __n);
120 copy(char_type* __s1,
const char_type* __s2, std::size_t __n);
123 assign(char_type* __s, std::size_t __n, char_type __a);
125 static _GLIBCXX_CONSTEXPR char_type
126 to_char_type(
const int_type& __c)
127 {
return static_cast<char_type
>(__c); }
129 static _GLIBCXX_CONSTEXPR int_type
130 to_int_type(
const char_type& __c)
131 {
return static_cast<int_type
>(__c); }
133 static _GLIBCXX_CONSTEXPR
bool 134 eq_int_type(
const int_type& __c1,
const int_type& __c2)
135 {
return __c1 == __c2; }
137 static _GLIBCXX_CONSTEXPR int_type
139 {
return static_cast<int_type
>(_GLIBCXX_STDIO_EOF); }
141 static _GLIBCXX_CONSTEXPR int_type
142 not_eof(
const int_type& __c)
143 {
return !eq_int_type(__c, eof()) ? __c : to_int_type(char_type()); }
146 #define __cpp_lib_constexpr_char_traits 201611 148 template<
typename _CharT>
149 _GLIBCXX14_CONSTEXPR
int 151 compare(
const char_type* __s1,
const char_type* __s2, std::size_t __n)
153 for (std::size_t __i = 0; __i < __n; ++__i)
154 if (lt(__s1[__i], __s2[__i]))
156 else if (lt(__s2[__i], __s1[__i]))
161 template<
typename _CharT>
162 _GLIBCXX14_CONSTEXPR std::size_t
164 length(
const char_type* __p)
167 while (!eq(__p[__i], char_type()))
172 template<
typename _CharT>
173 _GLIBCXX14_CONSTEXPR
const typename char_traits<_CharT>::char_type*
175 find(
const char_type* __s, std::size_t __n,
const char_type& __a)
177 for (std::size_t __i = 0; __i < __n; ++__i)
178 if (eq(__s[__i], __a))
183 template<
typename _CharT>
184 typename char_traits<_CharT>::char_type*
186 move(char_type* __s1,
const char_type* __s2, std::size_t __n)
188 return static_cast<_CharT*
>(__builtin_memmove(__s1, __s2,
189 __n *
sizeof(char_type)));
192 template<
typename _CharT>
193 typename char_traits<_CharT>::char_type*
195 copy(char_type* __s1,
const char_type* __s2, std::size_t __n)
198 std::copy(__s2, __s2 + __n, __s1);
202 template<
typename _CharT>
203 typename char_traits<_CharT>::char_type*
205 assign(char_type* __s, std::size_t __n, char_type __a)
208 std::fill_n(__s, __n, __a);
212 _GLIBCXX_END_NAMESPACE_VERSION
215 namespace std _GLIBCXX_VISIBILITY(default)
217 _GLIBCXX_BEGIN_NAMESPACE_VERSION
219 #if __cplusplus > 201402 227 template<
typename _CharT>
228 static _GLIBCXX_ALWAYS_INLINE constexpr
bool 229 __constant_string_p(
const _CharT* __s)
231 while (__builtin_constant_p(*__s) && *__s)
233 return __builtin_constant_p(*__s);
244 template<
typename _CharT>
245 static _GLIBCXX_ALWAYS_INLINE constexpr
bool 246 __constant_char_array_p(
const _CharT* __a,
size_t __n)
249 while (__builtin_constant_p(__a[__i]) && __i < __n)
268 template<
class _CharT>
277 typedef char char_type;
278 typedef int int_type;
281 typedef mbstate_t state_type;
283 static _GLIBCXX17_CONSTEXPR
void 284 assign(char_type& __c1,
const char_type& __c2) _GLIBCXX_NOEXCEPT
287 static _GLIBCXX_CONSTEXPR
bool 288 eq(
const char_type& __c1,
const char_type& __c2) _GLIBCXX_NOEXCEPT
289 {
return __c1 == __c2; }
291 static _GLIBCXX_CONSTEXPR
bool 292 lt(
const char_type& __c1,
const char_type& __c2) _GLIBCXX_NOEXCEPT
295 return (static_cast<unsigned char>(__c1)
296 < static_cast<unsigned char>(__c2));
299 static _GLIBCXX17_CONSTEXPR
int 300 compare(
const char_type* __s1,
const char_type* __s2,
size_t __n)
302 #if __cplusplus > 201402 303 if (__builtin_constant_p(__n)
304 && __constant_char_array_p(__s1, __n)
305 && __constant_char_array_p(__s2, __n))
310 return __builtin_memcmp(__s1, __s2, __n);
313 static _GLIBCXX17_CONSTEXPR
size_t 314 length(
const char_type* __s)
316 #if __cplusplus > 201402 317 if (__constant_string_p(__s))
320 return __builtin_strlen(__s);
323 static _GLIBCXX17_CONSTEXPR
const char_type*
324 find(
const char_type* __s,
size_t __n,
const char_type& __a)
326 #if __cplusplus > 201402 327 if (__builtin_constant_p(__n)
328 && __builtin_constant_p(__a)
329 && __constant_char_array_p(__s, __n))
334 return static_cast<const char_type*
>(__builtin_memchr(__s, __a, __n));
338 move(char_type* __s1,
const char_type* __s2,
size_t __n)
342 return static_cast<char_type*
>(__builtin_memmove(__s1, __s2, __n));
346 copy(char_type* __s1,
const char_type* __s2,
size_t __n)
350 return static_cast<char_type*
>(__builtin_memcpy(__s1, __s2, __n));
354 assign(char_type* __s,
size_t __n, char_type __a)
358 return static_cast<char_type*
>(__builtin_memset(__s, __a, __n));
361 static _GLIBCXX_CONSTEXPR char_type
362 to_char_type(
const int_type& __c) _GLIBCXX_NOEXCEPT
363 {
return static_cast<char_type
>(__c); }
367 static _GLIBCXX_CONSTEXPR int_type
368 to_int_type(
const char_type& __c) _GLIBCXX_NOEXCEPT
369 {
return static_cast<int_type
>(
static_cast<unsigned char>(__c)); }
371 static _GLIBCXX_CONSTEXPR
bool 372 eq_int_type(
const int_type& __c1,
const int_type& __c2) _GLIBCXX_NOEXCEPT
373 {
return __c1 == __c2; }
375 static _GLIBCXX_CONSTEXPR int_type
376 eof() _GLIBCXX_NOEXCEPT
377 {
return static_cast<int_type
>(_GLIBCXX_STDIO_EOF); }
379 static _GLIBCXX_CONSTEXPR int_type
380 not_eof(
const int_type& __c) _GLIBCXX_NOEXCEPT
381 {
return (__c == eof()) ? 0 : __c; }
385 #ifdef _GLIBCXX_USE_WCHAR_T 390 typedef wchar_t char_type;
391 typedef wint_t int_type;
394 typedef mbstate_t state_type;
396 static _GLIBCXX17_CONSTEXPR
void 397 assign(char_type& __c1,
const char_type& __c2) _GLIBCXX_NOEXCEPT
400 static _GLIBCXX_CONSTEXPR
bool 401 eq(
const char_type& __c1,
const char_type& __c2) _GLIBCXX_NOEXCEPT
402 {
return __c1 == __c2; }
404 static _GLIBCXX_CONSTEXPR
bool 405 lt(
const char_type& __c1,
const char_type& __c2) _GLIBCXX_NOEXCEPT
406 {
return __c1 < __c2; }
408 static _GLIBCXX17_CONSTEXPR
int 409 compare(
const char_type* __s1,
const char_type* __s2,
size_t __n)
411 #if __cplusplus > 201402 412 if (__builtin_constant_p(__n)
413 && __constant_char_array_p(__s1, __n)
414 && __constant_char_array_p(__s2, __n))
420 return wmemcmp(__s1, __s2, __n);
423 static _GLIBCXX17_CONSTEXPR
size_t 424 length(
const char_type* __s)
426 #if __cplusplus > 201402 427 if (__constant_string_p(__s))
434 static _GLIBCXX17_CONSTEXPR
const char_type*
435 find(
const char_type* __s,
size_t __n,
const char_type& __a)
437 #if __cplusplus > 201402 438 if (__builtin_constant_p(__n)
439 && __builtin_constant_p(__a)
440 && __constant_char_array_p(__s, __n))
446 return wmemchr(__s, __a, __n);
450 move(char_type* __s1,
const char_type* __s2,
size_t __n)
454 return wmemmove(__s1, __s2, __n);
458 copy(char_type* __s1,
const char_type* __s2,
size_t __n)
462 return wmemcpy(__s1, __s2, __n);
466 assign(char_type* __s,
size_t __n, char_type __a)
470 return wmemset(__s, __a, __n);
473 static _GLIBCXX_CONSTEXPR char_type
474 to_char_type(
const int_type& __c) _GLIBCXX_NOEXCEPT
475 {
return char_type(__c); }
477 static _GLIBCXX_CONSTEXPR int_type
478 to_int_type(
const char_type& __c) _GLIBCXX_NOEXCEPT
479 {
return int_type(__c); }
481 static _GLIBCXX_CONSTEXPR
bool 482 eq_int_type(
const int_type& __c1,
const int_type& __c2) _GLIBCXX_NOEXCEPT
483 {
return __c1 == __c2; }
485 static _GLIBCXX_CONSTEXPR int_type
486 eof() _GLIBCXX_NOEXCEPT
487 {
return static_cast<int_type
>(WEOF); }
489 static _GLIBCXX_CONSTEXPR int_type
490 not_eof(
const int_type& __c) _GLIBCXX_NOEXCEPT
491 {
return eq_int_type(__c, eof()) ? 0 : __c; }
493 #endif //_GLIBCXX_USE_WCHAR_T 495 _GLIBCXX_END_NAMESPACE_VERSION
498 #if ((__cplusplus >= 201103L) \ 499 && defined(_GLIBCXX_USE_C99_STDINT_TR1)) 503 namespace std _GLIBCXX_VISIBILITY(default)
505 _GLIBCXX_BEGIN_NAMESPACE_VERSION
510 typedef char16_t char_type;
511 typedef uint_least16_t int_type;
514 typedef mbstate_t state_type;
516 static _GLIBCXX17_CONSTEXPR
void 517 assign(char_type& __c1,
const char_type& __c2) noexcept
520 static constexpr
bool 521 eq(
const char_type& __c1,
const char_type& __c2) noexcept
522 {
return __c1 == __c2; }
524 static constexpr
bool 525 lt(
const char_type& __c1,
const char_type& __c2) noexcept
526 {
return __c1 < __c2; }
528 static _GLIBCXX17_CONSTEXPR
int 529 compare(
const char_type* __s1,
const char_type* __s2,
size_t __n)
531 for (
size_t __i = 0; __i < __n; ++__i)
532 if (lt(__s1[__i], __s2[__i]))
534 else if (lt(__s2[__i], __s1[__i]))
539 static _GLIBCXX17_CONSTEXPR
size_t 540 length(
const char_type* __s)
543 while (!eq(__s[__i], char_type()))
548 static _GLIBCXX17_CONSTEXPR
const char_type*
549 find(
const char_type* __s,
size_t __n,
const char_type& __a)
551 for (
size_t __i = 0; __i < __n; ++__i)
552 if (eq(__s[__i], __a))
558 move(char_type* __s1,
const char_type* __s2,
size_t __n)
562 return (static_cast<char_type*>
563 (__builtin_memmove(__s1, __s2, __n *
sizeof(char_type))));
567 copy(char_type* __s1,
const char_type* __s2,
size_t __n)
571 return (static_cast<char_type*>
572 (__builtin_memcpy(__s1, __s2, __n *
sizeof(char_type))));
576 assign(char_type* __s,
size_t __n, char_type __a)
578 for (
size_t __i = 0; __i < __n; ++__i)
579 assign(__s[__i], __a);
583 static constexpr char_type
584 to_char_type(
const int_type& __c) noexcept
585 {
return char_type(__c); }
587 static constexpr int_type
588 to_int_type(
const char_type& __c) noexcept
589 {
return int_type(__c); }
591 static constexpr
bool 592 eq_int_type(
const int_type& __c1,
const int_type& __c2) noexcept
593 {
return __c1 == __c2; }
595 static constexpr int_type
597 {
return static_cast<int_type
>(-1); }
599 static constexpr int_type
600 not_eof(
const int_type& __c) noexcept
601 {
return eq_int_type(__c, eof()) ? 0 : __c; }
607 typedef char32_t char_type;
608 typedef uint_least32_t int_type;
611 typedef mbstate_t state_type;
613 static _GLIBCXX17_CONSTEXPR
void 614 assign(char_type& __c1,
const char_type& __c2) noexcept
617 static constexpr
bool 618 eq(
const char_type& __c1,
const char_type& __c2) noexcept
619 {
return __c1 == __c2; }
621 static constexpr
bool 622 lt(
const char_type& __c1,
const char_type& __c2) noexcept
623 {
return __c1 < __c2; }
625 static _GLIBCXX17_CONSTEXPR
int 626 compare(
const char_type* __s1,
const char_type* __s2,
size_t __n)
628 for (
size_t __i = 0; __i < __n; ++__i)
629 if (lt(__s1[__i], __s2[__i]))
631 else if (lt(__s2[__i], __s1[__i]))
636 static _GLIBCXX17_CONSTEXPR
size_t 637 length(
const char_type* __s)
640 while (!eq(__s[__i], char_type()))
645 static _GLIBCXX17_CONSTEXPR
const char_type*
646 find(
const char_type* __s,
size_t __n,
const char_type& __a)
648 for (
size_t __i = 0; __i < __n; ++__i)
649 if (eq(__s[__i], __a))
655 move(char_type* __s1,
const char_type* __s2,
size_t __n)
659 return (static_cast<char_type*>
660 (__builtin_memmove(__s1, __s2, __n *
sizeof(char_type))));
664 copy(char_type* __s1,
const char_type* __s2,
size_t __n)
668 return (static_cast<char_type*>
669 (__builtin_memcpy(__s1, __s2, __n *
sizeof(char_type))));
673 assign(char_type* __s,
size_t __n, char_type __a)
675 for (
size_t __i = 0; __i < __n; ++__i)
676 assign(__s[__i], __a);
680 static constexpr char_type
681 to_char_type(
const int_type& __c) noexcept
682 {
return char_type(__c); }
684 static constexpr int_type
685 to_int_type(
const char_type& __c) noexcept
686 {
return int_type(__c); }
688 static constexpr
bool 689 eq_int_type(
const int_type& __c1,
const int_type& __c2) noexcept
690 {
return __c1 == __c2; }
692 static constexpr int_type
694 {
return static_cast<int_type
>(-1); }
696 static constexpr int_type
697 not_eof(
const int_type& __c) noexcept
698 {
return eq_int_type(__c, eof()) ? 0 : __c; }
701 _GLIBCXX_END_NAMESPACE_VERSION
706 #endif // _CHAR_TRAITS_H
Base class used to implement std::char_traits.
ISO C++ entities toplevel namespace is std.
GNU extensions for public use.
Mapping from character type to associated types.
Class representing stream positions.
Basis for explicit traits specializations.
long long streamoff
Type used by fpos, char_traits<char>, and char_traits<wchar_t>.