MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
CompositeContainer.cpp
Go to the documentation of this file.
2
4
5namespace MayaFlux::Kakshya {
6
7namespace {
8
9 bool append_slice(CompositeInsertion& insertion, const CompositeSlice& slice)
10 {
11 for (size_t i = 0; i < slice.size(); ++i) {
12 const auto element = slice.at(i);
13 if (!element || !insertion.append(*element))
14 return false;
15 }
16 return true;
17 }
18
19 std::optional<CompositeArray> copy_slice(const CompositeSlice& slice)
20 {
21 CompositeArray copy(slice.layout());
22 CompositeInsertion insertion(copy);
23 if (!append_slice(insertion, slice))
24 return std::nullopt;
25 return copy;
26 }
27
28}
29
31 : m_data(std::move(layout))
32 , m_materialized_data(m_data.layout())
33 , m_batch_size(batch_size == 0 ? 1 : batch_size)
34{
35}
36
38 : m_data(std::move(data))
39 , m_materialized_data(m_data.layout())
40 , m_batch_size(batch_size == 0 ? 1 : batch_size)
41{
42}
43
45
47{
48 if (at_end())
49 return false;
50
51 auto traversal = traverse(m_batch_size);
52 traversal.seek(m_next_element);
53 const auto window = traversal.current();
54 if (!window || window->size() == 0)
55 return false;
56
57 auto next = copy_slice(*window);
58 if (!next)
59 return false;
60
61 m_materialized_data = std::move(*next);
62 m_next_element += window->size();
63 return true;
64}
65
66std::vector<DataDimension> CompositeContainer::get_dimensions() const
67{
68 return { DataDimension("elements", m_data.size(), 1, DataDimension::Role::CUSTOM) };
69}
70
71std::vector<CompositeArray> CompositeContainer::get_region_data(const Region& region) const
72{
73 const auto selected = m_data.slice(region);
74 if (!selected)
75 return {};
76
77 auto copy = copy_slice(*selected);
78 if (!copy)
79 return {};
80
81 std::vector<CompositeArray> result;
82 result.push_back(std::move(*copy));
83 return result;
84}
85
86std::vector<CompositeArray> CompositeContainer::get_region_group_data(const RegionGroup& group) const
87{
88 std::vector<CompositeArray> result;
89 result.reserve(group.regions.size());
90
91 for (const auto& region : group.regions) {
92 auto copied = get_region_data(region);
93 if (!copied.empty())
94 result.push_back(std::move(copied.front()));
95 }
96 return result;
97}
98
99std::vector<CompositeArray> CompositeContainer::get_segments_data(const std::vector<RegionSegment>& segments) const
100{
101 std::vector<CompositeArray> result;
102 result.reserve(segments.size());
103
104 for (const auto& segment : segments) {
105 const auto& region = segment.source_region;
106
107 if (region.start_coordinates.size() != 1 || region.end_coordinates.size() != 1
108 || segment.offset_in_region.size() != 1 || segment.segment_size.size() != 1)
109 continue;
110
111 const uint64_t source_start = region.start_coordinates[0];
112 const uint64_t source_end = region.end_coordinates[0];
113 const uint64_t offset = segment.offset_in_region[0];
114 const uint64_t count = segment.segment_size[0];
115
116 if (source_start > source_end || offset > source_end - source_start || count == 0)
117 continue;
118
119 const uint64_t start = source_start + offset;
120 if (count - 1 > source_end - start)
121 continue;
122
123 auto copied = get_region_data(Region(
124 std::vector<uint64_t> { start }, std::vector<uint64_t> { start + count - 1 }));
125
126 if (!copied.empty())
127 result.push_back(std::move(copied.front()));
128 }
129 return result;
130}
131
132void CompositeContainer::set_region_data(const Region& region, const std::vector<CompositeArray>& data)
133{
134 const auto target = m_data.slice(region);
135 if (!target)
136 return;
137
138 size_t supplied = 0;
139 for (const auto& array : data) {
140 if (array.size() > target->size() - supplied)
141 return;
142 supplied += array.size();
143 }
144 if (supplied != target->size())
145 return;
146
147 CompositeArray replacement(m_data.layout());
148 CompositeInsertion insertion(replacement);
149
150 const auto before = m_data.slice(0, target->start());
151 const auto after_start = target->start() + target->size();
152 const auto after = m_data.slice(after_start, m_data.size() - after_start);
153
154 if (!before || !after || !append_slice(insertion, *before))
155 return;
156
157 for (const auto& array : data) {
158 const auto selected = array.slice(0, array.size());
159 if (!selected || !append_slice(insertion, *selected))
160 return;
161 }
162 if (!append_slice(insertion, *after))
163 return;
164
165 m_data = std::move(replacement);
166}
167
169{
170 m_region_groups[group.name] = group;
171}
172
174{
175 const auto it = m_region_groups.find(name);
176 return it == m_region_groups.end() ? RegionGroup {} : it->second;
177}
178
180{
181 m_region_groups.erase(name);
182}
183
185{
186 return m_data.slice(region).has_value();
187}
188
189uint64_t CompositeContainer::coordinates_to_linear_index(const std::vector<uint64_t>& coordinates) const
190{
191 return coordinates.size() == 1 ? coordinates[0] : 0;
192}
193
194std::vector<uint64_t> CompositeContainer::linear_index_to_coordinates(uint64_t linear_index) const
195{
196 return { linear_index };
197}
198
206
208{
209 const auto& bytes = std::get<std::vector<uint8_t>>(m_data.element_data());
210 return bytes.empty() ? nullptr : bytes.data();
211}
212
213}
uint64_t offset
Definition Composite.cpp:10
std::weak_ptr< Core::Window > window
Definition Picker.cpp:23
std::string name
Definition VKDevice.cpp:123
size_t count
size_t size() const noexcept
Number of packed elements.
const CompositeLayout & layout() const noexcept
Finalized layout shared by all elements.
const DataVariant & element_data() const noexcept
Borrow the full packed-element DataVariant without conversion.
std::optional< CompositeSlice > slice(size_t start, size_t count) const
Borrow consecutive elements without copying.
Owns a sequence of values that share a CompositeLayout.
std::vector< uint64_t > linear_index_to_coordinates(uint64_t linear_index) const override
Map a linear element index to one-dimensional coordinates.
std::unordered_map< std::string, RegionGroup > m_region_groups
bool is_region_loaded(const Region &region) const override
Valid element regions are already resident in the array.
std::vector< CompositeArray > get_region_group_data(const RegionGroup &group) const override
Copy the valid regions of a group into separate arrays.
void clear() override
Remove all elements while retaining the field layout.
void remove_region_group(const std::string &name) override
Remove a named region group if present.
std::vector< DataDimension > get_dimensions() const override
Describe the array's element axis.
DataFieldTraversal< CompositeArray > traverse(size_t batch_size=1) const noexcept
Create an independent traversal over elements.
RegionGroup get_region_group(const std::string &name) const override
Return a named region group, or an empty group if absent.
std::vector< CompositeArray > get_region_data(const Region &region) const override
Copy a one-dimensional Region into an owning CompositeArray.
bool at_end() const noexcept
Whether materialize_next() has no more elements.
CompositeContainer(CompositeLayout layout, size_t batch_size=1)
Construct empty source and materialized arrays with one layout.
void add_region_group(const RegionGroup &group) override
Store or replace a named region group.
const void * get_raw_data() const override
Borrow the packed element bytes, or nullptr when empty.
uint64_t coordinates_to_linear_index(const std::vector< uint64_t > &coordinates) const override
Map an element coordinate to its linear index.
void set_region_data(const Region &region, const std::vector< CompositeArray > &data) override
Replace a Region with an equal number of compatible elements.
std::vector< CompositeArray > get_segments_data(const std::vector< RegionSegment > &segments) const override
Copy valid one-dimensional segments into separate arrays.
bool materialize_next()
Copy the next bounded window into independent storage.
Mutable insertion adapter for a CompositeArray.
Shared field description and byte layout for a CompositeArray.
Definition Composite.hpp:52
std::vector< double > slice(std::span< const double > data, double start_ratio, double end_ratio)
Extract a contiguous slice by ratio, returning a new vector.
CopiedText copy(std::string_view text, const LayoutResult &layout, size_t a, size_t b)
Copy a byte range: the text it spans, and the quads that render it.
@ CUSTOM
User-defined or application-specific.
Minimal dimension descriptor focusing on structure only.
Definition NDData.hpp:197
std::vector< Region > regions
Collection of regions belonging to this group.
std::string name
Descriptive name of the group.
Organizes related signal regions into a categorized collection.
Represents a point or span in N-dimensional space.
Definition Region.hpp:73