81 const std::vector<std::vector<double>>& columns,
84 if (columns.empty()) {
89 int expected_rows =
static_cast<int>(structure_info.
dimensions[0].size);
90 int expected_cols =
static_cast<int>(structure_info.
dimensions[1].size);
92 if (columns.size() != expected_cols) {
94 "Column count doesn't match dimension info. Expected {}, got {}", expected_cols, columns.size());
96 if (!columns.empty() && columns[0].size() != expected_rows) {
98 "Row count doesn't match dimension info. Expected {}, got {}", expected_rows, columns[0].size());
108 const std::vector<std::span<const double>>& spans,
116 int expected_rows =
static_cast<int>(structure_info.
dimensions[0].size);
117 int expected_cols =
static_cast<int>(structure_info.
dimensions[1].size);
119 if (spans.size() != expected_cols) {
121 "Column count doesn't match dimension info. Expected {}, got {}", expected_cols, spans.size());
123 if (!spans.empty() && spans[0].size() != expected_rows) {
125 "Row count doesn't match dimension info. Expected {}, got {}", expected_rows, spans[0].size());
135 if (double_data.empty()) {
143 if (structure_info.
original_type == std::type_index(
typeid(std::vector<float>))) {
144 std::vector<float> float_data;
145 float_data.reserve(double_data.size());
146 std::ranges::transform(double_data, std::back_inserter(float_data),
147 [](
double v) {
return static_cast<float>(v); });
151 if (structure_info.
original_type == std::type_index(
typeid(std::vector<uint8_t>))) {
152 std::vector<uint8_t> u8_data;
153 u8_data.reserve(double_data.size());
154 std::ranges::transform(double_data, std::back_inserter(u8_data),
155 [](
double v) {
return static_cast<uint8_t
>(std::clamp(v, 0.0, 255.0)); });
159 if (structure_info.
original_type == std::type_index(
typeid(std::vector<uint16_t>))) {
160 std::vector<uint16_t> u16_data;
161 u16_data.reserve(double_data.size());
162 std::ranges::transform(double_data, std::back_inserter(u16_data),
163 [](
double v) {
return static_cast<uint16_t
>(std::clamp(v, 0.0, 65535.0)); });
167 if (structure_info.
original_type == std::type_index(
typeid(std::vector<uint32_t>))) {
168 std::vector<uint32_t> u32_data;
169 u32_data.reserve(double_data.size());
170 std::ranges::transform(double_data, std::back_inserter(u32_data),
171 [](
double v) {
return static_cast<uint32_t
>(std::max(v, 0.0)); });
180 if (double_data.size() % rows != 0) {
191 auto r =
static_cast<Eigen::Index
>(rows);
192 auto c =
static_cast<Eigen::Index
>(double_data.size() / rows);
194 Eigen::Map<const Eigen::MatrixXd> mapped(double_data.data(), r, c);
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.