4#ifndef TETL_ITERATOR_RANGES_ITER_MOVE_HPP
5#define TETL_ITERATOR_RANGES_ITER_MOVE_HPP
7#include <etl/_type_traits/is_class.hpp>
8#include <etl/_type_traits/is_enum.hpp>
9#include <etl/_type_traits/is_lvalue_reference.hpp>
10#include <etl/_type_traits/remove_cvref.hpp>
11#include <etl/_utility/forward.hpp>
12#include <etl/_utility/move.hpp>
16namespace iter_move_cpo {
18auto iter_move() ->
void =
delete;
21concept adl_iter_move = (is_class_v<remove_cvref_t<T>>
or is_enum_v<remove_cvref_t<T>>)
22 and requires(T&& t) { iter_move(
etl::forward<T>(t)); };
25concept can_move =
not adl_iter_move<T>
and requires(T&& t) {
27 requires is_lvalue_reference_v<
decltype(*t)>;
31concept can_deref =
not adl_iter_move<T>
and !can_move<T>
and requires(T&& t) {
33 requires(!is_lvalue_reference_v<
decltype(*t)>);
37 template <adl_iter_move Iter>
38 [[nodiscard]]
constexpr auto operator()(Iter&& i)
const noexcept(
noexcept(iter_move(etl::forward<Iter>(i))))
41 return iter_move(
etl::forward<Iter>(i));
44 template <can_move Iter>
45 [[nodiscard]]
constexpr auto operator()(Iter&& i)
const noexcept(
noexcept(etl::move(*etl::forward<Iter>(i))))
46 ->
decltype(
etl::move(*
etl::forward<Iter>(i)))
48 return etl::move(*
etl::forward<Iter>(i));
51 template <can_deref Iter>
52 [[nodiscard]]
constexpr auto operator()(Iter&& i)
const noexcept(
noexcept(*etl::forward<Iter>(i)))
53 ->
decltype(*
etl::forward<Iter>(i))
55 return *
etl::forward<Iter>(i);
63inline constexpr auto iter_move = iter_move_cpo::fn{};
constexpr auto iter_move
Definition ranges_iter_move.hpp:63
Definition ranges_iter_move.hpp:61
Definition ranges_in_fun_result.hpp:12
Definition adjacent_find.hpp:9