|  | // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "base/i18n/char_iterator.h" | 
|  |  | 
|  | #include "third_party/icu/source/common/unicode/utf8.h" | 
|  | #include "third_party/icu/source/common/unicode/utf16.h" | 
|  |  | 
|  | namespace base { | 
|  | namespace i18n { | 
|  |  | 
|  | UTF8CharIterator::UTF8CharIterator(const std::string* str) | 
|  | : str_(reinterpret_cast<const uint8_t*>(str->data())), | 
|  | len_(str->size()), | 
|  | array_pos_(0), | 
|  | next_pos_(0), | 
|  | char_pos_(0), | 
|  | char_(0) { | 
|  | if (len_) | 
|  | U8_NEXT(str_, next_pos_, len_, char_); | 
|  | } | 
|  |  | 
|  | UTF8CharIterator::~UTF8CharIterator() = default; | 
|  |  | 
|  | bool UTF8CharIterator::Advance() { | 
|  | if (array_pos_ >= len_) | 
|  | return false; | 
|  |  | 
|  | array_pos_ = next_pos_; | 
|  | char_pos_++; | 
|  | if (next_pos_ < len_) | 
|  | U8_NEXT(str_, next_pos_, len_, char_); | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | UTF16CharIterator::UTF16CharIterator(const string16* str) | 
|  | : str_(reinterpret_cast<const char16*>(str->data())), | 
|  | len_(str->size()), | 
|  | array_pos_(0), | 
|  | next_pos_(0), | 
|  | char_pos_(0), | 
|  | char_(0) { | 
|  | if (len_) | 
|  | ReadChar(); | 
|  | } | 
|  |  | 
|  | UTF16CharIterator::UTF16CharIterator(const char16* str, size_t str_len) | 
|  | : str_(str), | 
|  | len_(str_len), | 
|  | array_pos_(0), | 
|  | next_pos_(0), | 
|  | char_pos_(0), | 
|  | char_(0) { | 
|  | if (len_) | 
|  | ReadChar(); | 
|  | } | 
|  |  | 
|  | UTF16CharIterator::~UTF16CharIterator() = default; | 
|  |  | 
|  | bool UTF16CharIterator::Advance() { | 
|  | if (array_pos_ >= len_) | 
|  | return false; | 
|  |  | 
|  | array_pos_ = next_pos_; | 
|  | char_pos_++; | 
|  | if (next_pos_ < len_) | 
|  | ReadChar(); | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | void UTF16CharIterator::ReadChar() { | 
|  | // This is actually a huge macro, so is worth having in a separate function. | 
|  | U16_NEXT(str_, next_pos_, len_, char_); | 
|  | } | 
|  |  | 
|  | }  // namespace i18n | 
|  | }  // namespace base |