#pragma once #include #include template class IotaViewIterator { public: constexpr explicit IotaViewIterator(Value value) noexcept; constexpr auto operator++() noexcept -> const IotaViewIterator &; constexpr auto operator++(int) noexcept -> IotaViewIterator; constexpr auto operator*() const noexcept -> Value; constexpr auto operator==(const IotaViewIterator &rhs) const noexcept -> bool; constexpr auto operator!=(const IotaViewIterator &rhs) const noexcept -> bool; private: Value _value; }; /** * A range factory that generates a sequence of elements by repeatedly incrementing an * initial value. * * This class was created because C++20 ranges is a complete shitshow in Clang. * https://github.com/llvm/llvm-project/issues/52696 */ template requires std::equality_comparable_with && std::copyable class IotaView { public: constexpr IotaView(Value value, Bound bound) noexcept; [[nodiscard]] constexpr auto begin() const noexcept -> IotaViewIterator; [[nodiscard]] constexpr auto end() const noexcept -> IotaViewIterator; private: Value _value; Bound _bound; }; #include "ranges_impl.hpp"