MUDA
Loading...
Searching...
No Matches
sub_field.inl
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>
9
10namespace muda
11{
12MUDA_INLINE SubField::SubField(Field& field, std::string_view name)
13 : m_field(field)
14 , m_name(name)
15{
16}
17
18MUDA_INLINE SubField::~SubField() {}
19
20MUDA_INLINE std::byte* SubField::data_buffer() const
21{
22 return m_interface->m_data_buffer;
23}
24MUDA_INLINE size_t SubField::num_entries() const
25{
26 return m_interface->m_entries.size();
27}
28
29template <FieldEntryLayout Layout>
30MUDA_INLINE FieldBuilder<Layout> SubField::builder(FieldEntryLayoutInfo layout,
31 const FieldBuildOptions& options)
32{
33 if constexpr(Layout == FieldEntryLayout::RuntimeLayout)
34 {
35 return this->builder(layout, options);
36 }
37 else
38 {
39 m_interface = std::make_unique<SubFieldImpl<Layout>>(m_field);
40 m_interface->m_layout_info = layout;
41 return FieldBuilder<Layout>{*this, layout, options};
42 }
43}
44
46 FieldEntryLayoutInfo layout, const FieldBuildOptions& options)
47{
48 switch(layout.layout())
49 {
50 case FieldEntryLayout::AoSoA:
51 m_interface = std::make_unique<SubFieldImpl<FieldEntryLayout::AoSoA>>(m_field);
52 break;
53 case FieldEntryLayout::SoA:
54 m_interface = std::make_unique<SubFieldImpl<FieldEntryLayout::SoA>>(m_field);
55 break;
56 case FieldEntryLayout::AoS:
57 m_interface = std::make_unique<SubFieldImpl<FieldEntryLayout::AoS>>(m_field);
58 break;
59 default:
60 MUDA_ERROR_WITH_LOCATION("Invalid layout type");
61 break;
62 }
63
64 m_interface->m_layout_info = layout;
65 return FieldBuilder<FieldEntryLayout::RuntimeLayout>{*this, layout, options};
66}
67template <typename T, FieldEntryLayout Layout, int M, int N>
68auto SubField::create_entry(std::string_view name,
70 FieldEntryType type,
71 uint2 shape) -> FieldEntry<T, Layout, M, N>&
72{
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:
75template <>
76struct force_trivial<YourType>
77{
78 constexpr static bool value = true;
79};)");
80 auto ptr = new FieldEntry<T, Layout, M, N>(*this, layout, type, shape, name);
81 m_interface->m_name_to_index[std::string{name}] = m_interface->m_entries.size();
82 m_interface->m_entries.emplace_back(ptr);
83 return *ptr;
84}
85
86MUDA_INLINE auto SubField::find_entry(std::string_view name) const -> FieldEntryBase*
87{
88 auto it = m_interface->m_name_to_index.find(std::string{name});
89 if(it == m_interface->m_name_to_index.end())
90 return nullptr;
91 return (m_interface->m_entries[it->second]).get();
92}
93
94template <typename FieldEntryT>
95MUDA_INLINE FieldEntryT* SubField::find_entry(std::string_view name) const
96{
97 static_assert(std::is_base_of_v<FieldEntryBase, FieldEntryT>,
98 "FieldEntryT must be derived from FieldEntryBase");
99
100 auto ptr = find_entry(name);
101 if(!ptr)
102 return nullptr;
103 return dynamic_cast<FieldEntryT*>(ptr);
104}
105
106MUDA_INLINE FieldBuilder<FieldEntryLayout::AoSoA> SubField::AoSoA(uint32_t innermost_array_size,
107 const FieldBuildOptions& options)
108{
109 return builder<FieldEntryLayout::AoSoA>(
110 FieldEntryLayoutInfo{FieldEntryLayout::AoSoA, innermost_array_size}, options);
111}
112
113MUDA_INLINE FieldBuilder<FieldEntryLayout::SoA> SubField::SoA(const FieldBuildOptions& options)
114{
115 return builder<FieldEntryLayout::SoA>(FieldEntryLayoutInfo{FieldEntryLayout::SoA, 0}, options);
116}
117
118MUDA_INLINE FieldBuilder<FieldEntryLayout::AoS> SubField::AoS(const FieldBuildOptions& options)
119{
120 return builder<FieldEntryLayout::AoS>(FieldEntryLayoutInfo{FieldEntryLayout::AoS, 0}, options);
121}
122
123MUDA_INLINE void SubField::build(const FieldBuildOptions& options)
124{
125 m_interface->m_build_options = options;
126 MUDA_ASSERT(!m_is_built, "Field is already built!");
127 m_interface->build_impl();
128 m_is_built = true;
129}
130
131MUDA_INLINE bool SubField::allow_inplace_shrink() const
132{
133 return m_interface->allow_inplace_shrink();
134}
135
136MUDA_INLINE size_t SubField::size() const
137{
138 return m_interface ? m_interface->m_num_elements : 0;
139}
140
141MUDA_INLINE void SubField::resize(size_t num_elements)
142{
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;
146}
147} // namespace muda
Definition field_build_options.inl:6
Definition field_builder.h:15
Definition field_entry.h:76
Definition field_entry_layout.h:24