14 #ifndef CORE_FUNCTIONAL_HPP 15 #define CORE_FUNCTIONAL_HPP 29 ::std::reference_wrapper
34 template <
class R,
class... Args>
37 template <
class C,
class R>
40 template <
class C,
class R,
class... Args>
43 template <
class C,
class R,
class... Args>
48 template <
class C,
class R,
class... Args>
53 template <
class C,
class R,
class... Args>
58 template <
class R,
class... Args>
74 template <::std::
size_t N>
79 template <
class Functor,
class... Args>
81 ::std::is_member_pointer<decay_t<Functor>>::value,
83 > { return ::std::mem_fn(f)(core::forward<Args>(args)...); }
85 template <
class Functor,
class... Args>
87 not ::std::is_member_pointer<decay_t<Functor>>::value,
89 > {
return core::forward<Functor>(f)(core::forward<Args>(args)...); }
91 template <
class F,
class T, ::std::size_t... I>
93 invoke(core::forward<F>(f), ::std::get<I>(core::forward<T>(t))...)
94 ) {
return invoke(core::forward<F>(f), ::std::get<I>(core::forward<T>(t))...); }
100 >
auto apply (Functor&& f, T&& t) -> decltype(
101 apply(core::forward<Functor>(f), core::forward<T>(t), I { })
102 ) {
return apply(core::forward<Functor>(f), core::forward<T>(t), I { }); }
109 template <
class Applicable>
110 auto operator () (Applicable&& args) -> decltype(
111 core::apply(core::forward<F>(this->f), core::forward<Applicable>(args))
112 ) {
return apply(core::forward<F>(f), core::forward<Applicable>(args)); }
127 template <
class... Args>
128 auto operator () (Args&&... args)
const -> decltype(
129 not (
invoke)(::std::declval<F>(), core::forward<Args>(args)...)
130 ) {
return not (
invoke)(f, core::forward<Args>(args)...); }
132 template <
class... Args>
133 auto operator () (Args&&... args) -> decltype(
134 not (
invoke)(::std::declval<F>(), core::forward<Args>(args)...)
135 ) {
return not (
invoke)(f, core::forward<Args>(args)...); }
150 template <
class... Args>
151 constexpr T operator () (Args&&... args)
const {
152 return T(core::forward<Args>(args)...);
157 template <
class T=
void>
159 constexpr T operator () (T
const& l, T
const& r)
const {
return l + r; }
162 template <
class T=
void>
164 constexpr T operator () (T
const& l, T
const& r)
const {
return l - r; }
167 template <
class T=
void>
169 constexpr T operator () (T
const& l, T
const& r)
const {
return l * r; }
172 template <
class T=
void>
174 constexpr T operator () (T
const& l, T
const& r)
const {
return l / r; }
177 template <
class T=
void>
179 constexpr T operator () (T
const& l, T
const& r)
const {
return l % r; }
182 template <
class T=
void>
184 constexpr T operator () (T
const& arg)
const {
return -arg; }
188 template <
class T=
void>
190 constexpr
bool operator () (T
const& l, T
const& r)
const {
return l == r; }
193 template <
class T=
void>
195 constexpr
bool operator () (T
const& l, T
const& r)
const {
return l != r; }
198 template <
class T=
void>
200 constexpr
bool operator () (T
const& l, T
const& r)
const {
return l >= r; }
203 template <
class T=
void>
205 constexpr
bool operator () (T
const& l, T
const& r)
const {
return l <= r; }
208 template <
class T=
void>
210 constexpr
bool operator () (T
const& l, T
const& r)
const {
return l > r; }
213 template <
class T=
void>
215 constexpr
bool operator () (T
const& l, T
const& r)
const {
return l < r; }
219 template <
class T=
void>
221 constexpr
bool operator () (T
const& l, T
const& r)
const {
return l and r; }
224 template <
class T=
void>
226 constexpr
bool operator () (T
const& l, T
const& r)
const {
return l or r; }
229 template <
class T=
void>
231 constexpr
bool operator () (T
const& arg)
const {
return not arg; }
236 template <
class T=
void>
238 constexpr
bool operator () (T
const& l, T
const& r)
const {
return l & r; }
241 template <
class T=
void>
243 constexpr
bool operator () (T
const& l, T
const& r)
const {
return l | r; }
246 template <
class T=
void>
248 constexpr
bool operator () (T
const& l, T
const& r)
const {
return l ^ r; }
251 template <
class T=
void>
253 constexpr
bool operator () (T
const& arg)
const {
return ~arg; }
257 template <>
struct plus<void> {
260 template <
class T,
class U>
261 constexpr
auto operator () (T&& t, U&& u)
const -> decltype(
262 core::forward<T>(t) + core::forward<U>(u)
263 ) {
return core::forward<T>(t) + core::forward<U>(u); }
269 template <
class T,
class U>
270 constexpr
auto operator () (T&& t, U&& u)
const -> decltype(
271 core::forward<T>(t) - core::forward<U>(u)
272 ) {
return core::forward<T>(t) - core::forward<U>(u); }
278 template <
class T,
class U>
279 constexpr
auto operator () (T&& t, U&& u)
const -> decltype(
280 core::forward<T>(t) * core::forward<U>(u)
281 ) {
return core::forward<T>(t) * core::forward<U>(u); }
287 template <
class T,
class U>
288 constexpr
auto operator () (T&& t, U&& u)
const -> decltype(
289 core::forward<T>(t) / core::forward<U>(u)
290 ) {
return core::forward<T>(t) / core::forward<U>(u); }
296 template <
class T,
class U>
297 constexpr
auto operator () (T&& t, U&& u)
const -> decltype(
298 core::forward<T>(t) % core::forward<U>(u)
299 ) {
return core::forward<T>(t) % core::forward<U>(u); }
306 constexpr
auto operator () (T&& t)
const -> decltype(core::forward<T>(t)) {
307 return core::forward<T>(t);
315 template <
class T,
class U>
316 constexpr
auto operator () (T&& t, U&& u)
const -> decltype(
317 core::forward<T>(t) == core::forward<U>(u)
318 ) {
return core::forward<T>(t) == core::forward<U>(u); }
324 template <
class T,
class U>
325 constexpr
auto operator () (T&& t, U&& u)
const -> decltype(
326 core::forward<T>(t) != core::forward<U>(u)
327 ) {
return core::forward<T>(t) != core::forward<U>(u); }
333 template <
class T,
class U>
334 constexpr
auto operator () (T&& t, U&& u)
const -> decltype(
335 core::forward<T>(t) >= core::forward<U>(u)
336 ) {
return core::forward<T>(t) >= core::forward<U>(u); }
342 template <
class T,
class U>
343 constexpr
auto operator () (T&& t, U&& u)
const -> decltype(
344 core::forward<T>(t) <= core::forward<U>(u)
345 ) {
return core::forward<T>(t) <= core::forward<U>(u); }
351 template <
class T,
class U>
352 constexpr
auto operator () (T&& t, U&& u)
const -> decltype(
353 core::forward<T>(t) > core::forward<U>(u)
354 ) {
return core::forward<T>(t) > core::forward<U>(u); }
357 template <>
struct less<void> {
360 template <
class T,
class U>
361 constexpr
auto operator () (T&& t, U&& u)
const -> decltype(
362 core::forward<T>(t) < core::forward<U>(u)
363 ) {
return core::forward<T>(t) < core::forward<U>(u); }
370 template <
class T,
class U>
371 constexpr
auto operator () (T&& t, U&& u)
const -> decltype(
372 core::forward<T>(t) and core::forward<U>(u)
373 ) {
return core::forward<T>(t) and core::forward<U>(u); }
379 template <
class T,
class U>
380 constexpr
auto operator () (T&& t, U&& u)
const -> decltype(
381 core::forward<T>(t) or core::forward<U>(u)
382 ) {
return core::forward<T>(t) or core::forward<U>(u); }
389 constexpr
auto operator () (T&& t)
const -> decltype(
390 not core::forward<T>(t)
391 ) {
return not core::forward<T>(t); }
398 template <
class T,
class U>
399 constexpr
auto operator () (T&& t, U&& u)
const -> decltype(
400 core::forward<T>(t) & core::forward<U>(u)
401 ) {
return core::forward<T>(t) & core::forward<U>(u); }
407 template <
class T,
class U>
408 constexpr
auto operator () (T&& t, U&& u)
const -> decltype(
409 core::forward<T>(t) | core::forward<U>(u)
410 ) {
return core::forward<T>(t) | core::forward<U>(u); }
416 template <
class T,
class U>
417 constexpr
auto operator () (T&& t, U&& u)
const -> decltype(
418 core::forward<T>(t) ^ core::forward<U>(u)
419 ) {
return core::forward<T>(t) ^ core::forward<U>(u); }
426 constexpr
auto operator () (T&& t)
const -> decltype(~core::forward<T>(t)) {
427 return ~
core::forward<T>(t);
constexpr auto size(Container const &container) noexcept -> decltype(container.size())
auto apply(F &&f, T &&t, index_sequence< I... >) -> decltype(invoke(core::forward< F >(f), ::std::get< I >(core::forward< T >(t))...))
typename functor_type::return_type return_type
meta::get< typelist, N > argument
Copyright © 2013 - 2015 MNMLSTC.
constexpr T && forward(remove_reference_t< T > &t) noexcept
auto invoke(Functor &&f, Args &&... args) -> enable_if_t< ::std::is_member_pointer< decay_t< Functor >>::value, result_of_t< Functor &&(Args &&...)> >
not_fn_functor< decay_t< F > > not_fn(F &&f)
auto apply(Functor &&f, T &&t) -> decltype(apply(core::forward< Functor >(f), core::forward< T >(t), I
typename result_of< T >::type result_of_t
auto make_apply(F &&f) -> apply_functor< F >
typename functor_type::template argument< N > argument
meta::is_specialization_of< remove_cv_t< T >, ::std::reference_wrapper > is_reference_wrapper
typename ::std::add_pointer< T >::type add_pointer_t
make_integer_sequence<::std::size_t, N > make_index_sequence
typename ::std::enable_if< B, T >::type enable_if_t
typename functor_type::pointer pointer
add_pointer_t< return_type(Args...)> pointer
static constexpr auto arity