18 #ifndef viskores_cont_ExecutionAndControlObjectBase_h
19 #define viskores_cont_ExecutionAndControlObjectBase_h
46 struct CheckPrepareForControl
49 static auto check(T* p) -> decltype(p->PrepareForControl(), std::true_type());
52 static auto check(...) -> std::false_type;
58 using IsExecutionAndControlObjectBase =
59 std::is_base_of<viskores::cont::ExecutionAndControlObjectBase, typename std::decay<T>::type>;
62 struct HasPrepareForControl
63 : decltype(detail::CheckPrepareForControl::check<typename std::decay<T>::type>(nullptr))
69 #define VISKORES_IS_EXECUTION_AND_CONTROL_OBJECT(execObject) \
71 ::viskores::cont::internal::IsExecutionAndControlObjectBase<execObject>::value, \
72 "Provided type is not a subclass of viskores::cont::ExecutionAndControlObjectBase."); \
73 static_assert(::viskores::cont::internal::HasPrepareForExecution<execObject>::value, \
74 "Provided type does not have requisite PrepareForExecution method."); \
75 static_assert(::viskores::cont::internal::HasPrepareForControl<execObject>::value, \
76 "Provided type does not have requisite PrepareForControl method.")
86 VISKORES_CONT auto CallPrepareForControl(T&& execObject) -> decltype(execObject.PrepareForControl())
90 return execObject.PrepareForControl();
101 template <
typename ExecutionAndControlObject>
102 using ControlObjectType =
103 decltype(CallPrepareForControl(std::declval<ExecutionAndControlObject>()));
109 #endif //viskores_cont_ExecutionAndControlObjectBase_h