rows_iterator.hpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. //
  2. // Copyright (c) 2019-2024 Ruben Perez Hidalgo (rubenperez038 at gmail dot com)
  3. //
  4. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. //
  7. #ifndef BOOST_MYSQL_DETAIL_ROWS_ITERATOR_HPP
  8. #define BOOST_MYSQL_DETAIL_ROWS_ITERATOR_HPP
  9. #include <boost/mysql/field_view.hpp>
  10. #include <boost/mysql/row.hpp>
  11. #include <boost/mysql/row_view.hpp>
  12. #include <boost/mysql/detail/access.hpp>
  13. #include <cstddef>
  14. #include <cstdint>
  15. #include <iterator>
  16. namespace boost {
  17. namespace mysql {
  18. namespace detail {
  19. inline row_view row_slice(const field_view* fields, std::size_t num_columns, std::size_t offset) noexcept
  20. {
  21. return access::construct<row_view>(fields + num_columns * offset, num_columns);
  22. }
  23. class rows_iterator
  24. {
  25. const field_view* fields_{nullptr};
  26. std::size_t num_columns_{0};
  27. std::size_t row_num_{0};
  28. public:
  29. using value_type = row;
  30. using reference = row_view;
  31. using pointer = row_view;
  32. using difference_type = std::ptrdiff_t;
  33. using iterator_category = std::random_access_iterator_tag;
  34. rows_iterator() = default;
  35. rows_iterator(const field_view* fields, std::size_t num_columns, std::size_t rownum) noexcept
  36. : fields_(fields), num_columns_(num_columns), row_num_(rownum)
  37. {
  38. }
  39. rows_iterator& operator++() noexcept
  40. {
  41. ++row_num_;
  42. return *this;
  43. }
  44. rows_iterator operator++(int) noexcept
  45. {
  46. auto res = *this;
  47. ++(*this);
  48. return res;
  49. }
  50. rows_iterator& operator--() noexcept
  51. {
  52. --row_num_;
  53. return *this;
  54. }
  55. rows_iterator operator--(int) noexcept
  56. {
  57. auto res = *this;
  58. --(*this);
  59. return res;
  60. }
  61. rows_iterator& operator+=(std::ptrdiff_t n) noexcept
  62. {
  63. row_num_ += n;
  64. return *this;
  65. }
  66. rows_iterator& operator-=(std::ptrdiff_t n) noexcept
  67. {
  68. row_num_ -= n;
  69. return *this;
  70. }
  71. rows_iterator operator+(std::ptrdiff_t n) const noexcept
  72. {
  73. return rows_iterator(fields_, num_columns_, row_num_ + n);
  74. }
  75. rows_iterator operator-(std::ptrdiff_t n) const noexcept
  76. {
  77. return rows_iterator(fields_, num_columns_, row_num_ - n);
  78. }
  79. std::ptrdiff_t operator-(rows_iterator rhs) const noexcept { return row_num_ - rhs.row_num_; }
  80. pointer operator->() const noexcept { return **this; }
  81. reference operator*() const noexcept { return (*this)[0]; }
  82. reference operator[](std::ptrdiff_t i) const noexcept
  83. {
  84. return row_slice(fields_, num_columns_, row_num_ + i);
  85. }
  86. bool operator==(rows_iterator rhs) const noexcept { return row_num_ == rhs.row_num_; }
  87. bool operator!=(rows_iterator rhs) const noexcept { return !(*this == rhs); }
  88. bool operator<(rows_iterator rhs) const noexcept { return row_num_ < rhs.row_num_; }
  89. bool operator<=(rows_iterator rhs) const noexcept { return row_num_ <= rhs.row_num_; }
  90. bool operator>(rows_iterator rhs) const noexcept { return row_num_ > rhs.row_num_; }
  91. bool operator>=(rows_iterator rhs) const noexcept { return row_num_ >= rhs.row_num_; }
  92. };
  93. inline rows_iterator operator+(std::ptrdiff_t n, rows_iterator it) noexcept { return it + n; }
  94. } // namespace detail
  95. } // namespace mysql
  96. } // namespace boost
  97. #endif