MUDA
Loading...
Searching...
No Matches
field_entry_core.h
1#pragma once
2#include <muda/tools/string_pointer.h>
3#include <muda/ext/field/field_entry_layout.h>
4#include <muda/ext/field/field_entry_base_data.h>
5
6namespace muda
7{
8template <typename T, FieldEntryLayout Layout, int M, int N>
9class FieldEntry;
10
11class FieldEntryBase;
12
13// basic field entry info to pass between different field objects
15{
16 friend class FieldEntryBase;
17 template <FieldEntryLayout layout>
18 friend class SubFieldImpl;
19 friend class SubFieldInterface;
20
21 public:
22 MUDA_GENERIC FieldEntryCore() {}
23
24 MUDA_GENERIC FieldEntryCore(std::byte* buffer,
25 const FieldEntryBaseData& info,
27 : m_buffer(const_cast<std::byte*>(buffer))
28 , m_info(info)
29 , m_name(name)
30 {
31 }
32
33 MUDA_GENERIC FieldEntryCore(const FieldEntryCore& rhs) = default;
34
35 template <typename T>
36 MUDA_GENERIC T& cast(std::byte* data);
37 template <typename T>
38 MUDA_GENERIC const T& cast(const std::byte* data) const;
39
40 // AOSOA
41 MUDA_GENERIC uint32_t aosoa_inner_index(int i) const;
42 MUDA_GENERIC std::byte* aosoa_struct_begin(int i) const;
43 MUDA_GENERIC std::byte* aosoa_elem_addr(int i) const;
44 MUDA_GENERIC std::byte* aosoa_elem_addr(int i, int j) const;
45 MUDA_GENERIC std::byte* aosoa_elem_addr(int i, int row_index, int col_index) const;
46
47 // SOA
48 MUDA_GENERIC std::byte* soa_elem_addr(int i) const;
49 MUDA_GENERIC std::byte* soa_elem_addr(int i, int j) const;
50 MUDA_GENERIC std::byte* soa_elem_addr(int i, int row_index, int col_index) const;
51
52 // AOS
53 MUDA_GENERIC std::byte* aos_struct_begin(int i) const;
54 MUDA_GENERIC std::byte* aos_elem_addr(int i) const;
55 MUDA_GENERIC std::byte* aos_elem_addr(int i, int j) const;
56 MUDA_GENERIC std::byte* aos_elem_addr(int i, int row_index, int col_index) const;
57
58 // generic access
59 template <FieldEntryLayout Layout>
60 MUDA_GENERIC std::byte* elem_addr(int i) const;
61 template <typename T, FieldEntryLayout Layout>
62 MUDA_GENERIC T* data(int i) const
63 {
64 return reinterpret_cast<T*>(elem_addr<Layout>(i));
65 }
66
67 template <FieldEntryLayout Layout>
68 MUDA_GENERIC std::byte* elem_addr(int i, int j) const;
69 template <typename T, FieldEntryLayout Layout>
70 MUDA_GENERIC T* data(int i, int j) const
71 {
72 return reinterpret_cast<T*>(elem_addr<Layout>(i, j));
73 }
74
75 template <FieldEntryLayout Layout>
76 MUDA_GENERIC std::byte* elem_addr(int i, int row_index, int col_index) const;
77 template <typename T, FieldEntryLayout Layout>
78 MUDA_GENERIC T* data(int i, int row_index, int col_index) const
79 {
80 return reinterpret_cast<T*>(elem_addr<Layout>(i, row_index, col_index));
81 }
82
83 MUDA_GENERIC auto layout_info() const { return m_info.layout_info; }
84 MUDA_GENERIC auto layout() const { return m_info.layout_info.layout(); }
85 MUDA_GENERIC auto count() const { return m_info.elem_count; }
86 MUDA_GENERIC auto elem_byte_size() const { return m_info.elem_byte_size; }
87 MUDA_GENERIC auto shape() const { return m_info.shape; }
88 MUDA_GENERIC auto struct_stride() const { return m_info.struct_stride; }
89 MUDA_GENERIC auto name() const { return m_name.auto_select(); }
90 MUDA_GENERIC auto name_string_pointer() const { return m_name; }
91
92 private:
93 mutable std::byte* m_buffer = nullptr;
95 FieldEntryBaseData m_info;
96};
97} // namespace muda
98
99#include "details/field_entry_core.inl"
Definition field_entry_base_data.h:7
Definition field_entry.h:19
Definition field_entry_core.h:15
Definition field.h:14
Definition sub_field_interface.h:15
Definition string_pointer.h:7