di 0.1.0
Loading...
Searching...
No Matches
not_fn.h
Go to the documentation of this file.
1#pragma once
2
6#include "di/meta/util.h"
7#include "di/types/in_place.h"
8#include "di/util/forward.h"
9#include "di/util/move.h"
10
11namespace di::function {
12namespace detail {
13 template<typename F>
14 class NotFnFunction : public pipeline::EnablePipeline {
15 private:
16 F m_function;
17
18 public:
19 template<typename Fn>
20 constexpr NotFnFunction(types::InPlace, Fn&& function) : m_function(util::forward<Fn>(function)) {}
21
22 constexpr NotFnFunction(NotFnFunction const&) = default;
23 constexpr NotFnFunction(NotFnFunction&&) = default;
24
25 constexpr auto operator=(NotFnFunction const&) -> NotFnFunction& = delete;
26 constexpr auto operator=(NotFnFunction&&) -> NotFnFunction& = delete;
27
28 template<typename... Args>
29 constexpr auto operator()(Args&&... args) & -> decltype(!function::invoke(m_function,
30 util::forward<Args>(args)...)) {
31 return !function::invoke(m_function, util::forward<Args>(args)...);
32 }
33
34 template<typename... Args>
35 constexpr auto operator()(Args&&... args) const& -> decltype(!function::invoke(m_function,
36 util::forward<Args>(args)...)) {
37 return !function::invoke(m_function, util::forward<Args>(args)...);
38 }
39
40 template<typename... Args>
41 constexpr auto operator()(Args&&... args) && -> decltype(!function::invoke(util::move(m_function),
42 util::forward<Args>(args)...)) {
43 return !function::invoke(util::move(m_function), util::forward<Args>(args)...);
44 }
45
46 template<typename... Args>
47 constexpr auto operator()(Args&&... args) const&& -> decltype(!function::invoke(util::move(m_function),
48 util::forward<Args>(args)...)) {
49 return !function::invoke(util::move(m_function), util::forward<Args>(args)...);
50 }
51 };
52}
53
54template<concepts::DecayConstructible F>
55constexpr auto not_fn(F&& function) {
56 return detail::NotFnFunction<meta::Decay<F>>(types::in_place, util::forward<F>(function));
57}
58}
59
60namespace di {
62}
Definition as_bool.h:8
constexpr auto invoke
Definition invoke.h:100
constexpr auto not_fn(F &&function)
Definition not_fn.h:55
constexpr auto in_place
Definition in_place.h:8
Definition any_storable.h:9