libpqxx
result_iterator.hxx
1 
13 #ifndef PQXX_H_RESULT_ITERATOR
14 #define PQXX_H_RESULT_ITERATOR
15 
16 #include "pqxx/compiler-public.hxx"
17 #include "pqxx/compiler-internal-pre.hxx"
18 
19 #include "pqxx/row.hxx"
20 
21 
22 /* Result iterator.
23  *
24  * Don't include this header from your own application; it is included for you
25  * by other libpqxx headers.
26  */
27 
28 namespace pqxx
29 {
31 
35 class PQXX_LIBEXPORT const_result_iterator :
36  public std::iterator<
37  std::random_access_iterator_tag,
38  const row,
39  result::difference_type,
40  const_result_iterator,
41  row>,
42  public row
43 {
44 public:
45  using pointer = const row *;
46  using reference = row;
49 
50  const_result_iterator() noexcept : row(result(), 0) {}
51  const_result_iterator(const row &t) noexcept : row(t) {}
52 
68  pointer operator->() const { return this; } //[t12]
69  reference operator*() const { return row(*this); } //[t12]
71 
76  const_result_iterator operator++(int); //[t12]
77  const_result_iterator &operator++() { ++m_index; return *this; } //[t01]
78  const_result_iterator operator--(int); //[t12]
79  const_result_iterator &operator--() { --m_index; return *this; } //[t12]
80 
82  { m_index += i; return *this; }
84  { m_index -= i; return *this; }
86 
91  bool operator==(const const_result_iterator &i) const //[t12]
92  {return m_index==i.m_index;}
93  bool operator!=(const const_result_iterator &i) const //[t12]
94  {return m_index!=i.m_index;}
95  bool operator<(const const_result_iterator &i) const //[t12]
96  {return m_index<i.m_index;}
97  bool operator<=(const const_result_iterator &i) const //[t12]
98  {return m_index<=i.m_index;}
99  bool operator>(const const_result_iterator &i) const //[t12]
100  {return m_index>i.m_index;}
101  bool operator>=(const const_result_iterator &i) const //[t12]
102  {return m_index>=i.m_index;}
104 
109  inline const_result_iterator operator+(difference_type) const; //[t12]
110  friend const_result_iterator operator+( //[t12]
113  inline const_result_iterator operator-(difference_type) const; //[t12]
114  inline difference_type operator-(const_result_iterator) const; //[t12]
116 
117 private:
118  friend class pqxx::result;
119  const_result_iterator(const pqxx::result *r, result_size_type i) noexcept :
120  row(*r, i) {}
121 };
122 
123 
125 class PQXX_LIBEXPORT const_reverse_result_iterator :
126  private const_result_iterator
127 {
128 public:
131  using iterator_type::iterator_category;
134  using value_type = iterator_type::value_type;
136 
138  const const_reverse_result_iterator &rhs) :
139  const_result_iterator(rhs) {}
141  const const_result_iterator &rhs) :
142  const_result_iterator(rhs) { super::operator--(); }
143 
144  PQXX_PURE const_result_iterator base() const noexcept; //[t75]
145 
150  using const_result_iterator::operator->; //[t75]
151  using const_result_iterator::operator*; //[t75]
153 
160  { iterator_type::operator=(r); return *this; }
162  { iterator_type::operator--(); return *this; }
163  const_reverse_result_iterator operator++(int); //[t75]
165  { iterator_type::operator++(); return *this; }
166  const_reverse_result_iterator operator--(int); //[t75]
168  { iterator_type::operator-=(i); return *this; }
170  { iterator_type::operator+=(i); return *this; }
172 
178  { return const_reverse_result_iterator(base() - i); }
180  { return const_reverse_result_iterator(base() + i); }
182  const const_reverse_result_iterator &rhs) const
183  { return rhs.const_result_iterator::operator-(*this); }
185 
190  bool operator==( //[t75]
191  const const_reverse_result_iterator &rhs) const noexcept
192  { return iterator_type::operator==(rhs); }
193  bool operator!=( //[t75]
194  const const_reverse_result_iterator &rhs) const noexcept
195  { return !operator==(rhs); }
196 
197  bool operator<(const const_reverse_result_iterator &rhs) const //[t75]
198  { return iterator_type::operator>(rhs); }
199  bool operator<=(const const_reverse_result_iterator &rhs) const //[t75]
200  { return iterator_type::operator>=(rhs); }
201  bool operator>(const const_reverse_result_iterator &rhs) const //[t75]
202  { return iterator_type::operator<(rhs); }
203  bool operator>=(const const_reverse_result_iterator &rhs) const //[t75]
204  { return iterator_type::operator<=(rhs); }
206 };
207 
208 
211 {
212  return const_result_iterator(
213  &m_result, size_type(result::difference_type(m_index) + o));
214 }
215 
218  { return i + o; }
219 
222 {
223  return const_result_iterator(
224  &m_result,
226 }
227 
230  { return result::difference_type(num() - i.num()); }
231 
232 inline const_result_iterator result::end() const noexcept
233  { return const_result_iterator(this, size()); }
234 
235 
236 inline const_result_iterator result::cend() const noexcept
237  { return end(); }
238 
239 
244  { return const_reverse_result_iterator(i.base() - n); }
245 
246 } // namespace pqxx
247 
248 #include "pqxx/compiler-internal-post.hxx"
249 
250 #endif
bool operator!=(const const_reverse_result_iterator &rhs) const noexcept
Definition: result_iterator.hxx:193
Reference to one row in a result.
Definition: row.hxx:40
const_result_iterator & operator--()
Definition: result_iterator.hxx:79
Reverse iterator for result. Use as result::const_reverse_iterator.
Definition: result_iterator.hxx:125
iterator_type::value_type value_type
Definition: result_iterator.hxx:134
const_reverse_result_iterator operator-(difference_type i)
Definition: result_iterator.hxx:179
result_difference_type difference_type
Definition: result_iterator.hxx:48
result_difference_type difference_type
Definition: result.hxx:71
bool operator==(const const_reverse_result_iterator &rhs) const noexcept
Definition: result_iterator.hxx:190
bool operator<=(const const_reverse_result_iterator &rhs) const
Definition: result_iterator.hxx:199
The home of all libpqxx classes, functions, templates, etc.
Definition: array.hxx:22
const_reverse_result_iterator & operator=(const const_reverse_result_iterator &r)
Definition: result_iterator.hxx:158
Iterator for rows in a result. Use as result::const_iterator.
Definition: result_iterator.hxx:35
bool operator>=(const const_result_iterator &i) const
Definition: result_iterator.hxx:101
difference_type operator-(const const_reverse_result_iterator &rhs) const
Definition: result_iterator.hxx:181
bool operator<(const const_reverse_result_iterator &rhs) const
Definition: result_iterator.hxx:197
bool operator<(const const_result_iterator &i) const
Definition: result_iterator.hxx:95
const_reverse_result_iterator & operator+=(difference_type i)
Definition: result_iterator.hxx:167
const_result_iterator operator-(difference_type) const
Definition: result_iterator.hxx:221
const_result_iterator operator+(difference_type) const
Definition: result_iterator.hxx:210
const_result_iterator operator+(result::difference_type o, const_result_iterator i)
Definition: result_iterator.hxx:217
const_reverse_result_iterator & operator-=(difference_type i)
Definition: result_iterator.hxx:169
const_reverse_result_iterator(const const_result_iterator &rhs)
Definition: result_iterator.hxx:140
Result set containing data returned by a query or command.
Definition: result.hxx:67
pointer operator->() const
Definition: result_iterator.hxx:68
const_reverse_result_iterator & operator--()
Definition: result_iterator.hxx:164
bool operator==(const const_result_iterator &i) const
Definition: result_iterator.hxx:91
reference operator*() const
Definition: result_iterator.hxx:69
bool operator>(const const_reverse_result_iterator &rhs) const
Definition: result_iterator.hxx:201
bool operator!=(const const_result_iterator &i) const
Definition: result_iterator.hxx:93
const_result_iterator & operator++()
Definition: result_iterator.hxx:77
const_reverse_result_iterator operator+(difference_type i) const
Definition: result_iterator.hxx:177
const_result_iterator(const row &t) noexcept
Definition: result_iterator.hxx:51
PQXX_PURE const_result_iterator base() const noexcept
Definition: result.cxx:408
const_iterator cend() const noexcept
Definition: result_iterator.hxx:236
signed long result_difference_type
Difference between result sizes.
Definition: types.hxx:21
unsigned long result_size_type
Number of rows in a result set.
Definition: types.hxx:18
result_size_type size_type
Definition: result_iterator.hxx:47
const_reverse_result_iterator operator++()
Definition: result_iterator.hxx:161
const_iterator end() const noexcept
Definition: result_iterator.hxx:232
bool operator>(const const_result_iterator &i) const
Definition: result_iterator.hxx:99
const_reverse_result_iterator(const const_reverse_result_iterator &rhs)
Definition: result_iterator.hxx:137
bool operator<=(const const_result_iterator &i) const
Definition: result_iterator.hxx:97
const_result_iterator() noexcept
Definition: result_iterator.hxx:50
bool operator>=(const const_reverse_result_iterator &rhs) const
Definition: result_iterator.hxx:203
const_result_iterator & operator+=(difference_type i)
Definition: result_iterator.hxx:81
size_t num() const
Definition: row.hxx:170
const_result_iterator & operator-=(difference_type i)
Definition: result_iterator.hxx:83