di 0.1.0
Loading...
Searching...
No Matches
make_deferred.h
Go to the documentation of this file.
1#pragma once
2
4#include "di/meta/util.h"
5#include "di/types/prelude.h"
8
9namespace di::function {
10namespace detail {
11 template<typename T, typename... Args>
12 class MakeDeferredFunctor {
13 public:
14 MakeDeferredFunctor() = default;
15
16 MakeDeferredFunctor(MakeDeferredFunctor const&) = default;
17 MakeDeferredFunctor(MakeDeferredFunctor&&) = default;
18
19 template<typename... Values>
20 requires((concepts::ConstructibleFrom<Args, Values> && ...))
21 constexpr explicit MakeDeferredFunctor(InPlace, Values&&... values)
22 : m_args(util::forward<Values>(values)...) {}
23
24 auto operator=(MakeDeferredFunctor const&) -> MakeDeferredFunctor& = delete;
25 auto operator=(MakeDeferredFunctor&&) -> MakeDeferredFunctor& = delete;
26
27 constexpr auto operator()() & -> T
28 requires concepts::ConstructibleFrom<T, Args&...>
29 {
30 return vocab::make_from_tuple<T>(m_args);
31 }
32
33 constexpr auto operator()() const& -> T
34 requires concepts::ConstructibleFrom<T, Args const&...>
35 {
36 return vocab::make_from_tuple<T>(m_args);
37 }
38
39 constexpr auto operator()() && -> T
40 requires concepts::ConstructibleFrom<T, Args&&...>
41 {
42 return vocab::make_from_tuple<T>(util::move(m_args));
43 }
44
45 constexpr auto operator()() const&& -> T
46 requires concepts::ConstructibleFrom<T, Args const&&...>
47 {
48 return vocab::make_from_tuple<T>(util::move(m_args));
49 }
50
51 private:
52 vocab::Tuple<Args...> m_args;
53 };
54
55 template<typename T>
56 struct MakeDeferredFunction {
57 template<concepts::DecayConstructible... Args>
58 constexpr auto operator()(Args&&... args) const {
59 return MakeDeferredFunctor<T, meta::Decay<Args>...>(in_place, util::forward<Args>(args)...);
60 }
61 };
62}
63
74template<typename T>
75constexpr auto make_deferred = detail::MakeDeferredFunction<T> {};
76}
77
78namespace di {
80}
Definition as_bool.h:8
constexpr auto make_deferred
Creates a deferred function object.
Definition make_deferred.h:75
constexpr auto make_from_tuple
Definition make_from_tuple.h:31
Tuple(Types...) -> Tuple< Types... >
Definition any_storable.h:9
constexpr auto in_place
Definition in_place.h:8