LeviLamina
Loading...
Searching...
No Matches
function_invoke_base.h
1#pragma once
2
3#include <functional>
4
5#include "mc/platform/brstd/detail/DerivedType.h"
6#include "mc/platform/brstd/detail/function_base.h"
7#include "mc/platform/brstd/detail/function_base_impl.h"
8
9namespace brstd::detail::function {
10
11template <DerivedType Type, class Signature>
13
14template <DerivedType Type, class Return, class... Xs>
15class function_invoke_base<Type, Return(Xs...)>
16: public function_base<Type, function_base_impl<Type, Return, false, Xs...>> {
17public:
18 template <class Fn>
19 using FnInvQuals = Fn&;
20
21 template <class Fn>
22 static constexpr bool is_callable_from =
23 std::is_invocable_r_v<Return, Fn, Xs...> && std::is_invocable_r_v<Return, Fn&, Xs...>;
24
25public:
26 using result_type = Return;
27
28 Return operator()(Xs... args) { return this->get_invoke()(this->mStorage, std::forward<Xs>(args)...); }
29};
30
31template <DerivedType Type, class Return, class... Xs>
32class function_invoke_base<Type, Return(Xs...) &>
33: public function_base<Type, function_base_impl<Type, Return, false, Xs...>> {
34public:
35 template <class Fn>
36 using FnInvQuals = Fn&;
37
38 template <class Fn>
39 static constexpr bool is_callable_from = std::is_invocable_r_v<Return, Fn&, Xs...>;
40
41public:
42 using result_type = Return;
43
44 Return operator()(Xs... args) & { return this->get_invoke()(this->mStorage, std::forward<Xs>(args)...); }
45};
46
47template <DerivedType Type, class Return, class... Xs>
48class function_invoke_base<Type, Return(Xs...) &&>
49: public function_base<Type, function_base_impl<Type, Return, false, Xs...>> {
50public:
51 template <class Fn>
52 using FnInvQuals = Fn&&;
53
54 template <class Fn>
55 static constexpr bool is_callable_from = std::is_invocable_r_v<Return, Fn, Xs...>;
56
57public:
58 using result_type = Return;
59
60 Return operator()(Xs... args) && { return this->get_invoke()(this->mStorage, std::forward<Xs>(args)...); }
61};
62
63template <DerivedType Type, class Return, class... Xs>
64class function_invoke_base<Type, Return(Xs...) const>
65: public function_base<Type, function_base_impl<Type, Return, false, Xs...>> {
66public:
67 template <class Fn>
68 using FnInvQuals = Fn const&;
69
70 template <class Fn>
71 static constexpr bool is_callable_from =
72 std::is_invocable_r_v<Return, Fn const, Xs...> && std::is_invocable_r_v<Return, Fn const&, Xs...>;
73
74public:
75 using result_type = Return;
76
77 Return operator()(Xs... args) const { return this->get_invoke()(this->mStorage, std::forward<Xs>(args)...); }
78};
79
80template <DerivedType Type, class Return, class... Xs>
81class function_invoke_base<Type, Return(Xs...) const&>
82: public function_base<Type, function_base_impl<Type, Return, false, Xs...>> {
83public:
84 template <class Fn>
85 using FnInvQuals = Fn const&;
86
87 template <class Fn>
88 static constexpr bool is_callable_from = std::is_invocable_r_v<Return, Fn const&, Xs...>;
89
90public:
91 using result_type = Return;
92
93 Return operator()(Xs... args) const& { return this->get_invoke()(this->mStorage, std::forward<Xs>(args)...); }
94};
95
96template <DerivedType Type, class Return, class... Xs>
97class function_invoke_base<Type, Return(Xs...) const&&>
98: public function_base<Type, function_base_impl<Type, Return, false, Xs...>> {
99public:
100 template <class Fn>
101 using FnInvQuals = Fn const&&;
102
103 template <class Fn>
104 static constexpr bool is_callable_from = std::is_invocable_r_v<Return, Fn const, Xs...>;
105
106public:
107 using result_type = Return;
108
109 Return operator()(Xs... args) const&& { return this->get_invoke()(this->mStorage, std::forward<Xs>(args)...); }
110};
111
112template <DerivedType Type, class Return, class... Xs>
113class function_invoke_base<Type, Return(Xs...) noexcept>
114: public function_base<Type, function_base_impl<Type, Return, true, Xs...>> {
115public:
116 template <class Fn>
117 using FnInvQuals = Fn&;
118
119 template <class Fn>
120 static constexpr bool is_callable_from =
121 std::is_nothrow_invocable_r_v<Return, Fn, Xs...> && std::is_nothrow_invocable_r_v<Return, Fn&, Xs...>;
122
123public:
124 using result_type = Return;
125
126 Return operator()(Xs... args) noexcept { return this->get_invoke()(this->mStorage, std::forward<Xs>(args)...); }
127};
128
129template <DerivedType Type, class Return, class... Xs>
130class function_invoke_base<Type, Return(Xs...) & noexcept>
131: public function_base<Type, function_base_impl<Type, Return, true, Xs...>> {
132public:
133 template <class Fn>
134 using FnInvQuals = Fn&;
135
136 template <class Fn>
137 static constexpr bool is_callable_from = std::is_nothrow_invocable_r_v<Return, Fn&, Xs...>;
138
139public:
140 using result_type = Return;
141
142 Return operator()(Xs... args) & noexcept { return this->get_invoke()(this->mStorage, std::forward<Xs>(args)...); }
143};
144
145template <DerivedType Type, class Return, class... Xs>
146class function_invoke_base<Type, Return(Xs...) && noexcept>
147: public function_base<Type, function_base_impl<Type, Return, true, Xs...>> {
148public:
149 template <class Fn>
150 using FnInvQuals = Fn&&;
151
152 template <class Fn>
153 static constexpr bool is_callable_from = std::is_nothrow_invocable_r_v<Return, Fn, Xs...>;
154
155public:
156 using result_type = Return;
157
158 Return operator()(Xs... args) && noexcept { return this->get_invoke()(this->mStorage, std::forward<Xs>(args)...); }
159};
160
161template <DerivedType Type, class Return, class... Xs>
162class function_invoke_base<Type, Return(Xs...) const noexcept>
163: public function_base<Type, function_base_impl<Type, Return, true, Xs...>> {
164public:
165 template <class Fn>
166 using FnInvQuals = Fn const&;
167
168 template <class Fn>
169 static constexpr bool is_callable_from = std::is_nothrow_invocable_r_v<Return, Fn const, Xs...>
170 && std::is_nothrow_invocable_r_v<Return, Fn const&, Xs...>;
171
172public:
173 using result_type = Return;
174
175 Return operator()(Xs... args) const noexcept {
176 return this->get_invoke()(this->mStorage, std::forward<Xs>(args)...);
177 }
178};
179
180template <DerivedType Type, class Return, class... Xs>
181class function_invoke_base<Type, Return(Xs...) const & noexcept>
182: public function_base<Type, function_base_impl<Type, Return, true, Xs...>> {
183public:
184 template <class Fn>
185 using FnInvQuals = Fn const&;
186
187 template <class Fn>
188 static constexpr bool is_callable_from = std::is_nothrow_invocable_r_v<Return, Fn const&, Xs...>;
189
190public:
191 using result_type = Return;
192
193 Return operator()(Xs... args) const& noexcept {
194 return this->get_invoke()(this->mStorage, std::forward<Xs>(args)...);
195 }
196};
197
198template <DerivedType Type, class Return, class... Xs>
199class function_invoke_base<Type, Return(Xs...) const && noexcept>
200: public function_base<Type, function_base_impl<Type, Return, true, Xs...>> {
201public:
202 template <class Fn>
203 using FnInvQuals = Fn const&&;
204
205 template <class Fn>
206 static constexpr bool is_callable_from = std::is_nothrow_invocable_r_v<Return, Fn const, Xs...>;
207
208public:
209 using result_type = Return;
210
211 Return operator()(Xs... args) const&& noexcept {
212 return this->get_invoke()(this->mStorage, std::forward<Xs>(args)...);
213 }
214};
215
216} // namespace brstd::detail::function
Definition function_base_impl.h:12
Definition function_base.h:10
Definition function_invoke_base.h:12