202 using size_type = std::size_t;
203 using difference_type = std::ptrdiff_t;
204 static constexpr size_type npos = std::numeric_limits<size_type>::max();
211 using value_type =
Row;
212 using reference = value_type;
213 using pointer = const_iterator;
216 explicit ResultSet(std::shared_ptr<detail::ResultWrapper> pimpl)
217 : pimpl_{std::move(pimpl)}
222 bool IsEmpty()
const {
return Size() == 0; }
224 size_type RowsAffected()
const;
225 std::string CommandStatus()
const;
231 const_iterator cbegin()
const&;
232 const_iterator begin()
const& {
return cbegin(); }
233 const_iterator cend()
const&;
234 const_iterator end()
const& {
return cend(); }
237 const_iterator cbegin()
const&& =
delete;
238 const_iterator begin()
const&& =
delete;
239 const_iterator cend()
const&& =
delete;
240 const_iterator end()
const&& =
delete;
244 const_reverse_iterator crbegin()
const&;
245 const_reverse_iterator rbegin()
const& {
return crbegin(); }
246 const_reverse_iterator crend()
const&;
247 const_reverse_iterator rend()
const& {
return crend(); }
249 const_reverse_iterator crbegin()
const&& =
delete;
250 const_reverse_iterator rbegin()
const&& =
delete;
251 const_reverse_iterator crend()
const&& =
delete;
252 const_reverse_iterator rend()
const&& =
delete;
255 reference Front()
const&;
256 reference Back()
const&;
258 reference Front()
const&& =
delete;
259 reference Back()
const&& =
delete;
265 reference operator[](size_type index)
const&& =
delete;
271 size_type FieldCount()
const;
281 template <
typename T>
283 template <
typename T>
284 auto AsSetOf(
RowTag)
const;
285 template <
typename T>
290 template <
typename Container>
292 template <
typename Container>
293 Container AsContainer(
RowTag)
const;
298 template <
typename T>
300 template <
typename T>
301 auto AsSingleRow(
RowTag)
const;
302 template <
typename T>
309 template <
typename T>
311 template <
typename T>
312 std::optional<T> AsOptionalSingleRow(
RowTag)
const;
313 template <
typename T>
314 std::optional<T> AsOptionalSingleRow(
FieldTag)
const;
317 friend class detail::ConnectionImpl;
318 void FillBufferCategories(
const UserTypes& types);
319 void SetBufferCategoriesFrom(
const ResultSet&);
321 template <
typename T,
typename Tag>
322 friend class TypedResultSet;
323 friend class ConnectionImpl;
325 std::shared_ptr<detail::ResultWrapper> pimpl_;
564class TypedResultSet {
567 using difference_type =
ResultSet::difference_type;
568 static constexpr size_type npos =
ResultSet::npos;
569 static constexpr ExtractionTag kExtractTag{};
573 using const_iterator = detail::ConstTypedRowIterator<T, ExtractionTag, detail::IteratorDirection::kForward>;
574 using const_reverse_iterator = detail::ConstTypedRowIterator<T, ExtractionTag, detail::IteratorDirection::kReverse>;
576 using value_type = T;
577 using pointer = const_iterator;
582 using reference = value_type;
584 using reference = std::add_const_t<value_type>;
588 explicit TypedResultSet(
ResultSet result)
589 : result_{std::move(result)}
594 bool IsEmpty()
const {
return Size() == 0; }
601 const_iterator cbegin()
const& {
return const_iterator{result_.pimpl_, 0}; }
602 const_iterator begin()
const& {
return cbegin(); }
603 const_iterator cend()
const& {
return const_iterator{result_.pimpl_,
Size()}; }
604 const_iterator end()
const& {
return cend(); }
605 const_iterator cbegin()
const&& { ReportMisuse(); }
606 const_iterator begin()
const&& { ReportMisuse(); }
607 const_iterator cend()
const&& { ReportMisuse(); }
608 const_iterator end()
const&& { ReportMisuse(); }
612 const_reverse_iterator crbegin()
const& {
return const_reverse_iterator(result_.pimpl_,
Size() - 1); }
613 const_reverse_iterator rbegin()
const& {
return crbegin(); }
614 const_reverse_iterator crend()
const& {
return const_reverse_iterator(result_.pimpl_, npos); }
615 const_reverse_iterator rend()
const& {
return crend(); }
616 const_reverse_iterator crbegin()
const&& { ReportMisuse(); }
617 const_reverse_iterator rbegin()
const&& { ReportMisuse(); }
618 const_reverse_iterator crend()
const&& { ReportMisuse(); }
619 const_reverse_iterator rend()
const&& { ReportMisuse(); }
624 reference
operator[](size_type index)
const& {
return result_
[index
].
template As<value_type>(kExtractTag); }
626 reference operator[](size_type)
const&& { ReportMisuse(); }
629 [[noreturn]]
static void ReportMisuse() {
630 static_assert(!
sizeof(T),
"keep the TypedResultSet before using, please");