- add sources.
[platform/framework/web/crosswalk.git] / src / base / i18n / char_iterator.cc
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
10 namespace base {
11 namespace i18n {
12
13 UTF8CharIterator::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
24 UTF8CharIterator::~UTF8CharIterator() {
25 }
26
27 bool 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
39 UTF16CharIterator::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
50 UTF16CharIterator::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
61 UTF16CharIterator::~UTF16CharIterator() {
62 }
63
64 bool 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
76 void 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