Initial import from FreeBSD RELENG_4:
[dragonfly.git] / contrib / libstdc++ / std / straits.h
1 // Character traits template for the -*- C++ -*- string classes.
2 // Copyright (C) 1994 Free Software Foundation
3
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.
9
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.
14
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.
18
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.
24
25 // Written by Jason Merrill based upon the specification by Takanori Adachi
26 // in ANSI X3J16/94-0013R2.
27
28 #ifndef __STRING_CHAR_TRAITS__
29 #define __STRING_CHAR_TRAITS__
30
31 #ifdef __GNUG__
32 // For string_char_traits <char>
33 #pragma interface "std/straits.h"
34 #endif
35
36 #include <cstddef>
37
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
42
43   // constraints
44
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
56   
57   // speed-up functions
58
59   static int compare (const char_type* s1, const char_type* s2, size_t n)
60     {
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;
65
66       return 0;
67     }
68     
69   static size_t length (const char_type* s)
70     {
71       size_t l = 0;
72       while (ne (*s++, eos ()))
73         ++l;
74       return l;
75     }
76
77   static char_type* copy (char_type* s1, const char_type* s2, size_t n)
78     {
79       for (; n--; )
80         assign (s1[n], s2[n]);
81       return s1;
82     }
83
84   static char_type* move (char_type* s1, const char_type* s2, size_t n)
85     {
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;
93     }
94
95   static char_type* set (char_type* s1, const char_type& c, size_t n)
96     {
97       for (; n--; )
98         assign (s1[n], c);
99       return s1;
100     }
101 };
102
103 class istream;
104 class ostream;
105 #include <cctype>
106 #include <cstring>
107
108 struct string_char_traits <char> {
109   typedef char char_type;
110
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); }
121
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); }
132 };
133
134 #if 0
135 #include <cwctype>
136 struct string_char_traits <wchar_t> {
137   typedef wchar_t char_type;
138
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); }
149
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); }
158 };
159 #endif
160 } // extern "C++"
161 #endif