11 #ifndef INCLUDE_MOLASSEMBLER_TEMPLE_INVOKE_H
12 #define INCLUDE_MOLASSEMBLER_TEMPLE_INVOKE_H
14 #include <boost/tuple/tuple.hpp>
20 namespace Molassembler {
26 template<
typename TupleType,
typename Function,
size_t ... Inds>
27 auto boostTupleInvokeHelper(
29 const TupleType& tuple,
30 std::index_sequence<Inds...>
33 boost::get<Inds>(tuple)...
46 const boost::tuples::cons<HT, TT>& tuple
48 return Detail::boostTupleInvokeHelper(
51 std::make_index_sequence<
53 boost::tuples::length<
54 boost::tuples::cons<HT, TT>
62 template<
class>
struct sfinae_true : std::true_type {};
68 template<
typename Function,
typename TupleType,
size_t ... Inds>
71 const TupleType& tuple,
72 std::index_sequence<Inds...>
75 std::get<Inds>(tuple)...
84 template<
typename Function,
typename TupleType, std::size_t ... Inds>
85 constexpr
auto operator() (
87 const TupleType& tuple,
88 std::index_sequence<Inds...>
92 std::tuple_element_t<Inds, TupleType>
106 template<
typename Function,
typename TupleType>
107 static auto isTupleCallableTest(
int) -> sfinae_true<
109 std::declval<InvokeTester>()(
110 std::declval<Function>(),
111 std::declval<TupleType>(),
112 std::make_index_sequence<std::tuple_size<TupleType>::value>()
117 template<
typename Function,
typename TupleType,
typename... Args>
118 static auto isTupleCallableTest(
long) -> std::false_type;
126 template<
typename Function,
typename TupleType,
typename... Args>
127 struct isTupleCallable : decltype(isTupleCallableTest<Function, TupleType, Args...>(0)) {};
143 Detail::isTupleCallable<Function, TupleType>::value,
148 const TupleType& tuple
150 return Detail::invokeHelper(
151 std::forward<Function>(
function),
153 std::make_index_sequence<
154 std::tuple_size<TupleType>::value
171 !(
sizeof...(Args) == 1 && Detail::isTupleCallable<Fn, Args...>::value)
172 && std::is_member_pointer<std::decay_t<Fn>>{},
175 > constexpr decltype(
auto)
invoke(Fn&& f, Args&&... args)
176 noexcept(noexcept(std::mem_fn(f)(std::forward<Args>(args)...)))
178 return std::mem_fn(f)(std::forward<Args>(args)...);
193 !(
sizeof...(Args) == 1 && Detail::isTupleCallable<Fn, Args...>::value)
194 && !std::is_member_pointer<std::decay_t<Fn>>{},
197 > constexpr decltype(
auto)
invoke(Fn&& f, Args&&... args)
198 noexcept(noexcept(std::forward<Fn>(f)(std::forward<Args>(args)...)))
200 return std::forward<Fn>(f)(std::forward<Args>(args)...);
205 template<
typename Functor>
209 Invoker(
Functor&& passFunction) : function(passFunction) {}
211 template<
typename TupleType>
212 constexpr
auto operator() (
const TupleType& tuple)
const noexcept(noexcept(
invoke(
function, tuple))) {
213 return invoke(
function, tuple);
219 template<
typename Functor>
220 auto make_tuple_callable(
Functor&& functor) {
221 return Detail::Invoker<Functor>(std::forward<Functor>(functor));
auto invoke(Function &&function, const boost::tuples::cons< HT, TT > &tuple)
Invokes a function with all values in a given boost tuple.
Definition: Invoke.h:44