18 #ifndef sitkMemberFunctionFactoryBase_h
19 #define sitkMemberFunctionFactoryBase_h
27 #include "Ancillary/type_list2.h"
28 #include "Ancillary/FunctionTraits.h"
30 #include <unordered_map>
40 struct hash :
public std::hash<T>
52 seed ^= hasher(val) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
55 template <
typename S,
typename T>
56 struct hash<std::pair<S, T>>
68 template <
class... TupleArgs>
69 struct hash<std::tuple<TupleArgs...>>
74 template <
size_t Idx,
typename... TupleTypes>
75 inline typename std::enable_if<Idx ==
sizeof...(TupleTypes),
void>::type
79 template <
size_t Idx,
typename... TupleTypes>
80 inline typename std::enable_if < Idx<
sizeof...(TupleTypes),
void>::type
81 hash_combine_tup(
size_t & seed,
const std::tuple<TupleTypes...> & tup)
const
86 hash_combine_tup<Idx + 1>(seed, tup);
91 operator()(std::tuple<TupleArgs...> tupleValue)
const
94 hash_combine_tup<0>(seed, tupleValue);
100 template <
typename TMemberFunctionPointer,
102 unsigned int TArity = ::detail::FunctionTraits<TMemberFunctionPointer>::arity>
112 template <
typename TMemberFunctionPo
inter,
typename TKey>
117 using ObjectType = typename ::detail::FunctionTraits<MemberFunctionType>::ClassType;
141 return [pfunc, objectPointer] {
return std::invoke(pfunc, objectPointer); };
157 template <
typename TMemberFunctionPo
inter,
typename TKey>
162 using ObjectType = typename ::detail::FunctionTraits<MemberFunctionType>::ClassType;
189 return std::invoke(pfunc, objectPointer, std::forward<decltype(PH1)>(PH1));
201 template <
typename TMemberFunctionPo
inter,
typename TKey>
209 using ObjectType = typename ::detail::FunctionTraits<MemberFunctionType>::ClassType;
220 using FunctionObjectType =
234 return [pfunc, objectPointer](
auto && PH1,
auto && PH2) {
235 return std::invoke(pfunc, objectPointer, std::forward<decltype(PH1)>(PH1), std::forward<decltype(PH2)>(PH2));
246 template <
typename TMemberFunctionPo
inter,
typename TKey>
255 using ObjectType = typename ::detail::FunctionTraits<MemberFunctionType>::ClassType;
265 using FunctionObjectType = std::function<
279 return [pfunc, objectPointer](
auto && PH1,
auto && PH2,
auto && PH3) {
280 return std::invoke(pfunc,
282 std::forward<decltype(PH1)>(PH1),
283 std::forward<decltype(PH2)>(PH2),
284 std::forward<decltype(PH3)>(PH3));
295 template <
typename TMemberFunctionPo
inter,
typename TKey>
305 using ObjectType = typename ::detail::FunctionTraits<MemberFunctionType>::ClassType;
315 using FunctionObjectType = std::function<MemberFunctionResultType(MemberFunctionArgument0Type,
316 MemberFunctionArgument1Type,
317 MemberFunctionArgument2Type,
331 return [pfunc, objectPointer](
auto && PH1,
auto && PH2,
auto && PH3,
auto && PH4) {
332 return std::invoke(pfunc,
334 std::forward<decltype(PH1)>(PH1),
335 std::forward<decltype(PH2)>(PH2),
336 std::forward<decltype(PH3)>(PH3),
337 std::forward<decltype(PH4)>(PH4));
347 template <
typename TMemberFunctionPo
inter,
typename TKey>
358 using ObjectType = typename ::detail::FunctionTraits<MemberFunctionType>::ClassType;
368 typedef std::function<MemberFunctionResultType(MemberFunctionArgument0Type,
369 MemberFunctionArgument1Type,
370 MemberFunctionArgument2Type,
371 MemberFunctionArgument3Type,
372 MemberFunctionArgument4Type)>
386 return [pfunc, objectPointer](
auto && PH1,
auto && PH2,
auto && PH3,
auto && PH4,
auto && PH5) {
387 return std::invoke(pfunc,
389 std::forward<decltype(PH1)>(PH1),
390 std::forward<decltype(PH2)>(PH2),
391 std::forward<decltype(PH3)>(PH3),
392 std::forward<decltype(PH4)>(PH4),
393 std::forward<decltype(PH5)>(PH5));
406 #endif // sitkMemberFunctionFactoryBase_h