9 bool append_slice(CompositeInsertion& insertion,
const CompositeSlice& slice)
11 for (
size_t i = 0; i <
slice.size(); ++i) {
12 const auto element =
slice.at(i);
13 if (!element || !insertion.append(*element))
19 std::optional<CompositeArray> copy_slice(
const CompositeSlice& slice)
22 CompositeInsertion insertion(copy);
23 if (!append_slice(insertion, slice))
31 : m_data(
std::move(layout))
32 , m_materialized_data(m_data.layout())
33 , m_batch_size(batch_size == 0 ? 1 : batch_size)
38 : m_data(
std::move(data))
39 , m_materialized_data(m_data.layout())
40 , m_batch_size(batch_size == 0 ? 1 : batch_size)
53 const auto window = traversal.current();
57 auto next = copy_slice(*
window);
77 auto copy = copy_slice(*selected);
81 std::vector<CompositeArray> result;
82 result.push_back(std::move(*copy));
88 std::vector<CompositeArray> result;
89 result.reserve(group.
regions.size());
91 for (
const auto& region : group.
regions) {
94 result.push_back(std::move(copied.front()));
101 std::vector<CompositeArray> result;
102 result.reserve(segments.size());
104 for (
const auto& segment : segments) {
105 const auto& region = segment.source_region;
107 if (region.start_coordinates.size() != 1 || region.end_coordinates.size() != 1
108 || segment.offset_in_region.size() != 1 || segment.segment_size.size() != 1)
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];
116 if (source_start > source_end ||
offset > source_end - source_start ||
count == 0)
119 const uint64_t start = source_start +
offset;
120 if (
count - 1 > source_end - start)
124 std::vector<uint64_t> { start }, std::vector<uint64_t> { start +
count - 1 }));
127 result.push_back(std::move(copied.front()));
139 for (
const auto& array : data) {
140 if (array.size() > target->size() - supplied)
142 supplied += array.size();
144 if (supplied != target->size())
150 const auto before =
m_data.
slice(0, target->start());
151 const auto after_start = target->start() + target->size();
154 if (!before || !after || !append_slice(insertion, *before))
157 for (
const auto& array : data) {
158 const auto selected = array.slice(0, array.size());
159 if (!selected || !append_slice(insertion, *selected))
162 if (!append_slice(insertion, *after))
165 m_data = std::move(replacement);
191 return coordinates.size() == 1 ? coordinates[0] : 0;
196 return { linear_index };
210 return bytes.empty() ? nullptr : bytes.data();
std::weak_ptr< Core::Window > window
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 ®ion) 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.
CompositeArray m_materialized_data
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 ®ion) 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.
~CompositeContainer() override
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 ®ion, 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.
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.
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.