Iros
 
Loading...
Searching...
No Matches
bind_front.h
Go to the documentation of this file.
1#pragma once
2
5#include "di/meta/algorithm.h"
7#include "di/meta/util.h"
8#include "di/types/in_place.h"
9#include "di/types/size_t.h"
10#include "di/util/forward.h"
11#include "di/util/get.h"
12#include "di/util/move.h"
14
15namespace di::function {
16namespace detail {
17 template<typename Indices, typename F, typename... BoundArgs>
19
20 template<types::size_t... indices, typename F, typename... BoundArgs>
21 class BindFrontFunction<meta::ListV<indices...>, F, BoundArgs...> : public pipeline::EnablePipeline {
22 public:
23 template<typename Fun, typename... Args>
24 constexpr BindFrontFunction(types::InPlace, Fun&& function, Args&&... bound_arguments)
25 : m_function(util::forward<Fun>(function)), m_bound_arguments(util::forward<Args>(bound_arguments)...) {}
26
27 constexpr BindFrontFunction(BindFrontFunction const&) = default;
28 constexpr BindFrontFunction(BindFrontFunction&&) = default;
29
32
33 template<typename... Args>
34 requires(concepts::Invocable<F&, BoundArgs&..., Args...>)
35 constexpr auto operator()(Args&&... args) & -> decltype(auto) {
36 return function::invoke(m_function, util::get<indices>(m_bound_arguments)..., util::forward<Args>(args)...);
37 }
38
39 template<typename... Args>
40 requires(concepts::Invocable<F const&, BoundArgs const&..., Args...>)
41 constexpr auto operator()(Args&&... args) const& -> decltype(auto) {
42 return function::invoke(m_function, util::get<indices>(m_bound_arguments)..., util::forward<Args>(args)...);
43 }
44
45 template<typename... Args>
46 requires(concepts::Invocable<F &&, BoundArgs && ..., Args...>)
47 constexpr auto operator()(Args&&... args) && -> decltype(auto) {
48 return function::invoke(util::move(m_function), util::get<indices>(util::move(m_bound_arguments))...,
49 util::forward<Args>(args)...);
50 }
51
52 template<typename... Args>
53 requires(concepts::Invocable<F const &&, BoundArgs const && ..., Args...>)
54 constexpr auto operator()(Args&&... args) const&& -> decltype(auto) {
55 return function::invoke(util::move(m_function), util::get<indices>(util::move(m_bound_arguments))...,
56 util::forward<Args>(args)...);
57 }
58
59 private:
60 F m_function;
61 vocab::Tuple<BoundArgs...> m_bound_arguments;
62 };
63}
64
65template<typename F, typename... Args>
68constexpr auto bind_front(F&& f, Args&&... args) {
70 types::in_place, util::forward<F>(f), util::forward<Args>(args)...);
71}
72}
73
74namespace di {
76}
Definition bind_front.h:18
constexpr BindFrontFunction(types::InPlace, Fun &&function, Args &&... bound_arguments)
Definition bind_front.h:24
auto operator=(BindFrontFunction &&) -> BindFrontFunction &=delete
auto operator=(BindFrontFunction const &) -> BindFrontFunction &=delete
Definition tuple_forward_declaration.h:5
Definition operations.h:11
Definition invoke.h:58
concept F
Definition zip_transform.h:12
Definition bind_back.h:16
Definition as_bool.h:8
constexpr auto bind_front(F &&f, Args &&... args)
Definition bind_front.h:68
constexpr auto invoke
Definition invoke.h:100
Definition merge_interfaces.h:6
Conditional< concepts::LanguageArray< RemoveReference< T > >, RemoveExtent< RemoveReference< T > > *, Conditional< concepts::LanguageFunction< RemoveReference< T > >, AddPointer< RemoveReference< T > >, RemoveCVRef< T > > > Decay
Definition language.h:574
MakeIndexSequence< sizeof...(Types)> IndexSequenceFor
Definition algorithm.h:288
std::size_t size_t
Definition size_t.h:12
constexpr auto in_place
Definition in_place.h:8
Definition vocab.h:96
constexpr auto get(T &&value) -> decltype(auto)
Definition get.h:8
Definition zstring_parser.h:9
Definition in_place.h:4