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
00040 #ifndef _CHAR_TRAITS_H
00041 #define _CHAR_TRAITS_H 1
00042
00043 #pragma GCC system_header
00044
00045 #include <cstring>
00046 #include <bits/stl_algobase.h>
00047 #include <bits/postypes.h>
00048
00049 namespace __gnu_cxx
00050 {
00061 template <class _CharT>
00062 struct _Char_types
00063 {
00064 typedef unsigned long int_type;
00065 typedef std::streampos pos_type;
00066 typedef std::streamoff off_type;
00067 typedef std::mbstate_t state_type;
00068 };
00069
00070
00086 template<typename _CharT>
00087 struct char_traits
00088 {
00089 typedef _CharT char_type;
00090 typedef typename _Char_types<_CharT>::int_type int_type;
00091 typedef typename _Char_types<_CharT>::pos_type pos_type;
00092 typedef typename _Char_types<_CharT>::off_type off_type;
00093 typedef typename _Char_types<_CharT>::state_type state_type;
00094
00095 static void
00096 assign(char_type& __c1, const char_type& __c2)
00097 { __c1 = __c2; }
00098
00099 static bool
00100 eq(const char_type& __c1, const char_type& __c2)
00101 { return __c1 == __c2; }
00102
00103 static bool
00104 lt(const char_type& __c1, const char_type& __c2)
00105 { return __c1 < __c2; }
00106
00107 static int
00108 compare(const char_type* __s1, const char_type* __s2, std::size_t __n);
00109
00110 static std::size_t
00111 length(const char_type* __s);
00112
00113 static const char_type*
00114 find(const char_type* __s, std::size_t __n, const char_type& __a);
00115
00116 static char_type*
00117 move(char_type* __s1, const char_type* __s2, std::size_t __n);
00118
00119 static char_type*
00120 copy(char_type* __s1, const char_type* __s2, std::size_t __n);
00121
00122 static char_type*
00123 assign(char_type* __s, std::size_t __n, char_type __a);
00124
00125 static char_type
00126 to_char_type(const int_type& __c)
00127 { return static_cast<char_type>(__c); }
00128
00129 static int_type
00130 to_int_type(const char_type& __c)
00131 { return static_cast<int_type>(__c); }
00132
00133 static bool
00134 eq_int_type(const int_type& __c1, const int_type& __c2)
00135 { return __c1 == __c2; }
00136
00137 static int_type
00138 eof()
00139 { return static_cast<int_type>(EOF); }
00140
00141 static int_type
00142 not_eof(const int_type& __c)
00143 { return !eq_int_type(__c, eof()) ? __c : to_int_type(char_type()); }
00144 };
00145
00146 template<typename _CharT>
00147 int
00148 char_traits<_CharT>::
00149 compare(const char_type* __s1, const char_type* __s2, std::size_t __n)
00150 {
00151 for (size_t __i = 0; __i < __n; ++__i)
00152 if (lt(__s1[__i], __s2[__i]))
00153 return -1;
00154 else if (lt(__s2[__i], __s1[__i]))
00155 return 1;
00156 return 0;
00157 }
00158
00159 template<typename _CharT>
00160 std::size_t
00161 char_traits<_CharT>::
00162 length(const char_type* __p)
00163 {
00164 std::size_t __i = 0;
00165 while (!eq(__p[__i], char_type()))
00166 ++__i;
00167 return __i;
00168 }
00169
00170 template<typename _CharT>
00171 const typename char_traits<_CharT>::char_type*
00172 char_traits<_CharT>::
00173 find(const char_type* __s, std::size_t __n, const char_type& __a)
00174 {
00175 for (std::size_t __i = 0; __i < __n; ++__i)
00176 if (eq(__s[__i], __a))
00177 return __s + __i;
00178 return 0;
00179 }
00180
00181 template<typename _CharT>
00182 typename char_traits<_CharT>::char_type*
00183 char_traits<_CharT>::
00184 move(char_type* __s1, const char_type* __s2, std::size_t __n)
00185 {
00186 return static_cast<_CharT*>(std::memmove(__s1, __s2,
00187 __n * sizeof(char_type)));
00188 }
00189
00190 template<typename _CharT>
00191 typename char_traits<_CharT>::char_type*
00192 char_traits<_CharT>::
00193 copy(char_type* __s1, const char_type* __s2, std::size_t __n)
00194 {
00195 std::copy(__s2, __s2 + __n, __s1);
00196 return __s1;
00197 }
00198
00199 template<typename _CharT>
00200 typename char_traits<_CharT>::char_type*
00201 char_traits<_CharT>::
00202 assign(char_type* __s, std::size_t __n, char_type __a)
00203 {
00204 std::fill_n(__s, __n, __a);
00205 return __s;
00206 }
00207 }
00208
00209 namespace std
00210 {
00211
00224 template<class _CharT>
00225 struct char_traits : public __gnu_cxx::char_traits<_CharT>
00226 { };
00227
00228
00230 template<>
00231 struct char_traits<char>
00232 {
00233 typedef char char_type;
00234 typedef int int_type;
00235 typedef streampos pos_type;
00236 typedef streamoff off_type;
00237 typedef mbstate_t state_type;
00238
00239 static void
00240 assign(char_type& __c1, const char_type& __c2)
00241 { __c1 = __c2; }
00242
00243 static bool
00244 eq(const char_type& __c1, const char_type& __c2)
00245 { return __c1 == __c2; }
00246
00247 static bool
00248 lt(const char_type& __c1, const char_type& __c2)
00249 { return __c1 < __c2; }
00250
00251 static int
00252 compare(const char_type* __s1, const char_type* __s2, size_t __n)
00253 { return memcmp(__s1, __s2, __n); }
00254
00255 static size_t
00256 length(const char_type* __s)
00257 { return strlen(__s); }
00258
00259 static const char_type*
00260 find(const char_type* __s, size_t __n, const char_type& __a)
00261 { return static_cast<const char_type*>(memchr(__s, __a, __n)); }
00262
00263 static char_type*
00264 move(char_type* __s1, const char_type* __s2, size_t __n)
00265 { return static_cast<char_type*>(memmove(__s1, __s2, __n)); }
00266
00267 static char_type*
00268 copy(char_type* __s1, const char_type* __s2, size_t __n)
00269 { return static_cast<char_type*>(memcpy(__s1, __s2, __n)); }
00270
00271 static char_type*
00272 assign(char_type* __s, size_t __n, char_type __a)
00273 { return static_cast<char_type*>(memset(__s, __a, __n)); }
00274
00275 static char_type
00276 to_char_type(const int_type& __c)
00277 { return static_cast<char_type>(__c); }
00278
00279
00280
00281 static int_type
00282 to_int_type(const char_type& __c)
00283 { return static_cast<int_type>(static_cast<unsigned char>(__c)); }
00284
00285 static bool
00286 eq_int_type(const int_type& __c1, const int_type& __c2)
00287 { return __c1 == __c2; }
00288
00289 static int_type
00290 eof() { return static_cast<int_type>(EOF); }
00291
00292 static int_type
00293 not_eof(const int_type& __c)
00294 { return (__c == eof()) ? 0 : __c; }
00295 };
00296
00297
00298 #ifdef _GLIBCXX_USE_WCHAR_T
00300 template<>
00301 struct char_traits<wchar_t>
00302 {
00303 typedef wchar_t char_type;
00304 typedef wint_t int_type;
00305 typedef streamoff off_type;
00306 typedef wstreampos pos_type;
00307 typedef mbstate_t state_type;
00308
00309 static void
00310 assign(char_type& __c1, const char_type& __c2)
00311 { __c1 = __c2; }
00312
00313 static bool
00314 eq(const char_type& __c1, const char_type& __c2)
00315 { return __c1 == __c2; }
00316
00317 static bool
00318 lt(const char_type& __c1, const char_type& __c2)
00319 { return __c1 < __c2; }
00320
00321 static int
00322 compare(const char_type* __s1, const char_type* __s2, size_t __n)
00323 { return wmemcmp(__s1, __s2, __n); }
00324
00325 static size_t
00326 length(const char_type* __s)
00327 { return wcslen(__s); }
00328
00329 static const char_type*
00330 find(const char_type* __s, size_t __n, const char_type& __a)
00331 { return wmemchr(__s, __a, __n); }
00332
00333 static char_type*
00334 move(char_type* __s1, const char_type* __s2, size_t __n)
00335 { return wmemmove(__s1, __s2, __n); }
00336
00337 static char_type*
00338 copy(char_type* __s1, const char_type* __s2, size_t __n)
00339 { return wmemcpy(__s1, __s2, __n); }
00340
00341 static char_type*
00342 assign(char_type* __s, size_t __n, char_type __a)
00343 { return wmemset(__s, __a, __n); }
00344
00345 static char_type
00346 to_char_type(const int_type& __c) { return char_type(__c); }
00347
00348 static int_type
00349 to_int_type(const char_type& __c) { return int_type(__c); }
00350
00351 static bool
00352 eq_int_type(const int_type& __c1, const int_type& __c2)
00353 { return __c1 == __c2; }
00354
00355 static int_type
00356 eof() { return static_cast<int_type>(WEOF); }
00357
00358 static int_type
00359 not_eof(const int_type& __c)
00360 { return eq_int_type(__c, eof()) ? 0 : __c; }
00361 };
00362 #endif //_GLIBCXX_USE_WCHAR_T
00363
00364 }
00365
00366 #endif