1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- #ifndef BOOST_HISTOGRAM_AXIS_ITERATOR_HPP
- #define BOOST_HISTOGRAM_AXIS_ITERATOR_HPP
- #include <boost/histogram/axis/interval_view.hpp>
- #include <boost/histogram/detail/iterator_adaptor.hpp>
- #include <iterator>
- namespace boost {
- namespace histogram {
- namespace axis {
- template <class Axis>
- class iterator : public detail::iterator_adaptor<iterator<Axis>, index_type,
- decltype(std::declval<Axis>().bin(0))> {
- public:
- using reference = typename iterator::iterator_adaptor_::reference;
-
- iterator(const Axis& axis, index_type idx)
- : iterator::iterator_adaptor_(idx), axis_(axis) {}
-
- reference operator*() const { return axis_.bin(this->base()); }
- private:
- const Axis& axis_;
- };
- template <class Derived>
- class iterator_mixin {
- public:
- using const_iterator = iterator<Derived>;
- using const_reverse_iterator = std::reverse_iterator<const_iterator>;
-
- const_iterator begin() const noexcept {
- return const_iterator(*static_cast<const Derived*>(this), 0);
- }
-
- const_iterator end() const noexcept {
- return const_iterator(*static_cast<const Derived*>(this),
- static_cast<const Derived*>(this)->size());
- }
-
- const_reverse_iterator rbegin() const noexcept {
- return std::make_reverse_iterator(end());
- }
-
- const_reverse_iterator rend() const noexcept {
- return std::make_reverse_iterator(begin());
- }
- };
- }
- }
- }
- #endif
|