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