di 0.1.0
Loading...
Searching...
No Matches
iterator_move.h
Go to the documentation of this file.
1#pragma once
2
5#include "di/meta/core.h"
6#include "di/meta/language.h"
7#include "di/util/forward.h"
8#include "di/util/move.h"
9
10namespace di::container {
11namespace detail {
12 struct IteratorMoveFunction;
13
14 template<typename T>
15 concept CustomIterMove = (concepts::Class<meta::RemoveCVRef<T>> || concepts::Enum<meta::RemoveCVRef<T>>) &&
16 concepts::TagInvocable<IteratorMoveFunction, T>;
17
18 template<typename T>
19 concept RegularIterMove = requires(T&& value) {
20 { *util::forward<T>(value) } -> concepts::LValueReference;
21 };
22
23 template<typename T>
24 concept DerefIterMove = requires(T&& value) { *util::forward<T>(value); };
25
26 struct IteratorMoveFunction {
27 private:
28 template<typename T>
29 requires(CustomIterMove<T>)
30 constexpr auto impl(T&& value) const -> meta::TagInvokeResult<IteratorMoveFunction, T> {
31 return function::tag_invoke(*this, util::forward<T>(value));
32 }
33
34 template<typename T>
35 requires(!CustomIterMove<T> && RegularIterMove<T>)
36 constexpr auto impl(T&& value) const
38 return di::move(*di::forward<T>(value));
39 }
40
41 template<typename T>
42 requires(!CustomIterMove<T> && !RegularIterMove<T>)
43 constexpr auto impl(T&& value) const -> meta::IteratorReference<T> {
44 return *di::forward<T>(value);
45 }
46
47 public:
48 template<typename T>
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));
52 }
53 };
54}
55
56constexpr inline auto iterator_move = detail::IteratorMoveFunction {};
57}
Definition sequence.h:12
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
decltype(di::function::tag_invoke(util::declval< Tag >(), util::declval< Args >()...)) TagInvokeResult
Definition tag_invoke.h:40
Type< detail::AddRValueReferenceHelper< T > > AddRValueReference
Definition language.h:411
decltype(*util::declval< T const & >()) IteratorReference
Definition iterator_reference.h:7