result_iterator.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2005 Tommi Maekitalo
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * As a special exception, you may use this file as part of a free
10  * software library without restriction. Specifically, if other files
11  * instantiate templates or use macros or inline functions from this
12  * file, or you compile this file and link it with other files to
13  * produce an executable, this file does not by itself cause the
14  * resulting executable to be covered by the GNU General Public
15  * License. This exception does not however invalidate any other
16  * reasons why the executable file might be covered by the GNU Library
17  * General Public License.
18  *
19  * This library is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22  * Lesser General Public License for more details.
23  *
24  * You should have received a copy of the GNU Lesser General Public
25  * License along with this library; if not, write to the Free Software
26  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27  */
28 
29 #ifndef TNTDB_BITS_RESULT_ITERATOR_H
30 #define TNTDB_BITS_RESULT_ITERATOR_H
31 
32 #include <tntdb/bits/result.h>
33 #include <tntdb/bits/row.h>
34 #include <iostream>
35 
36 namespace tntdb
37 {
42  : public std::iterator<std::random_access_iterator_tag, Row>
43  {
44  public:
45  typedef const value_type& const_reference;
46  typedef const value_type* const_pointer;
47 
48  private:
49  Result result;
50  Row current;
51  size_type offset;
52 
53  void setOffset(size_type off)
54  {
55  if (off != offset)
56  {
57  offset = off;
58  if (offset < result.size())
59  current = result.getRow(offset);
60  }
61  }
62 
63  public:
65  : result(r),
66  offset(off)
67  {
68  if (offset < r.size())
69  current = r.getRow(offset);
70  }
71 
75  bool operator== (const const_iterator& it) const
76  { return offset == it.offset; }
77 
81  bool operator!= (const const_iterator& it) const
82  { return !operator== (it); }
83 
86  { setOffset(offset + 1); return *this; }
87 
90  {
91  const_iterator ret = *this;
92  setOffset(offset + 1);
93  return ret;
94  }
95 
98  { setOffset(offset - 1); return *this; }
99 
102  {
103  const_iterator ret = *this;
104  setOffset(offset - 1);
105  return ret;
106  }
107 
110  { return current; }
111 
114  { return &current; }
115 
117  const_iterator& operator+= (difference_type n)
118  {
119  setOffset(offset + n);
120  return *this;
121  }
122 
124  const_iterator operator+ (difference_type n) const
125  {
126  const_iterator it(*this);
127  it += n;
128  return it;
129  }
130 
132  const_iterator& operator-= (difference_type n)
133  {
134  setOffset(offset - n);
135  return *this;
136  }
137 
139  const_iterator operator- (difference_type n) const
140  {
141  const_iterator it(*this);
142  it -= n;
143  return it;
144  }
145 
149  difference_type operator- (const const_iterator& it) const
150  { return offset - it.offset; }
151  };
152 }
153 
154 #endif // TNTDB_BITS_RESULT_ITERATOR_H
155