diff --git a/include/beman/iterator_interface/iterator_interface.hpp b/include/beman/iterator_interface/iterator_interface.hpp index e1445d9..4e4be1a 100644 --- a/include/beman/iterator_interface/iterator_interface.hpp +++ b/include/beman/iterator_interface/iterator_interface.hpp @@ -142,6 +142,7 @@ struct iter_cat {}; template struct iter_cat { +private: static constexpr auto compute_category_tag() { if constexpr (!std::is_reference_v) { return std::input_iterator_tag{}; @@ -154,19 +155,18 @@ struct iter_cat { } } - using TagType = std::invoke_result_t; - using iterator_category = TagType; +public: + using iterator_category = std::invoke_result_t; }; } // namespace detail template -class iterator_interface { +class iterator_interface + : detail::iter_cat> +{ public: using iterator_concept = IteratorConcept; - using iterator_category = - detail::iter_cat>:: - iterator_category; using value_type = remove_const_t; using reference = Reference; using pointer = conditional_t, void, Pointer>; diff --git a/tests/beman/iterator_interface/iterator_interface.test.cpp b/tests/beman/iterator_interface/iterator_interface.test.cpp index fb707a1..6cea90a 100644 --- a/tests/beman/iterator_interface/iterator_interface.test.cpp +++ b/tests/beman/iterator_interface/iterator_interface.test.cpp @@ -7,6 +7,7 @@ #include #include +#include #include namespace beman { @@ -119,5 +120,34 @@ TEST(IteratorTest, OperatorArrow) { ASSERT_EQ(ai->f(), 3); } +struct dummy_input_iterator : + public ext_iterator_interface_compat< + dummy_input_iterator, std::input_iterator_tag, int, int const&, void, std::ptrdiff_t> { + constexpr dummy_input_iterator() { } + dummy_input_iterator(dummy_input_iterator const&) = delete; + dummy_input_iterator& operator=(dummy_input_iterator const&) = delete; + dummy_input_iterator(dummy_input_iterator&&) = default; + dummy_input_iterator& operator=(dummy_input_iterator&&) = default; + constexpr reference operator*() const { + return foo; + } + constexpr dummy_input_iterator& operator++() { + return *this; + } + constexpr void operator++(int) {} + + friend constexpr bool operator==(std::default_sentinel_t const&, + dummy_input_iterator const&) { + return true; + } + + friend beman::iterator_interface::iterator_interface_access; + + int foo = 0; +}; + +static_assert(std::input_iterator); +static_assert(!std::forward_iterator); + } // namespace iterator_interface } // namespace beman