libstdc++
pod_char_traits.h
Go to the documentation of this file.
1// POD character, std::char_traits specialization -*- C++ -*-
2
3// Copyright (C) 2002-2025 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library. This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15
16// Under Section 7 of GPL version 3, you are granted additional
17// permissions described in the GCC Runtime Library Exception, version
18// 3.1, as published by the Free Software Foundation.
19
20// You should have received a copy of the GNU General Public License and
21// a copy of the GCC Runtime Library Exception along with this program;
22// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23// <http://www.gnu.org/licenses/>.
24
25/** @file ext/pod_char_traits.h
26 * This file is a GNU extension to the Standard C++ Library.
27 */
28
29// Gabriel Dos Reis <gdr@integrable-solutions.net>
30// Benjamin Kosnik <bkoz@redhat.com>
31
32#ifndef _POD_CHAR_TRAITS_H
33#define _POD_CHAR_TRAITS_H 1
34
35#ifdef _GLIBCXX_SYSHDR
36#pragma GCC system_header
37#endif
38
39#include <bits/requires_hosted.h> // GNU extensions are currently omitted
40
41#include <string>
42
43namespace __gnu_cxx _GLIBCXX_VISIBILITY(default)
44{
45_GLIBCXX_BEGIN_NAMESPACE_VERSION
46
47 // POD character abstraction.
48 // NB: The char_type parameter is a subset of int_type, as to allow
49 // int_type to properly hold the full range of char_type values as
50 // well as EOF.
51 /// @brief A POD class that serves as a character abstraction class.
52 template<typename _Value, typename _Int, typename _St = std::mbstate_t>
53 struct character
54 {
55 typedef _Value value_type;
56 typedef _Int int_type;
57 typedef _St state_type;
58 typedef character<_Value, _Int, _St> char_type;
59
60 value_type value;
61
62 template<typename V2>
63 static char_type
64 from(const V2& v)
65 {
66 char_type ret = { static_cast<value_type>(v) };
67 return ret;
68 }
69
70 template<typename V2>
71 static V2
72 to(const char_type& c)
73 {
74 V2 ret = { static_cast<V2>(c.value) };
75 return ret;
76 }
77
78 };
79
80 template<typename _Value, typename _Int, typename _St>
81 inline bool
82 operator==(const character<_Value, _Int, _St>& lhs,
84 { return lhs.value == rhs.value; }
85
86 template<typename _Value, typename _Int, typename _St>
87 inline bool
88 operator<(const character<_Value, _Int, _St>& lhs,
89 const character<_Value, _Int, _St>& rhs)
90 { return lhs.value < rhs.value; }
91
92_GLIBCXX_END_NAMESPACE_VERSION
93} // namespace
94
95namespace std _GLIBCXX_VISIBILITY(default)
96{
97_GLIBCXX_BEGIN_NAMESPACE_VERSION
98
99 /// char_traits<__gnu_cxx::character> specialization.
100 template<typename _Value, typename _Int, typename _St>
101 struct char_traits<__gnu_cxx::character<_Value, _Int, _St> >
102 {
104 typedef typename char_type::int_type int_type;
105 typedef typename char_type::state_type state_type;
106 typedef fpos<state_type> pos_type;
107 typedef streamoff off_type;
108
109 static void
110 assign(char_type& __c1, const char_type& __c2)
111 { __c1 = __c2; }
112
113 static bool
114 eq(const char_type& __c1, const char_type& __c2)
115 { return __c1 == __c2; }
116
117 static bool
118 lt(const char_type& __c1, const char_type& __c2)
119 { return __c1 < __c2; }
120
121 static int
122 compare(const char_type* __s1, const char_type* __s2, size_t __n)
123 {
124 for (size_t __i = 0; __i < __n; ++__i)
125 if (!eq(__s1[__i], __s2[__i]))
126 return lt(__s1[__i], __s2[__i]) ? -1 : 1;
127 return 0;
128 }
129
130 static size_t
131 length(const char_type* __s)
132 {
133 const char_type* __p = __s;
134 while (__p->value)
135 ++__p;
136 return (__p - __s);
137 }
138
139 static const char_type*
140 find(const char_type* __s, size_t __n, const char_type& __a)
141 {
142 for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p)
143 if (*__p == __a)
144 return __p;
145 return 0;
146 }
147
148 static char_type*
149 move(char_type* __s1, const char_type* __s2, size_t __n)
150 {
151 if (__n == 0)
152 return __s1;
153 return static_cast<char_type*>
154 (__builtin_memmove(__s1, __s2, __n * sizeof(char_type)));
155 }
156
157 static char_type*
158 copy(char_type* __s1, const char_type* __s2, size_t __n)
159 {
160 if (__n == 0)
161 return __s1;
162 std::copy(__s2, __s2 + __n, __s1);
163 return __s1;
164 }
165
166 static char_type*
167 assign(char_type* __s, size_t __n, char_type __a)
168 {
169 std::fill_n(__s, __n, __a);
170 return __s;
171 }
172
173 static char_type
174 to_char_type(const int_type& __i)
175 { return char_type::template from(__i); }
176
177 static int_type
178 to_int_type(const char_type& __c)
179 { return char_type::template to<int_type>(__c); }
180
181 static bool
182 eq_int_type(const int_type& __c1, const int_type& __c2)
183 { return __c1 == __c2; }
184
185 static int_type
186 eof()
187 {
188 int_type __r = { static_cast<typename __gnu_cxx::__conditional_type
189 <std::__is_integer<int_type>::__value,
190 int_type, int>::__type>(-1) };
191 return __r;
192 }
193
194 static int_type
195 not_eof(const int_type& __c)
196 { return eq_int_type(__c, eof()) ? int_type() : __c; }
197 };
198
199_GLIBCXX_END_NAMESPACE_VERSION
200} // namespace
201
202#endif
ISO C++ entities toplevel namespace is std.
long long streamoff
Type used by fpos, char_traits<char>, and char_traits<wchar_t>.
Definition postypes.h:68
GNU extensions for public use.
Basis for explicit traits specializations.
Class representing stream positions.
Definition postypes.h:88
A POD class that serves as a character abstraction class.