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

◆ reconstruct_projected_composite()

template<typename ValueT , typename T >
requires (detail::is_composite_operation_data_v<T> && ArithmeticData<ValueT> && Kakshya::DataVariantElement<ValueT>)
static std::optional< Kakshya::CompositeArray > MayaFlux::Yantra::OperationHelper::reconstruct_projected_composite ( const T &  compute_data,
const CompositeFieldDoubleData &  projected 
)
inlinestatic

Copy Composite records and replace one projected numeric field.

Template Parameters
ValueTExact destination field type.
Returns
Updated records, or nullopt for incompatible shape, type, or value.
Note
Unprojected fields are retained; the mask sets field presence.

Definition at line 170 of file OperationHelper.hpp.

172 {
173 const auto& source = extract_composite_data(compute_data);
174 if (!projected.source_structure.composite_layout)
175 return std::nullopt;
176
177 const auto& original_layout = *projected.source_structure.composite_layout;
178 const auto& current_layout = source.layout();
179 if (original_layout.stride_bytes() != current_layout.stride_bytes()
180 || original_layout.presence_bytes() != current_layout.presence_bytes()
181 || original_layout.fields().size() != current_layout.fields().size())
182 return std::nullopt;
183
184 for (size_t i = 0; i < current_layout.fields().size(); ++i) {
185 const auto& original = original_layout.fields()[i];
186 const auto& current = current_layout.fields()[i];
187 if (original.name != current.name || original.type != current.type
188 || original.offset_bytes != current.offset_bytes
189 || original.size_bytes != current.size_bytes)
190 return std::nullopt;
191 }
192
193 const auto field_index = source.layout().find_field(projected.field_name);
194 if (!field_index || source.layout().fields()[*field_index].type != typeid(ValueT)
195 || projected.values.size() != source.size()
196 || projected.presence.size() != source.size())
197 return std::nullopt;
198
199 Kakshya::CompositeArray result(source);
200 for (size_t row = 0; row < source.size(); ++row) {
201 if (!projected.presence[row]) {
202 if (!result.clear(row, projected.field_name))
203 return std::nullopt;
204 continue;
205 }
206
207 const double value = projected.values[row];
208 if constexpr (std::integral<ValueT>) {
209 if (!std::isfinite(value) || std::trunc(value) != value
210 || value < static_cast<double>(std::numeric_limits<ValueT>::lowest())
211 || value > static_cast<double>(std::numeric_limits<ValueT>::max()))
212 return std::nullopt;
213 } else if constexpr (std::same_as<ValueT, float>) {
214 if (std::isfinite(value)
215 && (value < -static_cast<double>(std::numeric_limits<float>::max())
216 || value > static_cast<double>(std::numeric_limits<float>::max())))
217 return std::nullopt;
218 }
219
220 if (!result.set(row, projected.field_name, static_cast<ValueT>(value)))
221 return std::nullopt;
222 }
223
224 return std::optional<Kakshya::CompositeArray>(std::move(result));
225 }
bool size
glm::vec2 current
glm::vec3 value
static const Kakshya::CompositeArray & extract_composite_data(const Kakshya::CompositeArray &data) noexcept
Borrow an owning Composite array without converting its fields.
Source source()
Begin a Source chain.
Definition Plot.hpp:127

References MayaFlux::Kakshya::CompositeArray::clear(), MayaFlux::Yantra::DataStructureInfo::composite_layout, current, MayaFlux::Yantra::CompositeFieldDoubleData::field_name, MayaFlux::Yantra::CompositeFieldDoubleData::presence, MayaFlux::Kakshya::CompositeArray::set(), size, MayaFlux::Yantra::CompositeFieldDoubleData::source_structure, value, and MayaFlux::Yantra::CompositeFieldDoubleData::values.

+ Here is the call graph for this function: