00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #ifndef _CPP_BITS_CHAR_TRAITS_H
00035 #define _CPP_BITS_CHAR_TRAITS_H 1
00036
00037 #pragma GCC system_header
00038
00039 #include <bits/std_cstring.h>
00040 #include <bits/fpos.h>
00041
00042 namespace std
00043 {
00047 template<class _CharT>
00048 struct char_traits
00049 {
00050 typedef _CharT char_type;
00051
00052 typedef unsigned long int_type;
00053 typedef streampos pos_type;
00054 typedef streamoff off_type;
00055 typedef mbstate_t state_type;
00056
00057 static void
00058 assign(char_type& __c1, const char_type& __c2)
00059 { __c1 = __c2; }
00060
00061 static bool
00062 eq(const char_type& __c1, const char_type& __c2)
00063 { return __c1 == __c2; }
00064
00065 static bool
00066 lt(const char_type& __c1, const char_type& __c2)
00067 { return __c1 < __c2; }
00068
00069 static int
00070 compare(const char_type* __s1, const char_type* __s2, size_t __n)
00071 {
00072 for (size_t __i = 0; __i < __n; ++__i)
00073 if (!eq(__s1[__i], __s2[__i]))
00074 return lt(__s1[__i], __s2[__i]) ? -1 : 1;
00075 return 0;
00076 }
00077
00078 static size_t
00079 length(const char_type* __s)
00080 {
00081 const char_type* __p = __s;
00082 while (*__p) ++__p;
00083 return (__p - __s);
00084 }
00085
00086 static const char_type*
00087 find(const char_type* __s, size_t __n, const char_type& __a)
00088 {
00089 for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p)
00090 if (*__p == __a) return __p;
00091 return 0;
00092 }
00093
00094 static char_type*
00095 move(char_type* __s1, const char_type* __s2, size_t __n)
00096 { return (char_type*) memmove(__s1, __s2, __n * sizeof(char_type)); }
00097
00098 static char_type*
00099 copy(char_type* __s1, const char_type* __s2, size_t __n)
00100 { return (char_type*) memcpy(__s1, __s2, __n * sizeof(char_type)); }
00101
00102 static char_type*
00103 assign(char_type* __s, size_t __n, char_type __a)
00104 {
00105 for (char_type* __p = __s; __p < __s + __n; ++__p)
00106 assign(*__p, __a);
00107 return __s;
00108 }
00109
00110 static char_type
00111 to_char_type(const int_type& __c)
00112 { return char_type(__c); }
00113
00114 static int_type
00115 to_int_type(const char_type& __c) { return int_type(__c); }
00116
00117 static bool
00118 eq_int_type(const int_type& __c1, const int_type& __c2)
00119 { return __c1 == __c2; }
00120
00121 static int_type
00122 eof() { return static_cast<int_type>(-1); }
00123
00124 static int_type
00125 not_eof(const int_type& __c)
00126 { return eq_int_type(__c, eof()) ? int_type(0) : __c; }
00127 };
00128
00129
00131 template<>
00132 struct char_traits<char>
00133 {
00134 typedef char char_type;
00135 typedef int int_type;
00136 typedef streampos pos_type;
00137 typedef streamoff off_type;
00138 typedef mbstate_t state_type;
00139
00140 static void
00141 assign(char_type& __c1, const char_type& __c2)
00142 { __c1 = __c2; }
00143
00144 static bool
00145 eq(const char_type& __c1, const char_type& __c2)
00146 { return __c1 == __c2; }
00147
00148 static bool
00149 lt(const char_type& __c1, const char_type& __c2)
00150 { return __c1 < __c2; }
00151
00152 static int
00153 compare(const char_type* __s1, const char_type* __s2, size_t __n)
00154 { return memcmp(__s1, __s2, __n); }
00155
00156 static size_t
00157 length(const char_type* __s)
00158 { return strlen(__s); }
00159
00160 static const char_type*
00161 find(const char_type* __s, size_t __n, const char_type& __a)
00162 { return static_cast<const char_type*>(memchr(__s, __a, __n)); }
00163
00164 static char_type*
00165 move(char_type* __s1, const char_type* __s2, size_t __n)
00166 { return static_cast<char_type*>(memmove(__s1, __s2, __n)); }
00167
00168 static char_type*
00169 copy(char_type* __s1, const char_type* __s2, size_t __n)
00170 { return static_cast<char_type*>(memcpy(__s1, __s2, __n)); }
00171
00172 static char_type*
00173 assign(char_type* __s, size_t __n, char_type __a)
00174 { return static_cast<char_type*>(memset(__s, __a, __n)); }
00175
00176 static char_type
00177 to_char_type(const int_type& __c)
00178 { return static_cast<char_type>(__c); }
00179
00180
00181
00182 static int_type
00183 to_int_type(const char_type& __c)
00184 { return static_cast<int_type>(static_cast<unsigned char>(__c)); }
00185
00186 static bool
00187 eq_int_type(const int_type& __c1, const int_type& __c2)
00188 { return __c1 == __c2; }
00189
00190 static int_type
00191 eof() { return static_cast<int_type>(EOF); }
00192
00193 static int_type
00194 not_eof(const int_type& __c)
00195 { return (__c == eof()) ? 0 : __c; }
00196 };
00197
00198
00199 #ifdef _GLIBCPP_USE_WCHAR_T
00200 template<>
00201 struct char_traits<wchar_t>
00202 {
00203 typedef wchar_t char_type;
00204 typedef wint_t int_type;
00205 typedef streamoff off_type;
00206 typedef wstreampos pos_type;
00207 typedef mbstate_t state_type;
00208
00209 static void
00210 assign(char_type& __c1, const char_type& __c2)
00211 { __c1 = __c2; }
00212
00213 static bool
00214 eq(const char_type& __c1, const char_type& __c2)
00215 { return __c1 == __c2; }
00216
00217 static bool
00218 lt(const char_type& __c1, const char_type& __c2)
00219 { return __c1 < __c2; }
00220
00221 static int
00222 compare(const char_type* __s1, const char_type* __s2, size_t __n)
00223 { return wmemcmp(__s1, __s2, __n); }
00224
00225 static size_t
00226 length(const char_type* __s)
00227 { return wcslen(__s); }
00228
00229 static const char_type*
00230 find(const char_type* __s, size_t __n, const char_type& __a)
00231 { return wmemchr(__s, __a, __n); }
00232
00233 static char_type*
00234 move(char_type* __s1, const char_type* __s2, int_type __n)
00235 { return wmemmove(__s1, __s2, __n); }
00236
00237 static char_type*
00238 copy(char_type* __s1, const char_type* __s2, size_t __n)
00239 { return wmemcpy(__s1, __s2, __n); }
00240
00241 static char_type*
00242 assign(char_type* __s, size_t __n, char_type __a)
00243 { return wmemset(__s, __a, __n); }
00244
00245 static char_type
00246 to_char_type(const int_type& __c) { return char_type(__c); }
00247
00248 static int_type
00249 to_int_type(const char_type& __c) { return int_type(__c); }
00250
00251 static bool
00252 eq_int_type(const int_type& __c1, const int_type& __c2)
00253 { return __c1 == __c2; }
00254
00255 static int_type
00256 eof() { return static_cast<int_type>(WEOF); }
00257
00258 static int_type
00259 not_eof(const int_type& __c)
00260 { return eq_int_type(__c, eof()) ? 0 : __c; }
00261 };
00262 #endif //_GLIBCPP_USE_WCHAR_T
00263
00264 template<typename _CharT, typename _Traits>
00265 struct _Char_traits_match
00266 {
00267 _CharT _M_c;
00268 _Char_traits_match(_CharT const& __c) : _M_c(__c) { }
00269
00270 bool
00271 operator()(_CharT const& __a) { return _Traits::eq(_M_c, __a); }
00272 };
00273 }
00274
00275 #endif