MayaFlux 1.0.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ set_blob()

bool MayaFlux::Kakshya::CompositeArray::set_blob ( size_t  index,
std::string_view  field_name,
std::span< const uint8_t >  value 
)

Write binary bytes to a fixed or dynamic BLOB field.

Definition at line 265 of file Composite.cpp.

266{
267 const auto declared = m_layout.find_field(field_name);
268 const std::type_index expected = declared
269 && m_layout.fields()[*declared].type == typeid(detail::CompositeDynamic)
270 ? typeid(detail::CompositeDynamic) : typeid(std::vector<uint8_t>);
271 const auto field_index = validate_write(index, field_name, expected);
272 if (!field_index)
273 return false;
274
275 auto& blob = std::get<std::vector<uint8_t>>(m_blob);
276 if (value.size() > blob.max_size() - blob.size())
277 return false;
278 const std::vector<uint8_t> value_copy(value.begin(), value.end());
279 const TextSlice slice { static_cast<uint64_t>(blob.size()), static_cast<uint64_t>(value_copy.size()) };
280 blob.insert(blob.end(), value_copy.begin(), value_copy.end());
281
282 const auto& field = m_layout.fields()[*field_index];
283 auto& rows = std::get<std::vector<uint8_t>>(m_rows);
284 auto* destination = rows.data() + index * m_layout.stride_bytes() + field.offset_bytes;
285 if (field.type == typeid(detail::CompositeDynamic)) {
286 const DynamicCell cell { blob_kind, slice.offset, slice.length };
287 std::memcpy(destination, &cell, sizeof(cell));
288 } else {
289 std::memcpy(destination, &slice, sizeof(slice));
290 }
291 set_present(index, *field_index, true);
292 return true;
293}
uint32_t rows
glm::vec3 value
uint32_t index
Definition VKDevice.cpp:122
void set_present(size_t index, size_t field_index, bool present) noexcept
std::optional< CompositeSlice > slice(size_t start, size_t count) const
Borrow consecutive elements without copying.
std::optional< size_t > validate_write(size_t index, std::string_view field_name, std::type_index type) const
size_t stride_bytes() const noexcept
Bytes per packed element after finalization.
Definition Composite.hpp:86
const std::vector< CompositeField > & fields() const noexcept
Declared fields in element order, with finalized byte offsets.
Definition Composite.hpp:82
std::optional< size_t > find_field(std::string_view name) const noexcept
Find a field index by name, or std::nullopt if absent.
Definition Composite.cpp:54

References MayaFlux::Kakshya::CompositeLayout::fields(), MayaFlux::Kakshya::CompositeLayout::find_field(), index, m_blob, m_layout, m_rows, rows, set_present(), slice(), MayaFlux::Kakshya::CompositeLayout::stride_bytes(), validate_write(), and value.

Referenced by MayaFlux::Kakshya::CompositeInsertion::append().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: