diff options
author | Johannes Schickel | 2013-11-23 21:34:54 +0100 |
---|---|---|
committer | Johannes Schickel | 2013-11-23 21:34:54 +0100 |
commit | b90400da44e4438c5a00773e6d2af82880dc45f4 (patch) | |
tree | 8c18975e8e1082b7a738c2341a280f0864e50702 /common/ustr.h | |
parent | 1a6f9378aa32b3d2877c1ee90e212bde82ef832b (diff) | |
download | scummvm-rg350-b90400da44e4438c5a00773e6d2af82880dc45f4.tar.gz scummvm-rg350-b90400da44e4438c5a00773e6d2af82880dc45f4.tar.bz2 scummvm-rg350-b90400da44e4438c5a00773e6d2af82880dc45f4.zip |
COMMON: Add simple UTF-32 string class U32String.
Diffstat (limited to 'common/ustr.h')
-rw-r--r-- | common/ustr.h | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/common/ustr.h b/common/ustr.h new file mode 100644 index 0000000000..e549c5f9c4 --- /dev/null +++ b/common/ustr.h @@ -0,0 +1,155 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef COMMON_USTR_H +#define COMMON_USTR_H + +#include "common/scummsys.h" + +namespace Common { + +class U32String { +public: + static const uint32 npos = 0xFFFFFFFF; + + typedef uint32 value_type; + typedef uint32 unsigned_type; +private: + /** + * The size of the internal storage. Increasing this means less heap + * allocations are needed, at the cost of more stack memory usage, + * and of course lots of wasted memory. + */ + static const uint32 _builtinCapacity = 32; + + /** + * Length of the string. + */ + uint32 _size; + + /** + * Pointer to the actual string storage. Either points to _storage, + * or to a block allocated on the heap via malloc. + */ + value_type *_str; + + + union { + /** + * Internal string storage. + */ + value_type _storage[_builtinCapacity]; + /** + * External string storage data -- the refcounter, and the + * capacity of the string _str points to. + */ + struct { + mutable int *_refCount; + uint32 _capacity; + } _extern; + }; + + inline bool isStorageIntern() const { + return _str == _storage; + } + +public: + U32String() : _size(0), _str(_storage) { _storage[0] = 0; } + + explicit U32String(const value_type *str); + + U32String(const value_type *str, uint32 len); + + U32String(const value_type *beginP, const value_type *endP); + + U32String(const U32String &str); + + ~U32String(); + + U32String &operator=(const U32String &str); + U32String &operator+=(const U32String &str); + U32String &operator+=(value_type c); + + bool operator==(const U32String &x) const { return equals(x); } + + bool equals(const U32String &x) const; + + bool contains(value_type x) const; + + inline const value_type *c_str() const { return _str; } + inline uint32 size() const { return _size; } + + inline bool empty() const { return (_size == 0); } + + value_type operator[](int idx) const { + assert(_str && idx >= 0 && idx < (int)_size); + return _str[idx]; + } + + /** Remove the character at position p from the string. */ + void deleteChar(uint32 p); + + /** Clears the string, making it empty. */ + void clear(); + + /** Convert all characters in the string to lowercase. */ + void toLowercase(); + + /** Convert all characters in the string to uppercase. */ + void toUppercase(); + + uint32 find(const U32String &str, uint32 pos = 0) const; + + typedef value_type * iterator; + typedef const value_type * const_iterator; + + iterator begin() { + // Since the user could potentially + // change the string via the returned + // iterator we have to assure we are + // pointing to a unique storage. + makeUnique(); + + return _str; + } + + iterator end() { + return begin() + size(); + } + + const_iterator begin() const { + return _str; + } + + const_iterator end() const { + return begin() + size(); + } +private: + void makeUnique(); + void ensureCapacity(uint32 new_size, bool keep_old); + void incRefCount() const; + void decRefCount(int *oldRefCount); + void initWithCStr(const value_type *str, uint32 len); +}; + +} // End of namespace Common + +#endif |