1#include <muda/ext/field/field.h>
2#include <muda/ext/field/field_entry.h>
3#include <muda/ext/field/field_builder.h>
4#include <muda/ext/field/sub_field/aosoa_sub_field.h>
5#include <muda/ext/field/sub_field/soa_sub_field.h>
6#include <muda/ext/field/sub_field/aos_sub_field.h>
7#include <muda/ext/field/sub_field_interface.h>
8#include <muda/type_traits/type_label.h>
12MUDA_INLINE SubField::SubField(Field& field, std::string_view name)
18MUDA_INLINE SubField::~SubField() {}
20MUDA_INLINE std::byte* SubField::data_buffer()
const
22 return m_interface->m_data_buffer;
24MUDA_INLINE
size_t SubField::num_entries()
const
26 return m_interface->m_entries.size();
29template <FieldEntryLayout Layout>
30MUDA_INLINE FieldBuilder<Layout> SubField::builder(FieldEntryLayoutInfo layout,
31 const FieldBuildOptions& options)
33 if constexpr(Layout == FieldEntryLayout::RuntimeLayout)
35 return this->builder(layout, options);
39 m_interface = std::make_unique<SubFieldImpl<Layout>>(m_field);
40 m_interface->m_layout_info = layout;
41 return FieldBuilder<Layout>{*
this, layout, options};
48 switch(layout.layout())
50 case FieldEntryLayout::AoSoA:
51 m_interface = std::make_unique<SubFieldImpl<FieldEntryLayout::AoSoA>>(m_field);
53 case FieldEntryLayout::SoA:
54 m_interface = std::make_unique<SubFieldImpl<FieldEntryLayout::SoA>>(m_field);
56 case FieldEntryLayout::AoS:
57 m_interface = std::make_unique<SubFieldImpl<FieldEntryLayout::AoS>>(m_field);
60 MUDA_ERROR_WITH_LOCATION(
"Invalid layout type");
64 m_interface->m_layout_info = layout;
67template <
typename T, FieldEntryLayout Layout,
int M,
int N>
68auto SubField::create_entry(std::string_view name,
73 static_assert(muda::is_trivial_v<T>, R
"(T must be trivial type, such as int/float/...
74Or you need to label `YourType` as:
76struct force_trivial<YourType>
78 constexpr static bool value = true;
81 m_interface->m_name_to_index[std::string{name}] = m_interface->m_entries.size();
82 m_interface->m_entries.emplace_back(ptr);
86MUDA_INLINE
auto SubField::find_entry(std::string_view name)
const -> FieldEntryBase*
88 auto it = m_interface->m_name_to_index.find(std::string{name});
89 if(it == m_interface->m_name_to_index.end())
91 return (m_interface->m_entries[it->second]).get();
94template <
typename FieldEntryT>
95MUDA_INLINE FieldEntryT* SubField::find_entry(std::string_view name)
const
97 static_assert(std::is_base_of_v<FieldEntryBase, FieldEntryT>,
98 "FieldEntryT must be derived from FieldEntryBase");
100 auto ptr = find_entry(name);
103 return dynamic_cast<FieldEntryT*
>(ptr);
109 return builder<FieldEntryLayout::AoSoA>(
125 m_interface->m_build_options = options;
126 MUDA_ASSERT(!m_is_built,
"Field is already built!");
127 m_interface->build_impl();
131MUDA_INLINE
bool SubField::allow_inplace_shrink()
const
133 return m_interface->allow_inplace_shrink();
136MUDA_INLINE
size_t SubField::size()
const
138 return m_interface ? m_interface->m_num_elements : 0;
141MUDA_INLINE
void SubField::resize(
size_t num_elements)
143 MUDA_ASSERT(m_is_built,
"Field is not built yet!")
144 m_interface->resize(num_elements);
145 m_interface->m_num_elements = num_elements;
Definition field_build_options.inl:6
Definition field_builder.h:15
Definition field_entry.h:76
Definition field_entry_layout.h:24