From b90400da44e4438c5a00773e6d2af82880dc45f4 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 23 Nov 2013 21:34:54 +0100 Subject: COMMON: Add simple UTF-32 string class U32String. --- common/ustr.h | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 common/ustr.h (limited to 'common/ustr.h') 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 -- cgit v1.2.3 From 4c15e51ab540abb4843268921bdd0d27c6e0f9bb Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 23 Nov 2013 21:34:54 +0100 Subject: COMMON: Document U32String a bit better. --- common/ustr.h | 45 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) (limited to 'common/ustr.h') diff --git a/common/ustr.h b/common/ustr.h index e549c5f9c4..ab9dac70de 100644 --- a/common/ustr.h +++ b/common/ustr.h @@ -26,6 +26,18 @@ namespace Common { +/** + * Very simple string class for UTF-32 strings in ScummVM. The main intention + * behind this class is to feature a simple way of displaying UTF-32 strings + * through the Graphics::Font API. + * + * Please note that operations like equals, deleteCharacter, toUppercase, etc. + * are only very simplified convenience operations. They might not fully work + * as you would expect for a proper UTF-32 string class. + * + * The presence of \0 characters in the string will cause undefined + * behavior in some operations. + */ class U32String { public: static const uint32 npos = 0xFFFFFFFF; @@ -72,14 +84,19 @@ private: } public: + /** Construct a new empty string. */ U32String() : _size(0), _str(_storage) { _storage[0] = 0; } + /** Construct a new string from the given NULL-terminated C string. */ explicit U32String(const value_type *str); + /** Construct a new string containing exactly len characters read from address str. */ U32String(const value_type *str, uint32 len); + /** Construct a new string containing the characters between beginP (including) and endP (excluding). */ U32String(const value_type *beginP, const value_type *endP); + /** Construct a copy of the given string. */ U32String(const U32String &str); ~U32String(); @@ -88,8 +105,16 @@ public: U32String &operator+=(const U32String &str); U32String &operator+=(value_type c); + /** + * Equivalence comparison operator. + * @see equals + */ bool operator==(const U32String &x) const { return equals(x); } + /** + * Compares whether two U32String are the same based on memory comparison. + * This does *not* do comparison based on canonical equivalence. + */ bool equals(const U32String &x) const; bool contains(value_type x) const; @@ -104,16 +129,30 @@ public: return _str[idx]; } - /** Remove the character at position p from the string. */ + /** + * Removes the value at position p from the string. + * Using this on decomposed characters will not remove the whole + * character! + */ void deleteChar(uint32 p); /** Clears the string, making it empty. */ void clear(); - /** Convert all characters in the string to lowercase. */ + /** + * Convert all characters in the string to lowercase. + * + * Be aware that this only affects the case of ASCII characters. All + * other characters will not be touched at all. + */ void toLowercase(); - /** Convert all characters in the string to uppercase. */ + /** + * Convert all characters in the string to uppercase. + * + * Be aware that this only affects the case of ASCII characters. All + * other characters will not be touched at all. + */ void toUppercase(); uint32 find(const U32String &str, uint32 pos = 0) const; -- cgit v1.2.3 From 854e22b38bb901d339d45a4d2a58786acd821c7c Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Tue, 18 Feb 2014 02:34:18 +0100 Subject: COMMON: Make GPL headers consistent in themselves. --- common/ustr.h | 1 + 1 file changed, 1 insertion(+) (limited to 'common/ustr.h') diff --git a/common/ustr.h b/common/ustr.h index ab9dac70de..0059a1eb96 100644 --- a/common/ustr.h +++ b/common/ustr.h @@ -17,6 +17,7 @@ * 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 -- cgit v1.2.3