diff options
author | Matthias Schiffer <matthias@gamezock.de> | 2009-09-27 19:58:24 +0200 |
---|---|---|
committer | Matthias Schiffer <matthias@gamezock.de> | 2009-09-27 19:58:24 +0200 |
commit | b40ba0cf91603b695f1f2380cbd39966a458f22f (patch) | |
tree | 1fec48ddc59eb1392fac38495b230e4b2cbf7528 /src/Core/String.h | |
parent | e1d8490f0654a3da0b900407d80d91d8d0da68c8 (diff) | |
download | mad-b40ba0cf91603b695f1f2380cbd39966a458f22f.tar mad-b40ba0cf91603b695f1f2380cbd39966a458f22f.zip |
Use Unicode-aware String class instead of std::string
Diffstat (limited to 'src/Core/String.h')
-rw-r--r-- | src/Core/String.h | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/src/Core/String.h b/src/Core/String.h new file mode 100644 index 0000000..1c93902 --- /dev/null +++ b/src/Core/String.h @@ -0,0 +1,88 @@ +/* + * String.h + * + * Copyright (C) 2009 Matthias Schiffer <matthias@gamezock.de> + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef MAD_CORE_STRING_H_ +#define MAD_CORE_STRING_H_ + +#include "export.h" + +#include <ostream> +#include <string> +#include <boost/cstdint.hpp> +#include <boost/scoped_array.hpp> + +#define U_USING_ICU_NAMESPACE 0 +#include <unicode/unistr.h> + +namespace Mad { +namespace Core { + +class MAD_CORE_EXPORT String : public icu::UnicodeString { + private: + std::string extractCodepage(const char *codepage) const { + boost::uint32_t len = static_cast<boost::uint32_t>(icu::UnicodeString::extract(0, length(), 0, codepage)); + + boost::scoped_array<char> buf(new char[len]); + icu::UnicodeString::extract(0, length(), buf.get(), len, codepage); + + return std::string(buf.get(), len); + } + + public: + String() {} + String(const icu::UnicodeString &str) : icu::UnicodeString(str) {} + String(const char *str) : icu::UnicodeString(str, -1, US_INV) {} + + String substr(boost::int32_t start, boost::int32_t length = -1) const { + if(length < 0) + return icu::UnicodeString(*this, start); + else + return icu::UnicodeString(*this, start, length); + } + + bool matches(const String &str) const { + return (str.caseCompare(*this, 0) == 0); + } + + boost::int32_t findFirstOf(const String &chars, boost::int32_t start = 0) const; + boost::int32_t findFirstNotOf(const String &chars, boost::int32_t start = 0) const; + + std::string extract() const { + return extractCodepage(0); + } + + std::string extractUTF8() const { + return extractCodepage("UTF-8"); + } + + static String fromUTF8(const char *str) { + return icu::UnicodeString(str, "UTF-8"); + } +}; + +template<typename ElemType, typename Traits> +std::basic_ostream<ElemType, Traits>& operator<<(std::basic_ostream<ElemType, Traits> &stream, const String &string) { + stream << string.extract(); + return stream; +} + +} +} + +#endif /* MAD_CORE_STRING_H_ */ |