23static constexpr PDI_inout_t default_access_v
24 = (std::is_lvalue_reference_v<T> && !std::is_const_v<std::remove_reference_t<T>>)
29static constexpr PDI_inout_t chunk_default_access_v = is_writable_chunk_v<T> ? PDI_INOUT : PDI_OUT;
33 std::string m_event_name;
35 std::vector<std::string> m_names;
37 std::list<std::any> m_metadata;
39 char const* store_name(std::string&& name);
41 char const* store_name(std::string
const& name);
46 std::any& ref = m_metadata.emplace_back(std::in_place_type<T>, std::move(t));
47 return std::any_cast<T>(&ref);
51 T* store_array(std::vector<T> v)
53 std::any& ref = m_metadata.emplace_back(std::in_place_type<std::vector<T>>, std::move(v));
54 return std::any_cast<std::vector<T>>(&ref)->data();
58 explicit PdiEvent(std::string
const& event_name);
73 template <PDI_inout_t Access,
concepts::borrowed_chunk BorrowedChunk>
74 PdiEvent&
with(std::string
const& name, BorrowedChunk&& data)
77 !(Access & PDI_IN) || (chunk_default_access_v<BorrowedChunk> & PDI_IN),
78 "Invalid access for constant data");
79 std::array
const extents = detail::array(data.domain().extents());
80 PDI_share(store_name(name +
"_rank"), store_scalar(extents.size()), PDI_OUT);
82 store_name(name +
"_extents"),
83 store_array(std::vector<std::size_t>(extents.begin(), extents.end())),
87 const_cast<chunk_value_t<BorrowedChunk>*>(data.data_handle()),
92 template <PDI_inout_t Access,
class Arithmetic>
93 PdiEvent&
with(std::string
const& name, Arithmetic&& data)
94 requires(std::is_arithmetic_v<std::remove_reference_t<Arithmetic>>)
97 !(Access & PDI_IN) || (default_access_v<Arithmetic> & PDI_IN),
98 "Invalid access for constant data");
99 using value_type = std::remove_cvref_t<Arithmetic>;
101 value_type* data_ptr =
const_cast<value_type*>(&data);
103 if constexpr (!(Access & PDI_IN)) {
104 data_ptr = store_scalar(data);
106 PDI_share(store_name(name), data_ptr, Access);
115 template <
concepts::borrowed_chunk BorrowedChunk>
116 PdiEvent&
with(std::string
const& name, BorrowedChunk&& data)
118 return with<chunk_default_access_v<BorrowedChunk>>(name, std::forward<BorrowedChunk>(data));
122 template <
class Arithmetic>
123 PdiEvent&
with(std::string
const& name, Arithmetic&& data)
124 requires(std::is_arithmetic_v<std::remove_reference_t<Arithmetic>>)
126 return with<default_access_v<Arithmetic>>(name, std::forward<Arithmetic>(data));
130 PdiEvent&
with(std::string
const& name,
char const* c_string);
135template <PDI_inout_t Access,
class DataType>
138 PdiEvent(name
).with<Access>(name, std::forward<DataType>(data));
141template <
class DataType>
144 PdiEvent(name
).with(name, std::forward<DataType>(data));
PdiEvent(PdiEvent const &rhs)=delete
PdiEvent & operator=(PdiEvent &&rhs) noexcept=delete
PdiEvent & operator=(PdiEvent const &rhs)=delete
PdiEvent(std::string const &event_name)
PdiEvent & with(std::string const &name, BorrowedChunk &&data)
PdiEvent & with(std::string const &name, BorrowedChunk &&data)
API with access deduction.
PdiEvent(PdiEvent &&rhs) noexcept=delete
PdiEvent & with(std::string const &name, char const *c_string)
C-string overload.
The top-level namespace of DDC.
void expose_to_pdi(std::string const &name, DataType &&data)
void expose_to_pdi(std::string const &name, DataType &&data)