123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 |
- #ifndef BOOST_MYSQL_ROWS_HPP
- #define BOOST_MYSQL_ROWS_HPP
- #include <boost/mysql/field_view.hpp>
- #include <boost/mysql/row.hpp>
- #include <boost/mysql/row_view.hpp>
- #include <boost/mysql/rows_view.hpp>
- #include <boost/mysql/detail/row_impl.hpp>
- #include <boost/mysql/detail/rows_iterator.hpp>
- #include <boost/throw_exception.hpp>
- #include <stdexcept>
- namespace boost {
- namespace mysql {
- class rows
- {
- public:
- #ifdef BOOST_MYSQL_DOXYGEN
-
- using iterator = __see_below__;
- #else
- using iterator = detail::rows_iterator;
- #endif
-
- using const_iterator = iterator;
-
- using value_type = row;
-
- using reference = row_view;
-
- using const_reference = row_view;
-
- using size_type = std::size_t;
-
- using difference_type = std::ptrdiff_t;
-
- rows() = default;
-
- rows(const rows& other) = default;
-
- rows(rows&& other) = default;
-
- rows& operator=(const rows& other) = default;
-
- rows& operator=(rows&& other) = default;
-
- ~rows() = default;
-
- rows(const rows_view& r) : impl_(r.fields_, r.num_fields_), num_columns_(r.num_columns_) {}
-
- rows& operator=(const rows_view& rhs)
- {
- impl_.assign(rhs.fields_, rhs.num_fields_);
- num_columns_ = rhs.num_columns_;
- return *this;
- }
-
- iterator begin() const noexcept { return iterator(impl_.fields().data(), num_columns_, 0); }
-
- iterator end() const noexcept { return iterator(impl_.fields().data(), num_columns_, size()); }
-
- row_view at(std::size_t i) const
- {
- if (i >= size())
- BOOST_THROW_EXCEPTION(std::out_of_range("rows::at"));
- return detail::row_slice(impl_.fields().data(), num_columns_, i);
- }
-
- row_view operator[](std::size_t i) const noexcept
- {
- BOOST_ASSERT(i < size());
- return detail::row_slice(impl_.fields().data(), num_columns_, i);
- }
-
- row_view front() const noexcept { return (*this)[0]; }
-
- row_view back() const noexcept { return (*this)[size() - 1]; }
-
- bool empty() const noexcept { return impl_.fields().empty(); }
-
- std::size_t size() const noexcept { return num_columns_ == 0 ? 0 : impl_.fields().size() / num_columns_; }
-
- std::size_t num_columns() const noexcept { return num_columns_; }
-
- operator rows_view() const noexcept
- {
- return rows_view(impl_.fields().data(), impl_.fields().size(), num_columns_);
- }
- private:
- detail::row_impl impl_;
- std::size_t num_columns_{};
- };
- inline bool operator==(const rows& lhs, const rows& rhs) noexcept { return rows_view(lhs) == rows_view(rhs); }
- inline bool operator!=(const rows& lhs, const rows& rhs) noexcept { return !(lhs == rhs); }
- inline bool operator==(const rows_view& lhs, const rows& rhs) noexcept { return lhs == rows_view(rhs); }
- inline bool operator!=(const rows_view& lhs, const rows& rhs) noexcept { return !(lhs == rhs); }
- inline bool operator==(const rows& lhs, const rows_view& rhs) noexcept { return rows_view(lhs) == rhs; }
- inline bool operator!=(const rows& lhs, const rows_view& rhs) noexcept { return !(lhs == rhs); }
- }
- }
- #endif
|