44 using size_type = std::size_t;
45 using difference_type = std::ptrdiff_t;
46 static constexpr size_type npos = std::numeric_limits<size_type>::max();
53 using value_type =
Row;
54 using reference = value_type;
55 using pointer = const_iterator;
58 explicit ResultSet(std::shared_ptr<detail::ResultWrapper> pimpl)
59 : pimpl_{std::move(pimpl)}
64 bool IsEmpty()
const {
return Size() == 0; }
66 size_type RowsAffected()
const;
67 std::string CommandStatus()
const;
73 const_iterator cbegin()
const&;
74 const_iterator begin()
const& {
return cbegin(); }
75 const_iterator cend()
const&;
76 const_iterator end()
const& {
return cend(); }
79 const_iterator cbegin()
const&& =
delete;
80 const_iterator begin()
const&& =
delete;
81 const_iterator cend()
const&& =
delete;
82 const_iterator end()
const&& =
delete;
86 const_reverse_iterator crbegin()
const&;
87 const_reverse_iterator rbegin()
const& {
return crbegin(); }
88 const_reverse_iterator crend()
const&;
89 const_reverse_iterator rend()
const& {
return crend(); }
91 const_reverse_iterator crbegin()
const&& =
delete;
92 const_reverse_iterator rbegin()
const&& =
delete;
93 const_reverse_iterator crend()
const&& =
delete;
94 const_reverse_iterator rend()
const&& =
delete;
97 reference Front()
const&;
98 reference Back()
const&;
100 reference Front()
const&& =
delete;
101 reference Back()
const&& =
delete;
107 reference operator[](size_type index)
const&& =
delete;
113 size_type FieldCount()
const;
123 template <
typename T>
125 template <
typename T>
126 auto AsSetOf(
RowTag)
const;
127 template <
typename T>
132 template <
typename Container>
134 template <
typename Container>
135 Container AsContainer(
RowTag)
const;
140 template <
typename T>
142 template <
typename T>
143 auto AsSingleRow(
RowTag)
const;
144 template <
typename T>
151 template <
typename T>
153 template <
typename T>
154 std::optional<T> AsOptionalSingleRow(
RowTag)
const;
155 template <
typename T>
156 std::optional<T> AsOptionalSingleRow(
FieldTag)
const;
159 friend class detail::ConnectionImpl;
160 void FillBufferCategories(
const UserTypes& types);
161 void SetBufferCategoriesFrom(
const ResultSet&);
163 template <
typename T,
typename Tag>
164 friend class TypedResultSet;
165 friend class ConnectionImpl;
167 std::shared_ptr<detail::ResultWrapper> pimpl_;
271class TypedResultSet {
274 using difference_type =
ResultSet::difference_type;
275 static constexpr size_type npos =
ResultSet::npos;
276 static constexpr ExtractionTag kExtractTag{};
280 using const_iterator = detail::ConstTypedRowIterator<T, ExtractionTag, detail::IteratorDirection::kForward>;
281 using const_reverse_iterator = detail::ConstTypedRowIterator<T, ExtractionTag, detail::IteratorDirection::kReverse>;
283 using value_type = T;
284 using pointer = const_iterator;
289 using reference = value_type;
291 using reference = std::add_const_t<value_type>;
295 explicit TypedResultSet(
ResultSet result)
296 : result_{std::move(result)}
301 bool IsEmpty()
const {
return Size() == 0; }
308 const_iterator cbegin()
const& {
return const_iterator{result_.pimpl_, 0}; }
309 const_iterator begin()
const& {
return cbegin(); }
310 const_iterator cend()
const& {
return const_iterator{result_.pimpl_,
Size()}; }
311 const_iterator end()
const& {
return cend(); }
312 const_iterator cbegin()
const&& { ReportMisuse(); }
313 const_iterator begin()
const&& { ReportMisuse(); }
314 const_iterator cend()
const&& { ReportMisuse(); }
315 const_iterator end()
const&& { ReportMisuse(); }
319 const_reverse_iterator crbegin()
const& {
return const_reverse_iterator(result_.pimpl_,
Size() - 1); }
320 const_reverse_iterator rbegin()
const& {
return crbegin(); }
321 const_reverse_iterator crend()
const& {
return const_reverse_iterator(result_.pimpl_, npos); }
322 const_reverse_iterator rend()
const& {
return crend(); }
323 const_reverse_iterator crbegin()
const&& { ReportMisuse(); }
324 const_reverse_iterator rbegin()
const&& { ReportMisuse(); }
325 const_reverse_iterator crend()
const&& { ReportMisuse(); }
326 const_reverse_iterator rend()
const&& { ReportMisuse(); }
331 reference
operator[](size_type index)
const& {
return result_
[index
].
template As<value_type>(kExtractTag); }
333 reference operator[](size_type)
const&& { ReportMisuse(); }
336 [[noreturn]]
static void ReportMisuse() {
337 static_assert(!
sizeof(T),
"keep the TypedResultSet before using, please");