9#ifdef ROO_THREADS_USE_FREERTOS
14template <
size_t... Indexes>
16 typedef IndexTuple<Indexes...,
sizeof...(Indexes)> next;
19template <std::
size_t N>
20struct BuildIndexTuple {
21 typedef typename BuildIndexTuple<N - 1>::type::next type;
25struct BuildIndexTuple<0> {
26 typedef IndexTuple<> type;
29template <
typename Tuple>
33 template <
size_t Index>
34 static std::tuple_element_t<Index, Tuple>&& DeclVal();
36 template <
size_t... Ind>
37 auto invoke(IndexTuple<Ind...>)
noexcept(
38 noexcept(std::invoke(DeclVal<Ind>()...)))
39 ->
decltype(std::invoke(DeclVal<Ind>()...)) {
40 return std::invoke(std::get<Ind>(std::move(tuple))...);
43 using Indices =
typename BuildIndexTuple<std::tuple_size<Tuple>::value>::type;
45 auto operator()() noexcept(
46 noexcept(std::declval<Invoker&>().invoke(Indices())))
47 -> decltype(std::declval<Invoker&>().invoke(Indices())) {
48 return invoke(Indices());
52template <
typename... Tp>
53using DecayedTuple = std::tuple<typename std::decay<Tp>::type...>;
55template <
typename Callable,
typename... Args>
56inline Invoker<DecayedTuple<Callable, Args...>> MakeInvoker(Callable&& callable,
58 return {DecayedTuple<Callable, Args...>{std::forward<Callable>(callable),
59 std::forward<Args>(args)...}};
62class VirtualCallable {
64 virtual ~VirtualCallable() =
default;
65 virtual void call() = 0;
68template <
typename Callable>
69class DynamicCallable :
public VirtualCallable {
71 DynamicCallable(Callable&& callable)
72 : callable_(std::forward<Callable>(callable)) {}
74 void call()
override { callable_(); }
80template <
typename Callable>
81static std::unique_ptr<VirtualCallable> MakeDynamicCallable(
82 Callable&& callable) {
83 return std::unique_ptr<VirtualCallable>{
84 new DynamicCallable<Callable>{std::forward<Callable>(callable)}};
90template <
typename Callable,
typename... Args>
91static std::unique_ptr<VirtualCallable> MakeDynamicCallableWithArgs(
92 Callable&& callable, Args&&... args) {
93 return MakeDynamicCallable(MakeInvoker(std::forward<Callable>(callable),
94 std::forward<Args>(args)...));