31#ifndef ETL_CLOSURE_INCLUDED
32#define ETL_CLOSURE_INCLUDED
42#if ETL_USING_CPP11 && !defined(ETL_CLOSURE_FORCE_CPP03_IMPLEMENTATION)
61 template <
typename TReturn,
typename... TArgs>
62 class closure<TReturn(TArgs...)>
66 using delegate_type = etl::delegate<TReturn(TArgs...)>;
67 using argument_types = etl::type_list<TArgs...>;
74 ETL_CONSTEXPR14 closure(
const delegate_type& f,
const TArgs... args)
84 ETL_CONSTEXPR14 TReturn operator()()
const
86 return execute(etl::index_sequence_for<TArgs...>{});
96 template <
size_t Index,
typename UArg>
97 ETL_CONSTEXPR14
void bind(UArg arg)
99 static_assert(etl::is_convertible<UArg, etl::type_list_type_at_index_t<argument_types, Index>>::value,
"Argument is not convertible");
100 static_assert(!etl::is_reference<UArg>::value,
"Cannot bind reference arguments");
110 template <
typename... UArgs>
111 ETL_CONSTEXPR14
void bind(UArgs&&... args)
113 static_assert(
sizeof...(UArgs) ==
sizeof...(TArgs),
"Argument count mismatch");
114 bind_impl(etl::make_index_sequence<
sizeof...(TArgs)>{}, etl::forward<UArgs>(args)...);
123 template <
size_t... Indexes,
typename... UArgs>
124 ETL_CONSTEXPR14
void bind_impl(etl::index_sequence<Indexes...>, UArgs&&... args)
127 int dummy[] = {0, (bind<Indexes>(etl::forward<UArgs>(args)), 0)...};
136 template<
size_t... Indexes>
137 ETL_CONSTEXPR14 TReturn execute(etl::index_sequence<Indexes...>)
const
143 etl::tuple<TArgs...> m_args;
157 template<
typename TReturn,
typename TArg0>
197 template<
typename TReturn,
typename TArg0,
typename TArg1>
210 closure(
const delegate_type& f,
const TArg0 arg0,
const TArg1 arg1)
223 return m_f(m_arg0, m_arg1);
240 template<
typename TReturn,
typename TArg0,
typename TArg1,
typename TArg2>
245 typedef etl::delegate<TReturn(TArg0, TArg1, TArg2)> delegate_type;
254 closure(
const delegate_type& f,
const TArg0 arg0,
const TArg1 arg1,
const TArg2 arg2)
268 return m_f(m_arg0, m_arg1, m_arg2);
287 template<
typename TReturn,
typename TArg0,
typename TArg1,
typename TArg2,
typename TArg3>
288 class closure<TReturn(TArg0, TArg1, TArg2, TArg3)>
292 typedef etl::delegate<TReturn(TArg0, TArg1, TArg2, TArg3)> delegate_type;
302 closure(
const delegate_type& f,
const TArg0 arg0,
const TArg1 arg1,
const TArg2 arg2,
const TArg3 arg3)
317 return m_f(m_arg0, m_arg1, m_arg2, m_arg3);
338 template<
typename TReturn,
typename TArg0,
typename TArg1,
typename TArg2,
typename TArg3,
typename TArg4>
339 class closure<TReturn(TArg0, TArg1, TArg2, TArg3, TArg4)>
343 typedef etl::delegate<TReturn(TArg0, TArg1, TArg2, TArg3, TArg4)> delegate_type;
354 closure(
const delegate_type& f,
const TArg0 arg0,
const TArg1 arg1,
const TArg2 arg2,
const TArg3 arg3,
const TArg4 arg4)
370 return m_f(m_arg0, m_arg1, m_arg2, m_arg3, m_arg4);
TReturn operator()() const
Definition closure.h:368
closure(const delegate_type &f, const TArg0 arg0, const TArg1 arg1, const TArg2 arg2, const TArg3 arg3, const TArg4 arg4)
Definition closure.h:354
closure(const delegate_type &f, const TArg0 arg0, const TArg1 arg1, const TArg2 arg2, const TArg3 arg3)
Definition closure.h:302
TReturn operator()() const
Definition closure.h:315
closure(const delegate_type &f, const TArg0 arg0, const TArg1 arg1, const TArg2 arg2)
Definition closure.h:254
TReturn operator()() const
Definition closure.h:266
TReturn operator()() const
Definition closure.h:221
closure(const delegate_type &f, const TArg0 arg0, const TArg1 arg1)
Definition closure.h:210
TReturn operator()() const
Definition closure.h:180
etl::delegate< TReturn(TArg0)> delegate_type
The delegate type to be invoked.
Definition closure.h:163
closure(const delegate_type &f, const TArg0 arg0)
Definition closure.h:170
Base template for closure.
Definition closure.h:150
Declaration.
Definition delegate_cpp03.h:191
bitset_ext
Definition absolute.h:39
T & get(array< T, Size > &a)
Definition array.h:1216