diff --git a/include/beman/any_view/any_view.hpp b/include/beman/any_view/any_view.hpp index 1b6b010..aabe038 100644 --- a/include/beman/any_view/any_view.hpp +++ b/include/beman/any_view/any_view.hpp @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include #include @@ -46,7 +46,7 @@ template class any_view : public std::ranges::view_interface> { using iterator_concept = decltype(detail::get_iterator_concept()); - using iterator = detail::iterator; + using iterator = detail::any_iterator; using size_type = std::make_unsigned_t; static constexpr bool sized = (OptionsV & any_view_options::sized) == any_view_options::sized; @@ -61,13 +61,10 @@ class any_view : public std::ranges::view_interface detail::intrusive_small_ptr view_ptr; - template - using adaptor_type = - detail::view_adaptor>; - template static consteval auto get_in_place_adaptor_type() { - return std::in_place_type>; + return std::in_place_type< + detail::view_adaptor>>; } public: @@ -118,7 +115,7 @@ class any_view : public std::ranges::view_interface, RangeTraitsT>; using difference_type = detail::difference_type_or_t; using iterator = - detail::iterator; + detail::any_iterator; using size_type = std::make_unsigned_t; static constexpr bool sized = detail::sized_or_v; @@ -134,17 +131,14 @@ class any_view : public std::ranges::view_interface detail::intrusive_small_ptr view_ptr; - template - using adaptor_type = detail::view_adaptor>; - template static consteval auto get_in_place_adaptor_type() { - return std::in_place_type>; + return std::in_place_type>>; } public: @@ -194,7 +188,7 @@ class any_view : public std::ranges::view_interface using rvalue_reference_type = decltype(OptionsV.rvalue_reference_type)::type; using difference_type = decltype(OptionsV.difference_type)::type; using iterator = - detail::iterator; + detail::any_iterator; using size_type = std::make_unsigned_t; static constexpr bool sized = OptionsV.sized; @@ -210,17 +204,14 @@ class any_view : public std::ranges::view_interface // inplace storage sufficient for a vtable pointer and a std::vector detail::intrusive_small_ptr view_ptr; - template - using adaptor_type = detail::view_adaptor>; - template static consteval auto get_in_place_adaptor_type() { - return std::in_place_type>; + return std::in_place_type>>; } public: diff --git a/include/beman/any_view/detail/iterator.hpp b/include/beman/any_view/detail/any_iterator.hpp similarity index 68% rename from include/beman/any_view/detail/iterator.hpp rename to include/beman/any_view/detail/any_iterator.hpp index 05123f6..91f3d11 100644 --- a/include/beman/any_view/detail/iterator.hpp +++ b/include/beman/any_view/detail/any_iterator.hpp @@ -1,7 +1,7 @@ // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -#ifndef BEMAN_ANY_VIEW_DETAIL_ITERATOR_HPP -#define BEMAN_ANY_VIEW_DETAIL_ITERATOR_HPP +#ifndef BEMAN_ANY_VIEW_DETAIL_ANY_ITERATOR_HPP +#define BEMAN_ANY_VIEW_DETAIL_ANY_ITERATOR_HPP #include #include @@ -16,7 +16,7 @@ namespace beman::any_view::detail { template -class iterator { +class any_iterator { using reference = RefT; using rvalue_reference = RValueRefT; using pointer = std::add_pointer_t; @@ -38,16 +38,9 @@ class iterator { intrusive_small_ptr iterator_ptr; template - using adaptor_type = detail::iterator_adaptor; - - template - static constexpr auto get_noexcept() { - return std::is_nothrow_constructible_v, IteratorT, SentinelT>; - } - - template - static constexpr auto get_in_place_adaptor_type() { - return std::in_place_type>; + static consteval auto get_in_place_adaptor_type() { + return std::in_place_type< + detail::iterator_adaptor>; } public: @@ -56,28 +49,28 @@ class iterator { using difference_type = DiffT; template IteratorT, std::sentinel_for SentinelT> - constexpr iterator(IteratorT iterator, SentinelT sentinel) noexcept(get_noexcept()) + constexpr any_iterator(IteratorT iterator, SentinelT sentinel) : iterator_ptr(get_in_place_adaptor_type(), std::move(iterator), std::move(sentinel)) {} - constexpr iterator() noexcept + constexpr any_iterator() noexcept requires forward - : iterator(pointer(nullptr), pointer(nullptr)) {} + : any_iterator(pointer(nullptr), pointer(nullptr)) {} - constexpr iterator(const iterator&) + constexpr any_iterator(const any_iterator&) requires forward = default; - constexpr iterator(iterator&&) noexcept = default; + constexpr any_iterator(any_iterator&&) noexcept = default; - constexpr auto operator=(const iterator&) -> iterator& + constexpr auto operator=(const any_iterator&) -> any_iterator& requires forward = default; - constexpr auto operator=(iterator&&) noexcept -> iterator& = default; + constexpr auto operator=(any_iterator&&) noexcept -> any_iterator& = default; [[nodiscard]] constexpr auto operator*() const -> reference { return **iterator_ptr; } - friend constexpr auto iter_move(const iterator& other) -> rvalue_reference { + friend constexpr auto iter_move(const any_iterator& other) -> rvalue_reference { return other.iterator_ptr->iter_move(); } @@ -87,14 +80,14 @@ class iterator { return std::to_address(*iterator_ptr); } - constexpr auto operator++() -> iterator& { + constexpr auto operator++() -> any_iterator& { ++*iterator_ptr; return *this; } constexpr auto operator++(int) -> void { ++*this; } - [[nodiscard]] constexpr auto operator++(int) -> iterator + [[nodiscard]] constexpr auto operator++(int) -> any_iterator requires forward { const auto other = *this; @@ -102,20 +95,20 @@ class iterator { return other; } - [[nodiscard]] constexpr auto operator==(const iterator& other) const -> bool + [[nodiscard]] constexpr auto operator==(const any_iterator& other) const -> bool requires forward { return *iterator_ptr == *other.iterator_ptr; } - constexpr auto operator--() -> iterator& + constexpr auto operator--() -> any_iterator& requires bidirectional { --*iterator_ptr; return *this; } - [[nodiscard]] constexpr auto operator--(int) -> iterator + [[nodiscard]] constexpr auto operator--(int) -> any_iterator requires bidirectional { const auto other = *this; @@ -123,26 +116,26 @@ class iterator { return other; } - [[nodiscard]] constexpr auto operator<=>(const iterator& other) const -> std::partial_ordering + [[nodiscard]] constexpr auto operator<=>(const any_iterator& other) const -> std::partial_ordering requires random_access { return *iterator_ptr <=> *other.iterator_ptr; } - [[nodiscard]] constexpr auto operator-(const iterator& other) const -> difference_type + [[nodiscard]] constexpr auto operator-(const any_iterator& other) const -> difference_type requires random_access { return *iterator_ptr - *other.iterator_ptr; } - constexpr auto operator+=(difference_type offset) -> iterator& + constexpr auto operator+=(difference_type offset) -> any_iterator& requires random_access { *iterator_ptr += offset; return *this; } - [[nodiscard]] constexpr auto operator+(difference_type offset) const -> iterator + [[nodiscard]] constexpr auto operator+(difference_type offset) const -> any_iterator requires random_access { auto other = *this; @@ -150,20 +143,20 @@ class iterator { return other; } - [[nodiscard]] friend constexpr auto operator+(difference_type offset, const iterator& other) -> iterator + [[nodiscard]] friend constexpr auto operator+(difference_type offset, const any_iterator& other) -> any_iterator requires random_access { return other + offset; } - constexpr auto operator-=(difference_type offset) -> iterator& + constexpr auto operator-=(difference_type offset) -> any_iterator& requires random_access { *iterator_ptr -= offset; return *this; } - [[nodiscard]] constexpr auto operator-(difference_type offset) const -> iterator + [[nodiscard]] constexpr auto operator-(difference_type offset) const -> any_iterator requires random_access { auto other = *this; @@ -184,4 +177,4 @@ class iterator { } // namespace beman::any_view::detail -#endif // BEMAN_ANY_VIEW_DETAIL_ITERATOR_HPP +#endif // BEMAN_ANY_VIEW_DETAIL_ANY_ITERATOR_HPP diff --git a/include/beman/any_view/detail/view_adaptor.hpp b/include/beman/any_view/detail/view_adaptor.hpp index 8ad98c9..59a3f79 100644 --- a/include/beman/any_view/detail/view_adaptor.hpp +++ b/include/beman/any_view/detail/view_adaptor.hpp @@ -13,7 +13,7 @@ namespace beman::any_view::detail { template class view_adaptor : public view_interface { - using iterator = detail::iterator; + using iterator = detail::any_iterator; using size_type = std::make_unsigned_t; [[no_unique_address]] ViewT view; diff --git a/include/beman/any_view/detail/view_interface.hpp b/include/beman/any_view/detail/view_interface.hpp index 70ee2d5..36db764 100644 --- a/include/beman/any_view/detail/view_interface.hpp +++ b/include/beman/any_view/detail/view_interface.hpp @@ -3,13 +3,13 @@ #ifndef BEMAN_ANY_VIEW_DETAIL_VIEW_INTERFACE_HPP #define BEMAN_ANY_VIEW_DETAIL_VIEW_INTERFACE_HPP -#include +#include namespace beman::any_view::detail { template class view_interface { - using iterator = detail::iterator; + using iterator = detail::any_iterator; using size_type = std::make_unsigned_t; public: