Iros
 
Loading...
Searching...
No Matches
bind_back.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 BindBackFunction<meta::ListV<indices...>, F, BoundArgs...> : public pipeline::EnablePipeline {
22 public:
23 template<typename Fun, typename... Args>
24 constexpr BindBackFunction(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 BindBackFunction(BindBackFunction const&) = default;
28 constexpr BindBackFunction(BindBackFunction&&) = default;
29
30 auto operator=(BindBackFunction const&) -> BindBackFunction& = delete;
32
33 template<typename... Args>
34 requires(concepts::Invocable<F&, Args..., BoundArgs&...>)
35 constexpr auto operator()(Args&&... args) & -> decltype(auto) {
36 return function::invoke(m_function, util::forward<Args>(args)..., util::get<indices>(m_bound_arguments)...);
37 }
38
39 template<typename... Args>
40 requires(concepts::Invocable<F const&, Args..., BoundArgs const&...>)
41 constexpr auto operator()(Args&&... args) const& -> decltype(auto) {
42 return function::invoke(m_function, util::forward<Args>(args)..., util::get<indices>(m_bound_arguments)...);
43 }
44
45 template<typename... Args>
46 requires(concepts::Invocable<F &&, Args..., BoundArgs && ...>)
47 constexpr auto operator()(Args&&... args) && -> decltype(auto) {
48 return function::invoke(util::move(m_function), util::forward<Args>(args)...,
49 util::get<indices>(util::move(m_bound_arguments))...);
50 }
51
52 template<typename... Args>
53 requires(concepts::Invocable<F const &&, Args..., BoundArgs const && ...>)
54 constexpr auto operator()(Args&&... args) const&& -> decltype(auto) {
55 return function::invoke(util::move(m_function), util::forward<Args>(args)...,
56 util::get<indices>(util::move(m_bound_arguments))...);
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_back(F&& f, Args&&... args) {
70 types::in_place, util::forward<F>(f), util::forward<Args>(args)...);
71}
72}
73
74namespace di {
76}
auto operator=(BindBackFunction &&) -> BindBackFunction &=delete
auto operator=(BindBackFunction const &) -> BindBackFunction &=delete
constexpr BindBackFunction(types::InPlace, Fun &&function, Args &&... bound_arguments)
Definition bind_back.h:24
Definition tuple_forward_declaration.h:5
Definition operations.h:11
Definition invoke.h:58
Definition bind_back.h:16
Definition as_bool.h:8
constexpr auto invoke
Definition invoke.h:100
constexpr auto bind_back(F &&f, Args &&... args)
Definition bind_back.h:68
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