18 #ifndef sitkMemberFunctionFactoryBase_h
19 #define sitkMemberFunctionFactoryBase_h
27 #include "Ancillary/type_list2.h"
28 #include "Ancillary/FunctionTraits.h"
30 #include <unordered_map>
38 template <
typename T>
struct hash :
public std::hash<T>{};
48 seed ^= hasher(val) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
51 template<
typename S,
typename T>
52 struct hash<std::pair<S, T>>
54 inline size_t operator()(
const std::pair<S, T>& val)
const
63 template<
class... TupleArgs>
64 struct hash<std::tuple<TupleArgs...>>
69 template<
size_t Idx,
typename... TupleTypes>
70 inline typename std::enable_if<Idx ==
sizeof...(TupleTypes),
void>::type
73 template<
size_t Idx,
typename... TupleTypes>
74 inline typename std::enable_if<Idx <
sizeof...(TupleTypes),
void>::type
75 hash_combine_tup(
size_t& seed,
const std::tuple<TupleTypes...>& tup)
const
80 hash_combine_tup<Idx+1>(seed, tup);
84 size_t operator()(std::tuple<TupleArgs...> tupleValue)
const
87 hash_combine_tup<0>(seed, tupleValue);
93 template<
typename TMemberFunctionPointer,
95 unsigned int TArity = ::detail::FunctionTraits<TMemberFunctionPointer>::arity>
105 template<
typename TMemberFunctionPo
inter,
typename TKey>
112 using ObjectType = typename ::detail::FunctionTraits<MemberFunctionType>::ClassType;
137 return [pfunc, objectPointer]{
return std::invoke(pfunc, objectPointer); };
155 template<
typename TMemberFunctionPo
inter,
typename TKey>
162 using ObjectType = typename ::detail::FunctionTraits<MemberFunctionType>::ClassType;
190 return std::invoke(pfunc, objectPointer, std::forward<decltype(PH1)>(PH1));
203 template<
typename TMemberFunctionPo
inter,
typename TKey>
213 using ObjectType = typename ::detail::FunctionTraits<MemberFunctionType>::ClassType;
238 return [pfunc, objectPointer] (
auto &&PH1,
auto &&PH2){
239 return std::invoke(pfunc, objectPointer, std::forward<decltype(PH1)>(PH1), std::forward<decltype(PH2)>(PH2));
251 template<
typename TMemberFunctionPo
inter,
typename TKey>
262 using ObjectType = typename ::detail::FunctionTraits<MemberFunctionType>::ClassType;
286 return [pfunc, objectPointer](
auto && PH1,
auto && PH2,
auto && PH3) {
287 return std::invoke(pfunc,
289 std::forward<decltype(PH1)>(PH1),
290 std::forward<decltype(PH2)>(PH2),
291 std::forward<decltype(PH3)>(PH3));
303 template<
typename TMemberFunctionPo
inter,
typename TKey>
315 using ObjectType = typename ::detail::FunctionTraits<MemberFunctionType>::ClassType;
339 return [pfunc, objectPointer](
auto && PH1,
auto && PH2,
auto && PH3,
auto && PH4) {
340 return std::invoke(pfunc,
342 std::forward<decltype(PH1)>(PH1),
343 std::forward<decltype(PH2)>(PH2),
344 std::forward<decltype(PH3)>(PH3),
345 std::forward<decltype(PH4)>(PH4));
356 template<
typename TMemberFunctionPo
inter,
typename TKey>
369 using ObjectType = typename ::detail::FunctionTraits<MemberFunctionType>::ClassType;
380 typedef std::function< MemberFunctionResultType (
381 MemberFunctionArgument0Type,
382 MemberFunctionArgument1Type,
383 MemberFunctionArgument2Type,
384 MemberFunctionArgument3Type,
385 MemberFunctionArgument4Type ) >
399 return [pfunc, objectPointer](
auto && PH1,
auto && PH2,
auto && PH3,
auto && PH4,
auto && PH5) {
400 return std::invoke(pfunc,
402 std::forward<decltype(PH1)>(PH1),
403 std::forward<decltype(PH2)>(PH2),
404 std::forward<decltype(PH3)>(PH3),
405 std::forward<decltype(PH4)>(PH4),
406 std::forward<decltype(PH5)>(PH5));
421 #endif // sitkMemberFunctionFactoryBase_h