| // 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 |