id3lib  3.8.3
id3lib_strings.h
Go to the documentation of this file.
1 // -*- C++ -*-
2 // $Id: id3lib_strings.h,v 1.4 2003/03/02 13:56:21 t1mpy Exp $
3 
4 // id3lib: a software library for creating and manipulating id3v1/v2 tags
5 // Copyright 1999, 2000 Scott Thomas Haug
6 // Copyright 2002 Thijmen Klok (thijmen@id3lib.org)
7 
8 // This library is free software; you can redistribute it and/or modify it
9 // under the terms of the GNU Library General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or (at your
11 // option) any later version.
12 //
13 // This library is distributed in the hope that it will be useful, but WITHOUT
14 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
16 // License for more details.
17 //
18 // You should have received a copy of the GNU Library General Public License
19 // along with this library; if not, write to the Free Software Foundation,
20 // Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 
22 // The id3lib authors encourage improvements and optimisations to be sent to
23 // the id3lib coordinator. Please see the README file for details on where to
24 // send such submissions. See the AUTHORS file for a list of people who have
25 // contributed to id3lib. See the ChangeLog file for a list of changes to
26 // id3lib. These files are distributed with id3lib at
27 // http://download.sourceforge.net/id3lib/
28 
29 #ifndef _ID3LIB_STRINGS_H_
30 #define _ID3LIB_STRINGS_H_
31 
32 #include <string>
33 #include "string.h"
34 
35 #if (defined(__GNUC__) && (__GNUC__ >= 3) || (defined(_MSC_VER) && _MSC_VER > 1000))
36 namespace std
37 {
38  template<>
39  struct char_traits<unsigned char>
40  {
41  typedef unsigned char char_type;
42  // Unsigned as wint_t in unsigned.
43  typedef unsigned long int_type;
44  typedef streampos pos_type;
45  typedef streamoff off_type;
46  typedef mbstate_t state_type;
47 
48  static void
49  assign(char_type& __c1, const char_type& __c2)
50  { __c1 = __c2; }
51 
52  static bool
53  eq(const char_type& __c1, const char_type& __c2)
54  { return __c1 == __c2; }
55 
56  static bool
57  lt(const char_type& __c1, const char_type& __c2)
58  { return __c1 < __c2; }
59 
60  static int
61  compare(const char_type* __s1, const char_type* __s2, size_t __n)
62  {
63  for (size_t __i = 0; __i < __n; ++__i)
64  if (!eq(__s1[__i], __s2[__i]))
65  return lt(__s1[__i], __s2[__i]) ? -1 : 1;
66  return 0;
67  }
68 
69  static size_t
70  length(const char_type* __s)
71  {
72  const char_type* __p = __s;
73  while (__p)
74  ++__p;
75  return (__p - __s);
76  }
77 
78  static const char_type*
79  find(const char_type* __s, size_t __n, const char_type& __a)
80  {
81  for (const char_type* __p = __s; size_t(__p - __s) < __n; ++__p)
82  if (*__p == __a) return __p;
83  return 0;
84  }
85 
86  static char_type*
87  move(char_type* __s1, const char_type* __s2, size_t __n)
88  { return (char_type*) memmove(__s1, __s2, __n * sizeof(char_type)); }
89 
90  static char_type*
91  copy(char_type* __s1, const char_type* __s2, size_t __n)
92  { return (char_type*) memcpy(__s1, __s2, __n * sizeof(char_type)); }
93 
94  static char_type*
95  assign(char_type* __s, size_t __n, char_type __a)
96  {
97  for (char_type* __p = __s; __p < __s + __n; ++__p)
98  assign(*__p, __a);
99  return __s;
100  }
101 
102  static char_type
103  to_char_type(const int_type& __c)
104  { return char_type(); }
105 
106  static int_type
107  to_int_type(const char_type& __c) { return int_type(); }
108 
109  static bool
110  eq_int_type(const int_type& __c1, const int_type& __c2)
111  { return __c1 == __c2; }
112 
113  static int_type
114  eof() { return static_cast<int_type>(-1); }
115 
116  static int_type
117  not_eof(const int_type& __c)
118  { return eq_int_type(__c, eof()) ? int_type(0) : __c; }
119  };
120 
121 #ifndef _GLIBCPP_USE_WCHAR_T
122 #if (defined(ID3_NEED_WCHAR_TEMPLATE))
123  template<>
124  struct char_traits<wchar_t>
125  {
126  typedef wchar_t char_type;
127  typedef wint_t int_type;
128  typedef streamoff off_type;
129  typedef streampos pos_type;
130  typedef mbstate_t state_type;
131 
132  static void
133  assign(char_type& __c1, const char_type& __c2)
134  { __c1 = __c2; }
135 
136  static bool
137  eq(const char_type& __c1, const char_type& __c2)
138  { return __c1 == __c2; }
139 
140  static bool
141  lt(const char_type& __c1, const char_type& __c2)
142  { return __c1 < __c2; }
143 
144  static int
145  compare(const char_type* __s1, const char_type* __s2, size_t __n)
146  { return wmemcmp(__s1, __s2, __n); }
147 
148  static size_t
149  length(const char_type* __s)
150  { return wcslen(__s); }
151 
152  static const char_type*
153  find(const char_type* __s, size_t __n, const char_type& __a)
154  { return wmemchr(__s, __a, __n); }
155 
156  static char_type*
157  move(char_type* __s1, const char_type* __s2, int_type __n)
158  { return wmemmove(__s1, __s2, __n); }
159 
160  static char_type*
161  copy(char_type* __s1, const char_type* __s2, size_t __n)
162  { return wmemcpy(__s1, __s2, __n); }
163 
164  static char_type*
165  assign(char_type* __s, size_t __n, char_type __a)
166  { return wmemset(__s, __a, __n); }
167 
168  static char_type
169  to_char_type(const int_type& __c) { return char_type(__c); }
170 
171  static int_type
172  to_int_type(const char_type& __c) { return int_type(__c); }
173 
174  static bool
175  eq_int_type(const int_type& __c1, const int_type& __c2)
176  { return __c1 == __c2; }
177 
178  static state_type
179  _S_get_state(const pos_type& __pos) { return __pos.state(); }
180 
181  static int_type
182  eof() { return static_cast<int_type>(WEOF); }
183 
184  static int_type
185  _S_eos() { return char_type(); }
186 
187  static int_type
188  not_eof(const int_type& __c)
189  { return eq_int_type(__c, eof()) ? 0 : __c; }
190  };
191 #endif
192 #endif
193 } // namespace std
194 #endif
195 
196 namespace dami
197 {
198  typedef std::basic_string<char> String;
199  typedef std::basic_string<unsigned char> BString;
200  typedef std::basic_string<wchar_t> WString;
201 };
202 
203 #endif /* _ID3LIB_STRINGS_H_ */
204