20 #ifndef RAJA_PATTERN_WORKGROUP_WorkStruct_HPP
21 #define RAJA_PATTERN_WORKGROUP_WorkStruct_HPP
23 #include "RAJA/config.hpp"
39 template<
size_t size,
typename Dispatcher_T>
48 template<
typename Dispatcher_T>
53 typename dispatch_policy,
54 typename DispatcherID,
58 Dispatcher<platform, dispatch_policy, DispatcherID, CallArgs...>>
61 Dispatcher<platform, dispatch_policy, DispatcherID, CallArgs...>;
65 template<
typename holder,
typename... holder_ctor_args>
68 holder_ctor_args&&... ctor_args)
73 static_assert(
sizeof(holder) <=
sizeof(true_value_type::obj),
74 "holder must fit in WorkStruct::obj");
75 static_assert(std::is_standard_layout<true_value_type>::value,
76 "WorkStruct must be a standard layout type");
77 static_assert(std::is_standard_layout<value_type>::value,
78 "GenericWorkStruct must be a standard layout type");
80 offsetof(value_type, obj) == offsetof(true_value_type, obj),
81 "WorkStruct and GenericWorkStruct must have obj at the same offset");
82 static_assert(
sizeof(value_type) <=
sizeof(true_value_type),
83 "WorkStruct must not be smaller than GenericWorkStruct");
84 true_value_type* value_ptr =
static_cast<true_value_type*
>(ptr);
86 value_ptr->dispatcher = dispatcher;
87 value_ptr->invoke = dispatcher->invoke;
88 new (&value_ptr->obj) holder(std::forward<holder_ctor_args>(ctor_args)...);
95 value_dst->dispatcher = value_src->dispatcher;
96 value_dst->invoke = value_src->invoke;
97 value_dst->dispatcher->move_construct_destroy(&value_dst->obj,
104 value_ptr->dispatcher->destroy(&value_ptr->obj);
111 value_ptr->invoke(&value_ptr->obj, std::forward<CallArgs>(
args)...);
119 value_ptr->invoke(&value_ptr->obj, std::forward<CallArgs>(
args)...);
123 typename dispatcher_type::invoker_type
invoke;
124 typename std::aligned_storage<size, RAJA_MAX_ALIGN>::type
obj;
#define RAJA_DEVICE
Definition: macros.hpp:66
Args args
Definition: WorkRunner.hpp:212
Definition: AlignedRangeIndexSetBuilders.cpp:35
Header file providing RAJA Dispatcher for workgroup.
Definition: Dispatcher.hpp:85
Definition: WorkStruct.hpp:40