11767c5feSopenharmony_ci// Copyright (C) 2011 The Libphonenumber Authors 21767c5feSopenharmony_ci// 31767c5feSopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License"); 41767c5feSopenharmony_ci// you may not use this file except in compliance with the License. 51767c5feSopenharmony_ci// You may obtain a copy of the License at 61767c5feSopenharmony_ci// 71767c5feSopenharmony_ci// http://www.apache.org/licenses/LICENSE-2.0 81767c5feSopenharmony_ci// 91767c5feSopenharmony_ci// Unless required by applicable law or agreed to in writing, software 101767c5feSopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS, 111767c5feSopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121767c5feSopenharmony_ci// See the License for the specific language governing permissions and 131767c5feSopenharmony_ci// limitations under the License. 141767c5feSopenharmony_ci 151767c5feSopenharmony_ci// Author: Philippe Liard 161767c5feSopenharmony_ci 171767c5feSopenharmony_ci#include "phonenumbers/unicodestring.h" 181767c5feSopenharmony_ci 191767c5feSopenharmony_ci#include <algorithm> 201767c5feSopenharmony_ci#include <cassert> 211767c5feSopenharmony_ci#include <iterator> 221767c5feSopenharmony_ci 231767c5feSopenharmony_ciusing std::advance; 241767c5feSopenharmony_ciusing std::equal; 251767c5feSopenharmony_ci 261767c5feSopenharmony_cinamespace i18n { 271767c5feSopenharmony_cinamespace phonenumbers { 281767c5feSopenharmony_ci 291767c5feSopenharmony_ciUnicodeString& UnicodeString::operator=(const UnicodeString& src) { 301767c5feSopenharmony_ci if (&src != this) { 311767c5feSopenharmony_ci invalidateCachedIndex(); 321767c5feSopenharmony_ci text_ = src.text_; 331767c5feSopenharmony_ci } 341767c5feSopenharmony_ci return *this; 351767c5feSopenharmony_ci} 361767c5feSopenharmony_ci 371767c5feSopenharmony_cibool UnicodeString::operator==(const UnicodeString& rhs) const { 381767c5feSopenharmony_ci return equal(text_.begin(), text_.end(), rhs.text_.begin()); 391767c5feSopenharmony_ci} 401767c5feSopenharmony_ci 411767c5feSopenharmony_civoid UnicodeString::append(const UnicodeString& unicode_string) { 421767c5feSopenharmony_ci invalidateCachedIndex(); 431767c5feSopenharmony_ci for (UnicodeString::const_iterator it = unicode_string.begin(); 441767c5feSopenharmony_ci it != unicode_string.end(); ++it) { 451767c5feSopenharmony_ci append(*it); 461767c5feSopenharmony_ci } 471767c5feSopenharmony_ci} 481767c5feSopenharmony_ci 491767c5feSopenharmony_ciint UnicodeString::indexOf(char32 codepoint) const { 501767c5feSopenharmony_ci int pos = 0; 511767c5feSopenharmony_ci for (UnicodeText::const_iterator it = text_.begin(); it != text_.end(); 521767c5feSopenharmony_ci ++it, ++pos) { 531767c5feSopenharmony_ci if (*it == codepoint) { 541767c5feSopenharmony_ci return pos; 551767c5feSopenharmony_ci } 561767c5feSopenharmony_ci } 571767c5feSopenharmony_ci return -1; 581767c5feSopenharmony_ci} 591767c5feSopenharmony_ci 601767c5feSopenharmony_civoid UnicodeString::replace(int start, int length, const UnicodeString& src) { 611767c5feSopenharmony_ci assert(length >= 0 && length <= this->length()); 621767c5feSopenharmony_ci invalidateCachedIndex(); 631767c5feSopenharmony_ci UnicodeText::const_iterator start_it = text_.begin(); 641767c5feSopenharmony_ci advance(start_it, start); 651767c5feSopenharmony_ci UnicodeText unicode_text; 661767c5feSopenharmony_ci unicode_text.append(text_.begin(), start_it); 671767c5feSopenharmony_ci unicode_text.append(src.text_); 681767c5feSopenharmony_ci advance(start_it, length); 691767c5feSopenharmony_ci unicode_text.append(start_it, text_.end()); 701767c5feSopenharmony_ci text_ = unicode_text; 711767c5feSopenharmony_ci} 721767c5feSopenharmony_ci 731767c5feSopenharmony_civoid UnicodeString::setCharAt(int pos, char32 c) { 741767c5feSopenharmony_ci assert(pos < length()); 751767c5feSopenharmony_ci invalidateCachedIndex(); 761767c5feSopenharmony_ci UnicodeText::const_iterator pos_it = text_.begin(); 771767c5feSopenharmony_ci advance(pos_it, pos); 781767c5feSopenharmony_ci UnicodeText unicode_text; 791767c5feSopenharmony_ci unicode_text.append(text_.begin(), pos_it); 801767c5feSopenharmony_ci unicode_text.push_back(c); 811767c5feSopenharmony_ci ++pos_it; 821767c5feSopenharmony_ci unicode_text.append(pos_it, text_.end()); 831767c5feSopenharmony_ci text_ = unicode_text; 841767c5feSopenharmony_ci} 851767c5feSopenharmony_ci 861767c5feSopenharmony_ciUnicodeString UnicodeString::tempSubString(int start, int length) const { 871767c5feSopenharmony_ci const int unicodestring_length = this->length(); 881767c5feSopenharmony_ci if (length == std::numeric_limits<int>::max()) { 891767c5feSopenharmony_ci length = unicodestring_length - start; 901767c5feSopenharmony_ci } 911767c5feSopenharmony_ci if (start > unicodestring_length || length > unicodestring_length) { 921767c5feSopenharmony_ci return UnicodeString(""); 931767c5feSopenharmony_ci } 941767c5feSopenharmony_ci UnicodeText::const_iterator start_it = text_.begin(); 951767c5feSopenharmony_ci advance(start_it, start); 961767c5feSopenharmony_ci UnicodeText::const_iterator end_it = start_it; 971767c5feSopenharmony_ci advance(end_it, length); 981767c5feSopenharmony_ci UnicodeString substring; 991767c5feSopenharmony_ci substring.text_.PointTo(start_it, end_it); 1001767c5feSopenharmony_ci return substring; 1011767c5feSopenharmony_ci} 1021767c5feSopenharmony_ci 1031767c5feSopenharmony_cichar32 UnicodeString::operator[](int index) const { 1041767c5feSopenharmony_ci assert(index < length()); 1051767c5feSopenharmony_ci if (cached_index_ == -1 || cached_index_ > index) { 1061767c5feSopenharmony_ci cached_it_ = text_.begin(); 1071767c5feSopenharmony_ci cached_index_ = 0; 1081767c5feSopenharmony_ci } 1091767c5feSopenharmony_ci for (; cached_index_ < index; ++cached_index_, ++cached_it_) {} 1101767c5feSopenharmony_ci return *cached_it_; 1111767c5feSopenharmony_ci} 1121767c5feSopenharmony_ci 1131767c5feSopenharmony_ci} // namespace phonenumbers 1141767c5feSopenharmony_ci} // namespace i18n 115