More spring-cleaning.
[dragonfly/netmp.git] / contrib / libstdc++ / std / straits.h
blobc80e7ab7a6816a47f37f06fd050c1b2d6ab6dcb7
1 // Character traits template for the -*- C++ -*- string classes.
2 // Copyright (C) 1994 Free Software Foundation
4 // This file is part of the GNU ANSI C++ Library. This library is free
5 // software; you can redistribute it and/or modify it under the
6 // terms of the GNU General Public License as published by the
7 // Free Software Foundation; either version 2, or (at your option)
8 // any later version.
10 // This library is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this library; see the file COPYING. If not, write to the Free
17 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19 // As a special exception, if you link this library with files
20 // compiled with a GNU compiler to produce an executable, this does not cause
21 // the resulting executable to be covered by the GNU General Public License.
22 // This exception does not however invalidate any other reasons why
23 // the executable file might be covered by the GNU General Public License.
25 // Written by Jason Merrill based upon the specification by Takanori Adachi
26 // in ANSI X3J16/94-0013R2.
28 #ifndef __STRING_CHAR_TRAITS__
29 #define __STRING_CHAR_TRAITS__
31 #ifdef __GNUG__
32 // For string_char_traits <char>
33 #pragma interface "std/straits.h"
34 #endif
36 #include <cstddef>
38 extern "C++" {
39 template <class charT>
40 struct string_char_traits {
41 typedef charT char_type; // for users to acquire the basic character type
43 // constraints
45 static void assign (char_type& c1, const char_type& c2)
46 { c1 = c2; }
47 static bool eq (const char_type& c1, const char_type& c2)
48 { return (c1 == c2); }
49 static bool ne (const char_type& c1, const char_type& c2)
50 { return !(c1 == c2); }
51 static bool lt (const char_type& c1, const char_type& c2)
52 { return (c1 < c2); }
53 static char_type eos () { return char_type(); } // the null character
54 static bool is_del(char_type a) { return 0; }
55 // characteristic function for delimiters of charT
57 // speed-up functions
59 static int compare (const char_type* s1, const char_type* s2, size_t n)
61 size_t i;
62 for (i = 0; i < n; ++i)
63 if (ne (s1[i], s2[i]))
64 return lt (s1[i], s2[i]) ? -1 : 1;
66 return 0;
69 static size_t length (const char_type* s)
71 size_t l = 0;
72 while (ne (*s++, eos ()))
73 ++l;
74 return l;
77 static char_type* copy (char_type* s1, const char_type* s2, size_t n)
79 for (; n--; )
80 assign (s1[n], s2[n]);
81 return s1;
84 static char_type* move (char_type* s1, const char_type* s2, size_t n)
86 char_type a[n];
87 size_t i;
88 for (i = 0; i < n; ++i)
89 assign (a[i], s2[i]);
90 for (i = 0; i < n; ++i)
91 assign (s1[i], a[i]);
92 return s1;
95 static char_type* set (char_type* s1, const char_type& c, size_t n)
97 for (; n--; )
98 assign (s1[n], c);
99 return s1;
103 class istream;
104 class ostream;
105 #include <cctype>
106 #include <cstring>
108 struct string_char_traits <char> {
109 typedef char char_type;
111 static void assign (char_type& c1, const char_type& c2)
112 { c1 = c2; }
113 static bool eq (const char_type & c1, const char_type& c2)
114 { return (c1 == c2); }
115 static bool ne (const char_type& c1, const char_type& c2)
116 { return (c1 != c2); }
117 static bool lt (const char_type& c1, const char_type& c2)
118 { return (c1 < c2); }
119 static char_type eos () { return 0; }
120 static bool is_del(char_type a) { return isspace(a); }
122 static int compare (const char_type* s1, const char_type* s2, size_t n)
123 { return memcmp (s1, s2, n); }
124 static size_t length (const char_type* s)
125 { return strlen (s); }
126 static char_type* copy (char_type* s1, const char_type* s2, size_t n)
127 { return (char_type*) memcpy (s1, s2, n); }
128 static char_type* move (char_type* s1, const char_type* s2, size_t n)
129 { return (char_type*) memmove (s1, s2, n); }
130 static char_type* set (char_type* s1, const char_type& c, size_t n)
131 { return (char_type*) memset (s1, c, n); }
134 #if 0
135 #include <cwctype>
136 struct string_char_traits <wchar_t> {
137 typedef wchar_t char_type;
139 static void assign (char_type& c1, const char_type& c2)
140 { c1 = c2; }
141 static bool eq (const char_type & c1, const char_type& c2)
142 { return (c1 == c2); }
143 static bool ne (const char_type& c1, const char_type& c2)
144 { return (c1 != c2); }
145 static bool lt (const char_type& c1, const char_type& c2)
146 { return (c1 < c2); }
147 static char_type eos () { return 0; }
148 static bool is_del(char_type a) { return iswspace(a); }
150 static int compare (const char_type* s1, const char_type* s2, size_t n)
151 { return wmemcmp (s1, s2, n); }
152 static size_t length (const char_type* s)
153 { return wcslen (s); }
154 static char_type* copy (char_type* s1, const char_type* s2, size_t n)
155 { return wmemcpy (s1, s2, n); }
156 static char_type* set (char_type* s1, const char_type& c, size_t n)
157 { return wmemset (s1, c, n); }
159 #endif
160 } // extern "C++"
161 #endif