Iros
 
Loading...
Searching...
No Matches
proj.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/function/curry.h"
6#include "di/util/move.h"
7
8namespace di::function {
9namespace proj_ns {
10 template<typename P, typename F>
12 public:
13 template<typename Pn, typename Fn>
14 constexpr explicit ProjImpl(Pn&& p, Fn&& f) : m_proj(di::forward<Pn>(p)), m_f(di::forward<Fn>(f)) {}
15
16 constexpr ProjImpl(ProjImpl const&) = default;
17 constexpr ProjImpl(ProjImpl&&) = default;
18
19 constexpr auto operator=(ProjImpl const&) -> ProjImpl& = delete;
20 constexpr auto operator=(ProjImpl&&) -> ProjImpl& = delete;
21
22 template<typename... Args>
24 constexpr auto operator()(Args&&... args) & -> decltype(auto) {
25 return invoke(m_f, invoke(m_proj, di::forward<Args>(args))...);
26 }
27
28 template<typename... Args>
30 constexpr auto operator()(Args&&... args) const& -> decltype(auto) {
31 return invoke(m_f, invoke(m_proj, di::forward<Args>(args))...);
32 }
33
34 template<typename... Args>
36 constexpr auto operator()(Args&&... args) && -> decltype(auto) {
37 return invoke(di::move(m_f), invoke(m_proj, di::forward<Args>(args))...);
38 }
39
40 template<typename... Args>
42 constexpr auto operator()(Args&&... args) const&& -> decltype(auto) {
43 return invoke(di::move(m_f), invoke(m_proj, di::forward<Args>(args))...);
44 }
45
46 private:
47 P m_proj;
48 F m_f;
49 };
50
51 struct ProjFunction {
52 template<concepts::DecayConstructible P, concepts::DecayConstructible F>
53 constexpr auto operator()(P&& predicate, F&& function) const {
54 return ProjImpl<meta::Decay<P>, meta::Decay<F>> { di::forward<P>(predicate), di::forward<F>(function) };
55 }
56 };
57}
58
59constexpr inline auto proj = di::curry(proj_ns::ProjFunction {}, c_<2ZU>);
60}
61
62namespace di {
63using function::proj;
64}
constexpr ProjImpl(Pn &&p, Fn &&f)
Definition proj.h:14
constexpr auto operator=(ProjImpl &&) -> ProjImpl &=delete
constexpr ProjImpl(ProjImpl const &)=default
constexpr ProjImpl(ProjImpl &&)=default
constexpr auto operator=(ProjImpl const &) -> ProjImpl &=delete
Definition invoke.h:58
Definition proj.h:9
Definition as_bool.h:8
constexpr auto invoke
Definition invoke.h:100
constexpr auto proj
Definition proj.h:59
Conditional< concepts::LanguageArray< RemoveReference< T > >, RemoveExtent< RemoveReference< T > > *, Conditional< concepts::LanguageFunction< RemoveReference< T > >, AddPointer< RemoveReference< T > >, RemoveCVRef< T > > > Decay
Definition language.h:574
Definition zstring_parser.h:9
constexpr auto c_
A value of type Constexpr<val>.
Definition constexpr.h:252
constexpr auto curry
Definition curry.h:140
constexpr auto operator()(P &&predicate, F &&function) const
Definition proj.h:53