1// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/i18n/char_iterator.h"
6
7#include "third_party/icu/source/common/unicode/utf8.h"
8#include "third_party/icu/source/common/unicode/utf16.h"
9
10namespace base {
11namespace i18n {
12
13UTF8CharIterator::UTF8CharIterator(const std::string* str)
14    : str_(reinterpret_cast<const uint8_t*>(str->data())),
15      len_(str->size()),
16      array_pos_(0),
17      next_pos_(0),
18      char_pos_(0),
19      char_(0) {
20  if (len_)
21    U8_NEXT(str_, next_pos_, len_, char_);
22}
23
24UTF8CharIterator::~UTF8CharIterator() {
25}
26
27bool UTF8CharIterator::Advance() {
28  if (array_pos_ >= len_)
29    return false;
30
31  array_pos_ = next_pos_;
32  char_pos_++;
33  if (next_pos_ < len_)
34    U8_NEXT(str_, next_pos_, len_, char_);
35
36  return true;
37}
38
39UTF16CharIterator::UTF16CharIterator(const string16* str)
40    : str_(reinterpret_cast<const char16*>(str->data())),
41      len_(str->size()),
42      array_pos_(0),
43      next_pos_(0),
44      char_pos_(0),
45      char_(0) {
46  if (len_)
47    ReadChar();
48}
49
50UTF16CharIterator::UTF16CharIterator(const char16* str, size_t str_len)
51    : str_(str),
52      len_(str_len),
53      array_pos_(0),
54      next_pos_(0),
55      char_pos_(0),
56      char_(0) {
57  if (len_)
58    ReadChar();
59}
60
61UTF16CharIterator::~UTF16CharIterator() {
62}
63
64bool UTF16CharIterator::Advance() {
65  if (array_pos_ >= len_)
66    return false;
67
68  array_pos_ = next_pos_;
69  char_pos_++;
70  if (next_pos_ < len_)
71    ReadChar();
72
73  return true;
74}
75
76void UTF16CharIterator::ReadChar() {
77  // This is actually a huge macro, so is worth having in a separate function.
78  U16_NEXT(str_, next_pos_, len_, char_);
79}
80
81}  // namespace i18n
82}  // namespace base
83