12 struct IteratorMoveFunction;
15 concept CustomIterMove = (concepts::Class<meta::RemoveCVRef<T>> || concepts::Enum<meta::RemoveCVRef<T>>) &&
16 concepts::TagInvocable<IteratorMoveFunction, T>;
19 concept RegularIterMove =
requires(T&&
value) {
20 { *util::forward<T>(value) } -> concepts::LValueReference;
24 concept DerefIterMove =
requires(T&&
value) { *util::forward<T>(value); };
26 struct IteratorMoveFunction {
29 requires(CustomIterMove<T>)
35 requires(!CustomIterMove<T> && RegularIterMove<T>)
36 constexpr auto impl(T&& value)
const
38 return di::move(*di::forward<T>(value));
42 requires(!CustomIterMove<T> && !RegularIterMove<T>)
44 return *di::forward<T>(value);
49 requires(CustomIterMove<T> || RegularIterMove<T> || DerefIterMove<T>)
50 constexpr auto operator()(T&&
value)
const ->
decltype(this->impl(util::forward<T>(value))) {
51 return this->impl(util::forward<T>(value));
constexpr auto iterator_move
Definition iterator_move.h:56
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
constexpr auto value
Definition value.h:34