1/* -*- c-basic-offset: 2 -*- */
2/*
3 Copyright(C) 2011-2016 Brazil
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Lesser General Public
7 License version 2.1 as published by the Free Software Foundation.
8
9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with this library; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17*/
18
19#pragma once
20
21#include "cursor.hpp"
22#include "vector.hpp"
23
24namespace grn {
25namespace dat {
26
27class Trie;
28
29class GRN_DAT_API PrefixCursor : public Cursor {
30 public:
31 PrefixCursor();
32 ~PrefixCursor();
33
34 void open(const Trie &trie,
35 const String &str,
36 UInt32 min_length = 0,
37 UInt32 offset = 0,
38 UInt32 limit = MAX_UINT32,
39 UInt32 flags = 0);
40
41 void close();
42
43 const Key &next();
44
45 UInt32 offset() const {
46 return offset_;
47 }
48 UInt32 limit() const {
49 return limit_;
50 }
51 UInt32 flags() const {
52 return flags_;
53 }
54
55 private:
56 const Trie *trie_;
57 UInt32 offset_;
58 UInt32 limit_;
59 UInt32 flags_;
60
61 Vector<UInt32> buf_;
62 UInt32 cur_;
63 UInt32 end_;
64
65 PrefixCursor(const Trie &trie,
66 UInt32 offset, UInt32 limit, UInt32 flags);
67
68 UInt32 fix_flags(UInt32 flags) const;
69 void init(const String &str, UInt32 min_length);
70 void swap(PrefixCursor *cursor);
71
72 // Disallows copy and assignment.
73 PrefixCursor(const PrefixCursor &);
74 PrefixCursor &operator=(const PrefixCursor &);
75};
76
77} // namespace dat
78} // namespace grn
79