Branch data Line data Source code
1 : : /* omtermlistiterator.cc
2 : : *
3 : : * Copyright 1999,2000,2001 BrightStation PLC
4 : : * Copyright 2003,2004,2005,2006,2007,2008 Olly Betts
5 : : *
6 : : * This program is free software; you can redistribute it and/or
7 : : * modify it under the terms of the GNU General Public License as
8 : : * published by the Free Software Foundation; either version 2 of the
9 : : * License, or (at your option) any later version.
10 : : *
11 : : * This program is distributed in the hope that it will be useful,
12 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : : * GNU General Public License for more details.
15 : : *
16 : : * You should have received a copy of the GNU General Public License
17 : : * along with this program; if not, write to the Free Software
18 : : * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
19 : : * USA
20 : : */
21 : :
22 : : #include <config.h>
23 : : #include <xapian/termiterator.h>
24 : : #include "termlist.h"
25 : : #include "positionlist.h"
26 : : #include "debuglog.h"
27 : : #include "omassert.h"
28 : :
29 : : using namespace std;
30 : :
31 : : // Helper function.
32 : : inline void
33 : 7914613 : handle_prune(Xapian::Internal::RefCntPtr<TermList>& old, TermList * result)
34 : : {
35 [ + + ]: 7914613 : if (result) {
36 : 71 : old = result;
37 : : }
38 : 7914613 : }
39 : :
40 : 5054066 : Xapian::TermIterator::TermIterator(Internal *internal_)
41 : 5054066 : : internal(internal_)
42 : : {
43 [ + + # # ]: 5054066 : if (internal.get()) {
44 : : // A TermList starts before the start, iterators start at the start
45 : 649929 : handle_prune(internal, internal->next());
46 [ + + # # ]: 649920 : if (internal->at_end()) internal = 0;
47 : : }
48 : 5054066 : }
49 : :
50 : 868912 : Xapian::TermIterator::TermIterator() : internal(0)
51 : : {
52 : : LOGCALL_VOID(API, "Xapian::TermIterator::TermIterator", NO_ARGS);
53 : 868912 : }
54 : :
55 : 5923609 : Xapian::TermIterator::~TermIterator() {
56 : : LOGCALL_VOID(API, "Xapian::TermIterator::~TermIterator", NO_ARGS);
57 : 5923609 : }
58 : :
59 : 640 : Xapian::TermIterator::TermIterator(const Xapian::TermIterator &other)
60 : 640 : : internal(other.internal)
61 : : {
62 : : LOGCALL_VOID(API, "Xapian::TermIterator::TermIterator", other);
63 : 640 : }
64 : :
65 : : void
66 : 369325 : Xapian::TermIterator::operator=(const Xapian::TermIterator &other)
67 : : {
68 : : LOGCALL_VOID(API, "Xapian::TermIterator::operator=", other);
69 : 369325 : internal = other.internal;
70 : 369325 : }
71 : :
72 : : string
73 : 13641003 : Xapian::TermIterator::operator *() const
74 : : {
75 : : LOGCALL(API, string, "Xapian::TermIterator::operator*", NO_ARGS);
76 : : Assert(internal.get());
77 : : Assert(!internal->at_end());
78 : 13641003 : RETURN(internal->get_termname());
79 : : }
80 : :
81 : : Xapian::termcount
82 : 9604263 : Xapian::TermIterator::get_wdf() const
83 : : {
84 : : LOGCALL(API, Xapian::termcount, "Xapian::TermIterator::get_wdf", NO_ARGS);
85 : : Assert(internal.get());
86 : : Assert(!internal->at_end());
87 : 9604263 : RETURN(internal->get_wdf());
88 : : }
89 : :
90 : : Xapian::doccount
91 : 84110 : Xapian::TermIterator::get_termfreq() const
92 : : {
93 : : LOGCALL(API, Xapian::doccount, "Xapian::TermIterator::get_termfreq", NO_ARGS);
94 : : Assert(internal.get());
95 : : Assert(!internal->at_end());
96 : 84110 : RETURN(internal->get_termfreq());
97 : : }
98 : :
99 : : Xapian::TermIterator &
100 : 7249228 : Xapian::TermIterator::operator++()
101 : : {
102 : : LOGCALL_VOID(API, "Xapian::TermIterator::operator++", NO_ARGS);
103 : : Assert(internal.get());
104 : : Assert(!internal->at_end());
105 : 7249228 : handle_prune(internal, internal->next());
106 [ + + ]: 7249228 : if (internal->at_end()) internal = 0;
107 : 7249228 : return *this;
108 : : }
109 : :
110 : : // extra method, not required to be an input_iterator
111 : : void
112 : 15465 : Xapian::TermIterator::skip_to(const string & tname)
113 : : {
114 : : LOGCALL_VOID(API, "Xapian::TermIterator::skip_to", tname);
115 [ + - ]: 15465 : if (internal.get()) {
116 : : Assert(!internal->at_end());
117 : 15465 : handle_prune(internal, internal->skip_to(tname));
118 [ + + ]: 15465 : if (internal->at_end()) internal = 0;
119 : : }
120 : 15465 : }
121 : :
122 : : Xapian::termcount
123 : 1342738 : Xapian::TermIterator::positionlist_count() const
124 : : {
125 : : LOGCALL(API, Xapian::termcount, "Xapian::TermIterator::positionlist_count", NO_ARGS);
126 : : Assert(internal.get());
127 : : Assert(!internal->at_end());
128 : 1342738 : RETURN(internal->positionlist_count());
129 : : }
130 : :
131 : : Xapian::PositionIterator
132 : 4539115 : Xapian::TermIterator::positionlist_begin() const
133 : : {
134 : : LOGCALL(API, Xapian::PositionIterator, "Xapian::TermIterator::positionlist_begin", NO_ARGS);
135 : : Assert(internal.get());
136 : : Assert(!internal->at_end());
137 : 4539115 : RETURN(internal->positionlist_begin());
138 : : }
139 : :
140 : : std::string
141 : 1341 : Xapian::TermIterator::get_description() const
142 : : {
143 : : /// \todo display contents of the object
144 : 1341 : return "Xapian::TermIterator()";
145 : : }
|