libpqxx
The C++ client library for PostgreSQL
Loading...
Searching...
No Matches
result_iterator.hxx
1/* Definitions for the pqxx::result class and support classes.
2 *
3 * pqxx::result represents the set of result rows from a database query.
4 *
5 * DO NOT INCLUDE THIS FILE DIRECTLY; include pqxx/result instead.
6 *
7 * Copyright (c) 2000-2025, Jeroen T. Vermeulen.
8 *
9 * See COPYING for copyright license. If you did not receive a file called
10 * COPYING with this source code, please notify the distributor of this
11 * mistake, or contact the author.
12 */
13#ifndef PQXX_H_RESULT_ITERATOR
14#define PQXX_H_RESULT_ITERATOR
15
16#include "pqxx/row.hxx"
17
18
19/* Result iterator.
20 *
21 * Don't include this header from your own application; it is included for you
22 * by other libpqxx headers.
23 */
24
25namespace pqxx
26{
28
32class PQXX_LIBEXPORT const_result_iterator : public row
33{
34public:
35 // TODO: Change operator[] so this becomes a proper random_access_iterator.
36 using iterator_category = std::bidirectional_iterator_tag;
37 using value_type = row const;
38 using pointer = row const *;
39 using reference = row;
40 using size_type = result_size_type;
41 using difference_type = result_difference_type;
42
43#include "pqxx/internal/ignore-deprecated-pre.hxx"
45 const_result_iterator() noexcept = default;
47 const_result_iterator(const_result_iterator const &) noexcept = default;
49 const_result_iterator(const_result_iterator &&) noexcept = default;
50
52 const_result_iterator(row const &t) noexcept : row{t} {}
53#include "pqxx/internal/ignore-deprecated-post.hxx"
54
69
70 [[nodiscard]] pointer operator->() const { return this; }
71
72#include "pqxx/internal/ignore-deprecated-pre.hxx"
74 [[nodiscard]] reference operator*() const { return *this; }
75#include "pqxx/internal/ignore-deprecated-post.hxx"
77
82 using row::back;
83 using row::front;
84 // TODO: Replace with standard operator[]: i[n] == *(i + n).
85 using row::operator[];
86 using row::at;
87 using row::rownumber;
89
94 const_result_iterator &operator=(const_result_iterator const &rhs)
95 {
96#include "pqxx/internal/ignore-deprecated-pre.hxx"
97 row::operator=(rhs);
98#include "pqxx/internal/ignore-deprecated-post.hxx"
99 return *this;
100 }
101
102 const_result_iterator &operator=(const_result_iterator &&rhs)
103 {
104#include "pqxx/internal/ignore-deprecated-pre.hxx"
105 row::operator=(std::move(rhs));
106#include "pqxx/internal/ignore-deprecated-post.hxx"
107 return *this;
108 }
109
110 const_result_iterator operator++(int) &;
111 const_result_iterator &operator++()
112 {
113 ++m_index;
114 return *this;
115 }
116 const_result_iterator operator--(int) &;
117 const_result_iterator &operator--()
118 {
119 --m_index;
120 return *this;
121 }
122
123 const_result_iterator &operator+=(difference_type i)
124 {
125 m_index += i;
126 return *this;
127 }
128 const_result_iterator &operator-=(difference_type i)
129 {
130 m_index -= i;
131 return *this;
132 }
133
135 void swap(const_result_iterator &other) noexcept
136 {
137#include "pqxx/internal/ignore-deprecated-pre.hxx"
138 row::swap(other);
139#include "pqxx/internal/ignore-deprecated-post.hxx"
140 }
142
147 [[nodiscard]] bool operator==(const_result_iterator const &i) const
148 {
149 return m_index == i.m_index;
150 }
151 [[nodiscard]] bool operator!=(const_result_iterator const &i) const
152 {
153 return m_index != i.m_index;
154 }
155 [[nodiscard]] bool operator<(const_result_iterator const &i) const
156 {
157 return m_index < i.m_index;
158 }
159 [[nodiscard]] bool operator<=(const_result_iterator const &i) const
160 {
161 return m_index <= i.m_index;
162 }
163 [[nodiscard]] bool operator>(const_result_iterator const &i) const
164 {
165 return m_index > i.m_index;
166 }
167 [[nodiscard]] bool operator>=(const_result_iterator const &i) const
168 {
169 return m_index >= i.m_index;
170 }
172
177 [[nodiscard]] inline const_result_iterator operator+(difference_type) const;
178 friend const_result_iterator
179 operator+(difference_type, const_result_iterator const &);
180 [[nodiscard]] inline const_result_iterator operator-(difference_type) const;
181 [[nodiscard]] inline difference_type
182 operator-(const_result_iterator const &) const;
184
185private:
186 friend class pqxx::result;
187 const_result_iterator(pqxx::result const *r, result_size_type i) noexcept :
188 row{*r, i, r->columns()}
189 {}
190};
191
192
194class PQXX_LIBEXPORT const_reverse_result_iterator
195 : private const_result_iterator
196{
197public:
198 using super = const_result_iterator;
199 using iterator_type = const_result_iterator;
200 using iterator_type::difference_type;
201 using iterator_type::iterator_category;
202 using iterator_type::pointer;
203 using value_type = iterator_type::value_type;
204 using reference = iterator_type::reference;
205
207 const_reverse_result_iterator() = default;
209 const_reverse_result_iterator(const_reverse_result_iterator const &rhs) =
210 default;
212 explicit const_reverse_result_iterator(const_result_iterator const &rhs) :
213 const_result_iterator{rhs}
214 {
215 super::operator--();
216 }
217
219 explicit const_reverse_result_iterator(const_result_iterator const &&rhs) :
220 const_result_iterator{std::move(rhs)}
221 {
222 super::operator--();
223 }
224
226 [[nodiscard]] PQXX_PURE const_result_iterator base() const noexcept;
227
232
233 using const_result_iterator::operator->;
235 using const_result_iterator::operator*;
237
242 using const_result_iterator::back;
243 using const_result_iterator::front;
244 // TODO: Replace with standard operator[]: i[n] == *(i + n).
245 using const_result_iterator::operator[];
246 using const_result_iterator::at;
247 using const_result_iterator::rownumber;
249
254 const_reverse_result_iterator &
255 operator=(const_reverse_result_iterator const &r)
256 {
257 iterator_type::operator=(r);
258 return *this;
259 }
260 const_reverse_result_iterator &operator=(const_reverse_result_iterator &&r)
261 {
262 iterator_type::operator=(std::move(r));
263 return *this;
264 }
265 const_reverse_result_iterator &operator++()
266 {
267 iterator_type::operator--();
268 return *this;
269 }
270 const_reverse_result_iterator operator++(int) &;
271 const_reverse_result_iterator &operator--()
272 {
273 iterator_type::operator++();
274 return *this;
275 }
276 const_reverse_result_iterator operator--(int) &;
277 const_reverse_result_iterator &operator+=(difference_type i)
278 {
279 iterator_type::operator-=(i);
280 return *this;
281 }
282 const_reverse_result_iterator &operator-=(difference_type i)
283 {
284 iterator_type::operator+=(i);
285 return *this;
286 }
287
288 void swap(const_reverse_result_iterator &other) noexcept
289 {
290 const_result_iterator::swap(other);
291 }
293
298 [[nodiscard]] const_reverse_result_iterator
299 operator+(difference_type i) const
300 {
301 return const_reverse_result_iterator(base() - i);
302 }
303 [[nodiscard]] const_reverse_result_iterator operator-(difference_type i)
304 {
305 return const_reverse_result_iterator(base() + i);
306 }
307 [[nodiscard]] difference_type
308 operator-(const_reverse_result_iterator const &rhs) const
309 {
310 return rhs.const_result_iterator::operator-(*this);
311 }
313
318 [[nodiscard]] bool
319 operator==(const_reverse_result_iterator const &rhs) const noexcept
320 {
321 return iterator_type::operator==(rhs);
322 }
323 [[nodiscard]] bool
324 operator!=(const_reverse_result_iterator const &rhs) const noexcept
325 {
326 return not operator==(rhs);
327 }
328
329 [[nodiscard]] bool operator<(const_reverse_result_iterator const &rhs) const
330 {
331 return iterator_type::operator>(rhs);
332 }
333 [[nodiscard]] bool operator<=(const_reverse_result_iterator const &rhs) const
334 {
335 return iterator_type::operator>=(rhs);
336 }
337 [[nodiscard]] bool operator>(const_reverse_result_iterator const &rhs) const
338 {
339 return iterator_type::operator<(rhs);
340 }
341 [[nodiscard]] bool operator>=(const_reverse_result_iterator const &rhs) const
342 {
343 return iterator_type::operator<=(rhs);
344 }
346};
347
348
349inline const_result_iterator
350const_result_iterator::operator+(result::difference_type o) const
351{
352 return {&m_result, size_type(result::difference_type(m_index) + o)};
353}
354
355inline const_result_iterator
356operator+(result::difference_type o, const_result_iterator const &i)
357{
358 return i + o;
359}
360
361inline const_result_iterator
362const_result_iterator::operator-(result::difference_type o) const
363{
364 return {&m_result, result_size_type(result::difference_type(m_index) - o)};
365}
366
367inline result::difference_type
368const_result_iterator::operator-(const const_result_iterator &i) const
369{
370 return result::difference_type(num() - i.num());
371}
372
373inline const_result_iterator result::end() const noexcept
374{
375 return {this, size()};
376}
377
378
379inline const_result_iterator result::cend() const noexcept
380{
381 return end();
382}
383
384
385inline const_reverse_result_iterator
386operator+(result::difference_type n, const_reverse_result_iterator const &i)
387{
388 return const_reverse_result_iterator{i.base() - n};
389}
390
391} // namespace pqxx
392#endif
The home of all libpqxx classes, functions, templates, etc.
Definition array.cxx:27
int result_size_type
Number of rows in a result set.
Definition types.hxx:28
strip_t< decltype(*std::begin(std::declval< CONTAINER >()))> value_type
The type of a container's elements.
Definition types.hxx:96
int result_difference_type
Difference between result sizes.
Definition types.hxx:31