// Copyright (C) 2011 The Libphonenumber Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Author: Philippe Liard #ifndef I18N_PHONENUMBERS_UNICODESTRING_H_ #define I18N_PHONENUMBERS_UNICODESTRING_H_ #include "phonenumbers/utf/unicodetext.h" #include #include namespace i18n { namespace phonenumbers { // This class supports the minimal subset of icu::UnicodeString needed by // AsYouTypeFormatter in order to let the libphonenumber not depend on ICU // which is not available by default on some systems, such as iOS. class UnicodeString { public: UnicodeString() : cached_index_(-1) {} // Constructs a new unicode string copying the provided C string. explicit UnicodeString(const char* utf8) : text_(UTF8ToUnicodeText(utf8, std::strlen(utf8))), cached_index_(-1) {} // Constructs a new unicode string containing the provided codepoint. explicit UnicodeString(char32 codepoint) : cached_index_(-1) { append(codepoint); } UnicodeString(const UnicodeString& src) : text_(src.text_), cached_index_(-1) {} UnicodeString& operator=(const UnicodeString& src); bool operator==(const UnicodeString& rhs) const; void append(const UnicodeString& unicode_string); inline void append(char32 codepoint) { invalidateCachedIndex(); text_.push_back(codepoint); } typedef UnicodeText::const_iterator const_iterator; inline const_iterator begin() const { return text_.begin(); } inline const_iterator end() const { return text_.end(); } // Returns the index of the provided codepoint or -1 if not found. int indexOf(char32 codepoint) const; // Returns the number of codepoints contained in the unicode string. inline int length() const { return text_.size(); } // Clears the unicode string. inline void remove() { invalidateCachedIndex(); text_.clear(); } // Replaces the substring located at [ start, start + length - 1 ] with the // provided unicode string. void replace(int start, int length, const UnicodeString& src); void setCharAt(int pos, char32 c); // Copies the provided C string. inline void setTo(const char* s, size_t len) { invalidateCachedIndex(); text_.CopyUTF8(s, len); } // Returns the substring located at [ start, start + length - 1 ] without // copying the underlying C string. If one of the provided parameters is out // of range, the function returns an empty unicode string. UnicodeString tempSubString( int start, int length = std::numeric_limits::max()) const; inline void toUTF8String(string& out) const { out = UnicodeTextToUTF8(text_); } char32 operator[](int index) const; private: UnicodeText text_; // As UnicodeText doesn't provide random access, an operator[] implementation // would naively iterate from the beginning of the string to the supplied // index which would be inefficient. // As operator[] is very likely to be called in a loop with consecutive // indexes, we save the corresponding iterator so we can reuse it the next // time it is called. // The following function which invalidates the cached index corresponding to // the iterator position must be called every time the unicode string is // modified (i.e. in all the non-const methods). inline void invalidateCachedIndex() { cached_index_ = -1; } // Iterator corresponding to the cached index below, used by operator[]. mutable UnicodeText::const_iterator cached_it_; mutable int cached_index_; }; } // namespace phonenumbers } // namespace i18n #endif // I18N_PHONENUMBERS_UNICODESTRING_H_