1// Copyright 2013 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 "ui/app_list/search/tokenized_string_char_iterator.h"
6
7#include "base/i18n/char_iterator.h"
8#include "base/logging.h"
9#include "third_party/icu/source/common/unicode/utf16.h"
10
11namespace app_list {
12
13TokenizedStringCharIterator::State::State() : token_index(0u), char_index(0) {}
14
15TokenizedStringCharIterator::State::State(size_t token_index, int char_index)
16    : token_index(token_index),
17      char_index(char_index) {
18}
19
20TokenizedStringCharIterator::TokenizedStringCharIterator(
21    const TokenizedString& tokenized)
22    : tokens_(tokenized.tokens()),
23      mappings_(tokenized.mappings()),
24      current_token_(0) {
25  CreateTokenCharIterator();
26}
27
28TokenizedStringCharIterator::~TokenizedStringCharIterator() {}
29
30bool TokenizedStringCharIterator::NextChar() {
31  if (current_token_iter_) {
32    current_token_iter_->Advance();
33    if (!current_token_iter_->end())
34      return true;
35  }
36
37  return NextToken();
38}
39
40bool TokenizedStringCharIterator::NextToken() {
41  if (current_token_ < tokens_.size()) {
42    ++current_token_;
43    CreateTokenCharIterator();
44  }
45
46  return !!current_token_iter_;
47}
48
49int32 TokenizedStringCharIterator::Get() const {
50  return current_token_iter_ ? current_token_iter_->get() : 0;
51}
52
53int32 TokenizedStringCharIterator::GetArrayPos() const {
54  DCHECK(current_token_iter_);
55  return mappings_[current_token_].start() +
56      current_token_iter_->array_pos();
57}
58
59size_t TokenizedStringCharIterator::GetCharSize() const {
60  return current_token_iter_ ? U16_LENGTH(Get()) : 0;
61}
62
63bool TokenizedStringCharIterator::IsFirstCharOfToken() const {
64  return current_token_iter_ && current_token_iter_->char_pos() == 0;
65}
66
67TokenizedStringCharIterator::State
68TokenizedStringCharIterator::GetState() const {
69  return State(current_token_,
70               current_token_iter_ ? current_token_iter_->char_pos() : 0);
71}
72
73void TokenizedStringCharIterator::SetState(const State& state) {
74  current_token_ = state.token_index;
75  CreateTokenCharIterator();
76  if (current_token_iter_) {
77    while (current_token_iter_->char_pos() < state.char_index)
78      current_token_iter_->Advance();
79  }
80}
81
82void TokenizedStringCharIterator::CreateTokenCharIterator() {
83  if (current_token_ == tokens_.size()) {
84    current_token_iter_.reset();
85    return;
86  }
87
88  current_token_iter_.reset(
89      new base::i18n::UTF16CharIterator(&tokens_[current_token_]));
90}
91
92}  // namespace app_list
93