18 std::type_index
type {
typeid(void) };
29 std::string_view, std::span<const uint8_t>>;
63 requires(ArithmeticData<T> || std::same_as<std::remove_cvref_t<T>, std::string>
64 || std::same_as<std::remove_cvref_t<T>, std::vector<uint8_t>>)
67 if constexpr (std::same_as<std::remove_cvref_t<T>, std::string>
68 || std::same_as<std::remove_cvref_t<T>, std::vector<uint8_t>>) {
69 return add_field_impl(std::move(
name),
typeid(T), 2 *
sizeof(uint64_t));
71 return add_field_impl(std::move(
name),
typeid(T),
sizeof(T));
82 [[nodiscard]]
const std::vector<CompositeField>&
fields() const noexcept {
return m_fields; }
84 [[nodiscard]] std::optional<size_t> find_field(std::string_view
name)
const noexcept;
86 [[nodiscard]]
size_t stride_bytes() const noexcept {
return m_stride_bytes; }
88 [[nodiscard]]
size_t presence_bytes() const noexcept {
return m_presence_bytes; }
94 size_t m_stride_bytes {};
95 size_t m_presence_bytes {};
98 bool add_field_impl(std::string
name, std::type_index
type,
size_t size_bytes);
103class CompositeAccess;
105class CompositeInsertion;
106struct CompositeProjection;
138 [[nodiscard]]
bool has(std::string_view field_name)
const noexcept;
146 template <
typename T>
147 requires ArithmeticData<T>
148 [[nodiscard]] std::optional<T> get(std::string_view field_name)
const noexcept;
156 [[nodiscard]] std::optional<std::string_view> text(std::string_view field_name)
const noexcept;
158 [[nodiscard]] std::optional<CompositeValue>
value(std::string_view field_name)
const noexcept;
160 [[nodiscard]] std::optional<std::span<const uint8_t>> blob(std::string_view field_name)
const noexcept;
222 [[nodiscard]]
size_t size() const noexcept;
224 [[nodiscard]]
bool empty() const noexcept {
return size() == 0; }
230 [[nodiscard]] std::optional<Composite> at(
size_t index)
const noexcept;
235 [[nodiscard]] std::optional<CompositeAccess> access()
const;
242 [[nodiscard]] std::optional<CompositeSlice> slice(
size_t start,
size_t count)
const;
248 [[nodiscard]] std::optional<CompositeSlice> slice(
const Region& region)
const;
259 template <
typename T>
261 [[nodiscard]] std::optional<CompositeProjection> to_nddata(std::string_view field_name)
const;
278 template <
typename T>
279 requires ArithmeticData<T>
282 if constexpr (std::same_as<T, int64_t> || std::same_as<T, double>) {
283 const auto field_index = m_layout.find_field(field_name);
285 if constexpr (std::same_as<T, int64_t>)
291 const auto field_index = validate_write(
index, field_name,
typeid(T));
295 const auto& field = m_layout.fields()[*field_index];
296 auto&
rows = std::get<std::vector<uint8_t>>(m_rows);
297 std::memcpy(
rows.data() +
index * m_layout.stride_bytes() + field.offset_bytes,
299 set_present(
index, *field_index,
true);
311 bool set_text(
size_t index, std::string_view field_name, std::string_view
value);
313 bool set_null(
size_t index, std::string_view field_name);
315 bool set_blob(
size_t index, std::string_view field_name, std::span<const uint8_t>
value);
322 bool clear(
size_t index, std::string_view field_name);
340 [[nodiscard]]
bool is_present(
size_t index,
size_t field_index)
const noexcept;
341 void set_present(
size_t index,
size_t field_index,
bool present)
noexcept;
342 [[nodiscard]] std::optional<size_t> validate_write(
343 size_t index, std::string_view field_name, std::type_index
type)
const;
344 [[nodiscard]] std::optional<size_t> validate_dynamic_write(
345 size_t index, std::string_view field_name)
const;
346 bool set_integer(
size_t index, std::string_view field_name, int64_t
value);
347 bool set_real(
size_t index, std::string_view field_name,
double value);
351 requires ArithmeticData<T>
354 const auto field_index = m_layout->find_field(field_name);
355 if (!field_index || !has(field_name))
358 const auto& field = m_layout->fields()[*field_index];
360 if constexpr (std::same_as<T, int64_t> || std::same_as<T, double>) {
361 const auto dynamic =
value(field_name);
363 if (
const auto* typed = std::get_if<T>(&*dynamic))
369 if (field.type != std::type_index(
typeid(T)))
372 const auto&
rows = std::get<std::vector<uint8_t>>(*m_rows);
376 rows.data() + m_index * m_layout->stride_bytes() + field.offset_bytes,
vk::PhysicalDeviceType type
Validated, non-owning access to packed Composite NDData storage.
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.
bool set(size_t index, std::string_view field_name, T value)
Write an arithmetic field of an existing element.
const DataVariant & blob_data() const noexcept
Borrow the binary byte store used by BLOB fields.
const DataVariant & text_data() const noexcept
Borrow the UTF-8 byte DataVariant used by text fields.
Owns a sequence of values that share a CompositeLayout.
Mutable insertion adapter for a CompositeArray.
size_t stride_bytes() const noexcept
Bytes per packed element after finalization.
bool add_field(std::string name)
Declare a named arithmetic, text, or binary field.
const std::vector< CompositeField > & fields() const noexcept
Declared fields in element order, with finalized byte offsets.
bool add_dynamic_field(std::string name)
Declare a field with a per-element NULL, INTEGER, REAL, TEXT, or BLOB kind.
size_t presence_bytes() const noexcept
Bytes reserved for the per-element presence bitmap.
std::vector< CompositeField > m_fields
Shared field description and byte layout for a CompositeArray.
Composite(const CompositeLayout &layout, const DataVariant &rows, const DataVariant &text, const DataVariant &blob, size_t index) noexcept
const DataVariant * m_blob
const DataVariant * m_rows
const CompositeLayout * m_layout
std::optional< T > get(std::string_view field_name) const noexcept
Read a present arithmetic field by exact value type.
const DataVariant * m_text
Read view of one value in a CompositeArray.
Concept to constrain types to valid DataVariant elements.
std::variant< std::vector< double >, std::vector< float >, std::vector< uint8_t >, std::vector< uint16_t >, std::vector< uint32_t >, std::vector< std::complex< float > >, std::vector< std::complex< double > >, std::vector< glm::vec2 >, std::vector< glm::vec3 >, std::vector< glm::vec4 >, std::vector< glm::mat4 > > DataVariant
Multi-type data storage for different precision needs.
std::variant< std::monostate, int64_t, double, std::string_view, std::span< const uint8_t > > CompositeValue
Borrowed value of a present dynamic field; monostate represents NULL.
Description of one named value in a Composite.
Represents a point or span in N-dimensional space.