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#ifndef UI_APP_LIST_SEARCH_TERM_BREAK_ITERATOR_H_
6#define UI_APP_LIST_SEARCH_TERM_BREAK_ITERATOR_H_
7
8#include "base/basictypes.h"
9#include "base/memory/scoped_ptr.h"
10#include "base/strings/string16.h"
11#include "ui/app_list/app_list_export.h"
12
13namespace base {
14namespace i18n {
15class UTF16CharIterator;
16}
17}
18
19namespace app_list {
20
21// TermBreakIterator breaks terms out of a word. Terms are broken on
22// camel case boundaries and alpha/number boundaries. Numbers are defined
23// as [0-9\.,]+.
24//  e.g.
25//   CamelCase -> Camel, Case
26//   Python2.7 -> Python, 2.7
27class APP_LIST_EXPORT TermBreakIterator {
28 public:
29  // Note that |word| must out live this iterator.
30  explicit TermBreakIterator(const base::string16& word);
31  ~TermBreakIterator();
32
33  // Advance to the next term. Returns false if at the end of the word.
34  bool Advance();
35
36  // Returns the current term, which is the substr of |word_| in range
37  // [prev_, pos_).
38  const base::string16 GetCurrentTerm() const;
39
40  size_t prev() const { return prev_; }
41  size_t pos() const { return pos_; }
42
43  static const size_t npos = static_cast<size_t>(-1);
44
45 private:
46  enum State {
47    STATE_START,   // Initial state
48    STATE_NUMBER,  // Current char is a number [0-9\.,].
49    STATE_UPPER,   // Current char is upper case.
50    STATE_LOWER,   // Current char is lower case.
51    STATE_CHAR,    // Current char has no case, e.g. a cjk char.
52    STATE_LAST,
53  };
54
55  // Returns new state for given |ch|.
56  State GetNewState(base::char16 ch);
57
58  const base::string16& word_;
59  size_t prev_;
60  size_t pos_;
61
62  scoped_ptr<base::i18n::UTF16CharIterator> iter_;
63  State state_;
64
65  DISALLOW_COPY_AND_ASSIGN(TermBreakIterator);
66};
67
68}  // namespace app_list
69
70#endif  // UI_APP_LIST_SEARCH_TERM_BREAK_ITERATOR_H_
71