Iros
 
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 {
13
14 template<typename 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
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>
36 constexpr auto impl(T&& value) const
38 return di::move(*di::forward<T>(value));
39 }
40
41 template<typename 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>
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
57}
Definition language.h:253
Definition language.h:259
Definition language.h:30
Definition tag_invoke.h:33
Definition iterator_move.h:15
Definition iterator_move.h:24
Definition iterator_move.h:19
Definition sequence.h:13
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
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
Definition iterator_move.h:26