• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
operator =(const UnicodeString & src)29 UnicodeString& UnicodeString::operator=(const UnicodeString& src) {
30   if (&src != this) {
31     invalidateCachedIndex();
32     text_ = src.text_;
33   }
34   return *this;
35 }
36 
operator ==(const UnicodeString & rhs) const37 bool UnicodeString::operator==(const UnicodeString& rhs) const {
38   return equal(text_.begin(), text_.end(), rhs.text_.begin());
39 }
40 
append(const UnicodeString & unicode_string)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 
indexOf(char32 codepoint) const49 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 
replace(int start,int length,const UnicodeString & src)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 
setCharAt(int pos,char32 c)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 
tempSubString(int start,int length) const86 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 
operator [](int index) const103 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