Home | History | Annotate | Download | only in phonenumbers
      1 // Copyright (C) 2011 The Libphonenumber Authors
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 // http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 // Author: Philippe Liard
     16 
     17 #include "phonenumbers/unicodestring.h"
     18 
     19 #include <algorithm>
     20 #include <cassert>
     21 #include <iterator>
     22 
     23 using std::advance;
     24 using std::equal;
     25 
     26 namespace i18n {
     27 namespace phonenumbers {
     28 
     29 UnicodeString& UnicodeString::operator=(const UnicodeString& src) {
     30   if (&src != this) {
     31     invalidateCachedIndex();
     32     text_ = src.text_;
     33   }
     34   return *this;
     35 }
     36 
     37 bool UnicodeString::operator==(const UnicodeString& rhs) const {
     38   return equal(text_.begin(), text_.end(), rhs.text_.begin());
     39 }
     40 
     41 void UnicodeString::append(const UnicodeString& unicode_string) {
     42   invalidateCachedIndex();
     43   for (UnicodeString::const_iterator it = unicode_string.begin();
     44        it != unicode_string.end(); ++it) {
     45     append(*it);
     46   }
     47 }
     48 
     49 int UnicodeString::indexOf(char32 codepoint) const {
     50   int pos = 0;
     51   for (UnicodeText::const_iterator it = text_.begin(); it != text_.end();
     52        ++it, ++pos) {
     53     if (*it == codepoint) {
     54       return pos;
     55     }
     56   }
     57   return -1;
     58 }
     59 
     60 void UnicodeString::replace(int start, int length, const UnicodeString& src) {
     61   assert(length >= 0 && length <= this->length());
     62   invalidateCachedIndex();
     63   UnicodeText::const_iterator start_it = text_.begin();
     64   advance(start_it, start);
     65   UnicodeText unicode_text;
     66   unicode_text.append(text_.begin(), start_it);
     67   unicode_text.append(src.text_);
     68   advance(start_it, length);
     69   unicode_text.append(start_it, text_.end());
     70   text_ = unicode_text;
     71 }
     72 
     73 void UnicodeString::setCharAt(int pos, char32 c) {
     74   assert(pos < length());
     75   invalidateCachedIndex();
     76   UnicodeText::const_iterator pos_it = text_.begin();
     77   advance(pos_it, pos);
     78   UnicodeText unicode_text;
     79   unicode_text.append(text_.begin(), pos_it);
     80   unicode_text.push_back(c);
     81   ++pos_it;
     82   unicode_text.append(pos_it, text_.end());
     83   text_ = unicode_text;
     84 }
     85 
     86 UnicodeString UnicodeString::tempSubString(int start, int length) const {
     87   const int unicodestring_length = this->length();
     88   if (length == std::numeric_limits<int>::max()) {
     89     length = unicodestring_length - start;
     90   }
     91   if (start > unicodestring_length || length > unicodestring_length) {
     92     return UnicodeString("");
     93   }
     94   UnicodeText::const_iterator start_it = text_.begin();
     95   advance(start_it, start);
     96   UnicodeText::const_iterator end_it = start_it;
     97   advance(end_it, length);
     98   UnicodeString substring;
     99   substring.text_.PointTo(start_it, end_it);
    100   return substring;
    101 }
    102 
    103 char32 UnicodeString::operator[](int index) const {
    104   assert(index < length());
    105   if (cached_index_ == -1 || cached_index_ > index) {
    106     cached_it_ = text_.begin();
    107     cached_index_ = 0;
    108   }
    109   for (; cached_index_ < index; ++cached_index_, ++cached_it_) {}
    110   return *cached_it_;
    111 }
    112 
    113 }  // namespace phonenumbers
    114 }  // namespace i18n
    115