ScummVM API documentation
str-base.h
1 /* ScummVM - Graphic Adventure Engine
2  *
3  * ScummVM is the legal property of its developers, whose names
4  * are too numerous to list here. Please refer to the COPYRIGHT
5  * file distributed with this source distribution.
6  *
7  * This program is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 #ifndef COMMON_STR_BASE_H
23 #define COMMON_STR_BASE_H
24 
25 #include "common/scummsys.h"
26 #include "common/str-enc.h"
27 
28 #include <stdarg.h>
29 
30 namespace Common {
31 template<class T>
32 class BaseString {
33 public:
34  static void releaseMemoryPoolMutex();
35 
36  static const uint32 npos = 0xFFFFFFFF;
37  typedef T value_type;
38  typedef T * iterator;
39  typedef const T * const_iterator;
40  typedef size_t size_type;
41 
42 protected:
48  static const uint32 _builtinCapacity = 32 - (sizeof(uint32) + sizeof(char *)) / sizeof(value_type);
49 
55  uint32 _size;
56 
61  value_type *_str;
62 
63 
64  union {
73  struct {
74  mutable int *_refCount;
75  uint32 _capacity;
76  } _extern;
77  };
78 
79  inline bool isStorageIntern() const {
80  return _str == _storage;
81  }
82 
83 public:
85  constexpr BaseString() : _size(0), _str(_storage), _storage{0} {}
86 
88  explicit constexpr BaseString(value_type c) : _size((c == 0) ? 0 : 1), _str(_storage), _storage{c, 0} {}
89 
91  BaseString(size_t n, value_type c);
92 
94  BaseString(const BaseString &str);
95 
97  BaseString(BaseString &&str);
98 
100  explicit BaseString(const value_type *str);
101 
103  BaseString(const value_type *str, uint32 len);
104 
106  BaseString(const value_type *beginP, const value_type *endP);
107 
108  bool operator==(const BaseString &x) const;
109  bool operator==(const value_type *x) const;
110  bool operator!=(const BaseString &x) const;
111  bool operator!=(const value_type *x) const;
112 
113  bool operator<(const BaseString &x) const;
114  bool operator<(const value_type *x) const;
115  bool operator<=(const BaseString &x) const;
116  bool operator<=(const value_type *x) const;
117  bool operator>(const BaseString &x) const;
118  bool operator>(const value_type *x) const;
119  bool operator>=(const BaseString &x) const;
120  bool operator>=(const value_type *x) const;
121 
126  bool equals(const BaseString &x) const;
127  bool equals(const value_type *x) const;
128  bool equalsC(const char *x) const;
129  int compareTo(const BaseString &x) const; // strcmp clone
130  int compareTo(const value_type *x) const; // strcmp clone
131  int compareToC(const char *x) const; // strcmp clone
132 
134  void setChar(value_type c, uint32 p);
135 
141  void deleteChar(uint32 p);
142 
144  inline void deleteLastChar() { chop(1); }
145 
147  void erase(uint32 p, uint32 len = npos);
148 
150  iterator erase(iterator it);
151 
153  void chop(uint32 len = 1);
154 
156  void clear();
157 
158  iterator begin() {
159  // Since the user could potentially
160  // change the string via the returned
161  // iterator we have to assure we are
162  // pointing to a unique storage.
163  makeUnique();
164 
165  return _str;
166  }
167 
168  iterator end() {
169  return begin() + size();
170  }
171 
172  const_iterator begin() const {
173  return _str;
174  }
175 
176  const_iterator end() const {
177  return begin() + size();
178  }
179 
180  inline const value_type *c_str() const { return _str; }
181  inline uint size() const { return _size; }
182 
183  inline bool empty() const { return (_size == 0); }
184  value_type firstChar() const { return (_size > 0) ? _str[0] : 0; }
185  value_type lastChar() const { return (_size > 0) ? _str[_size - 1] : 0; }
186 
190  value_type &operator[](size_t idx) {
191  assert(_str);
192  assert(idx < _size);
193  return _str[idx];
194  }
195 
199  value_type operator[](size_t idx) const {
200  assert(_str);
201  assert(idx < _size);
202  return _str[idx];
203  }
204 
208  value_type at(size_t idx) const { return operator[](idx); }
209 
213  bool contains(const BaseString &otherString) const;
214  bool contains(value_type x) const;
215 
217  void insertChar(value_type c, uint32 p);
218  void insertString(const value_type *s, uint32 p);
219  void insertString(const BaseString &s, uint32 p);
220 
222  uint32 find(value_type x, uint32 pos = 0) const;
224  size_t find(const value_type *s, uint32 pos = 0) const;
225  uint32 find(const BaseString &str, uint32 pos = 0) const;
226 
228  size_t rfind(const value_type *s) const;
229  size_t rfind(const BaseString &s) const {
230  return rfind(s.c_str());
231  }
232 
234  size_t rfind(value_type c, size_t pos = npos) const;
235 
237  size_t findFirstOf(value_type c, size_t pos = 0) const;
238 
240  size_t findFirstOf(const value_type *chars, size_t pos = 0) const;
241  size_t findFirstOf(const BaseString &chars, size_t pos = 0) const {
242  return findFirstOf(chars.c_str(), pos);
243  }
244 
246  size_t findLastOf(value_type c, size_t pos = npos) const;
247 
249  size_t findLastOf(const value_type *chars, size_t pos = npos) const;
250  size_t findLastOf(const BaseString &chars, size_t pos = npos) const {
251  return findLastOf(chars.c_str(), pos);
252  }
253 
255  size_t findFirstNotOf(value_type c, size_t pos = 0) const;
256 
258  size_t findFirstNotOf(const value_type *chars, size_t pos = 0) const;
259  size_t findFirstNotOf(const BaseString &chars, size_t pos = 0) const {
260  return findFirstNotOf(chars.c_str(), pos);
261  }
262 
264  size_t findLastNotOf(value_type c) const;
265 
267  size_t findLastNotOf(const value_type *chars) const;
268  size_t findLastNotOf(const BaseString &chars) const {
269  return findLastNotOf(chars.c_str());
270  }
271 
286  // Replace 'count' bytes, starting from 'pos' with str.
287  void replace(uint32 pos, uint32 count, const BaseString &str);
288  // The same as above, but accepts a C-like array of characters.
289  void replace(uint32 pos, uint32 count, const value_type *str);
290  // Replace the characters in [begin, end) with str._str.
291  void replace(iterator begin, iterator end, const BaseString &str);
292  // Replace the characters in [begin, end) with str.
293  void replace(iterator begin, iterator end, const value_type *str);
294  // Replace _str[posOri, posOri + countOri) with
295  // str._str[posDest, posDest + countDest)
296  void replace(uint32 posOri, uint32 countOri, const BaseString &str,
297  uint32 posDest, uint32 countDest);
298  // Replace _str[posOri, posOri + countOri) with
299  // str[posDest, posDest + countDest)
300  void replace(uint32 posOri, uint32 countOri, const value_type *str,
301  uint32 posDest, uint32 countDest);
309  void replace(value_type from, value_type to);
310 
314  void assign(const BaseString &str);
315  void assign(BaseString &&str);
316  void assign(size_t count, value_type c);
317  void assign(const value_type *str);
318  void assign(const value_type *str, size_t count);
319 
323  void append(const value_type *str);
324  void append(size_t count, value_type c);
325  void append(const BaseString &str);
326 
328  void append(const value_type *begin, const value_type *end);
329 
333  inline void push_back(value_type c) {
334  append(1, c);
335  }
336 
346  void wordWrap(const uint32 maxLength);
347 
349  uint64 asUint64() const;
350 
352  uint64 asUint64Ext() const;
353 
360  void toLowercase();
361 
368  void toUppercase();
369 
374  void trim();
375 
376  uint hash() const;
377 
378 protected:
379  ~BaseString();
380 
381  void makeUnique() {
382  ensureCapacity(_size, true);
383  }
384 
385  void ensureCapacity(uint32 new_size, bool keep_old);
386  void incRefCount() const;
387  void decRefCount(int *oldRefCount);
388  void initWithValueTypeChar(size_t count, value_type c);
389  void initWithValueTypeStr(const value_type *str, uint32 len);
390 
391  void assignInsert(const value_type *str, uint32 p);
392  void assignInsert(value_type c, uint32 p);
393  void assignInsert(const BaseString &str, uint32 p);
394 
395  bool pointerInOwnBuffer(const value_type *str) const;
396 
397  uint getUnsignedValue(uint pos) const;
398 
399  void toCase(int (*caseChangeFunc)(int));
400 
401  static size_t cStrLen(const value_type *str);
402  static const value_type *cMemChr(const value_type *ptr, value_type c, size_t count);
403  static value_type *cMemChr(value_type *ptr, value_type c, size_t count);
404  static int cMemCmp(const value_type* ptr1, const value_type* ptr2, size_t count);
405  static void cMemSet(value_type *ptr, value_type c, size_t count);
406 };
407 }
408 #endif
value_type operator[](size_t idx) const
Definition: str-base.h:199
value_type & operator[](size_t idx)
Definition: str-base.h:190
size_t findFirstNotOf(value_type c, size_t pos=0) const
bool equals(const BaseString &x) const
uint64 asUint64() const
value_type at(size_t idx) const
Definition: str-base.h:208
void insertChar(value_type c, uint32 p)
uint64 asUint64Ext() const
void deleteChar(uint32 p)
value_type _storage[_builtinCapacity]
Definition: str-base.h:68
constexpr BaseString(value_type c)
Definition: str-base.h:88
size_t findLastOf(value_type c, size_t pos=npos) const
size_t findLastNotOf(value_type c) const
uint32 find(value_type x, uint32 pos=0) const
size_t findFirstOf(value_type c, size_t pos=0) const
Definition: str-base.h:32
void chop(uint32 len=1)
struct Common::BaseString::@23::@25 _extern
void push_back(value_type c)
Definition: str-base.h:333
uint32 _size
Definition: str-base.h:55
constexpr BaseString()
Definition: str-base.h:85
static const uint32 _builtinCapacity
Definition: str-base.h:48
Definition: algorithm.h:29
void deleteLastChar()
Definition: str-base.h:144
void erase(uint32 p, uint32 len=npos)
size_t rfind(const value_type *s) const
void append(const value_type *str)
void assign(const BaseString &str)
void replace(uint32 pos, uint32 count, const BaseString &str)
void setChar(value_type c, uint32 p)
value_type * _str
Definition: str-base.h:61
void wordWrap(const uint32 maxLength)
bool contains(const BaseString &otherString) const