133 const int columns_num = columns_info.
size();
137 for (
const int column_i :
IndexRange(columns_num)) {
138 ColumnInfo &column_info = columns_info[column_i];
143 if (column_info.
found_invalid.load(std::memory_order_relaxed)) {
148 const bool found_float = column_info.
found_float.load(std::memory_order_relaxed);
152 column_info.
found_invalid.store(
true, std::memory_order_relaxed);
155 chunk_result.
columns[column_i] = std::move(float_column_result.
data);
161 column_info.
found_invalid.store(
true, std::memory_order_relaxed);
165 chunk_result.
columns[column_i] = std::move(int_column_result.
data);
166 column_info.
found_int.store(
true, std::memory_order_relaxed);
170 column_info.
found_float.store(
true, std::memory_order_relaxed);
173 column_info.
found_invalid.store(
true, std::memory_order_relaxed);
176 chunk_result.
columns[column_i] = std::move(float_column_result.
data);
190 const int points_num = chunk_offsets.
total_size();
194 for (const int column_i : columns_range) {
195 const ColumnInfo &column_info = columns_info[column_i];
196 if (column_info.has_invalid_name || column_info.found_invalid) {
200 if (column_info.found_float) {
202 GArray<> attribute(CPPType::get<float>(), points_num);
203 float *attribute_buffer = static_cast<float *>(attribute.data());
204 threading::parallel_for(chunks.index_range(), 1, [&](const IndexRange chunks_range) {
205 for (const int chunk_i : chunks_range) {
206 const IndexRange dst_range = chunk_offsets[chunk_i];
207 ChunkResult &chunk = chunks[chunk_i];
208 ColumnData &column_data = chunk.columns[column_i];
209 if (const auto *float_vec = std::get_if<Vector<float>>(&column_data)) {
210 BLI_assert(float_vec->size() == dst_range.size());
211 uninitialized_copy_n(
212 float_vec->data(), dst_range.size(), attribute_buffer + dst_range.first());
214 else if (const auto *int_vec = std::get_if<Vector<int>>(&column_data)) {
217 BLI_assert(int_vec->size() == dst_range.size());
218 uninitialized_convert_n(int_vec->data(), dst_range.size(), attribute_buffer);
223 BLI_assert_unreachable();
226 column_data = std::monostate{};
229 flattened_attributes[column_i] = std::move(attribute);
232 if (column_info.found_int) {
234 GArray<> attribute(CPPType::get<int>(), points_num);
235 int *attribute_buffer = static_cast<int *>(attribute.data());
236 threading::parallel_for(chunks.index_range(), 1, [&](const IndexRange chunks_range) {
237 for (const int chunk_i : chunks_range) {
238 const IndexRange dst_range = chunk_offsets[chunk_i];
239 ChunkResult &chunk = chunks[chunk_i];
240 ColumnData &column_data = chunk.columns[column_i];
241 if (const auto *int_vec = std::get_if<Vector<int>>(&column_data)) {
242 BLI_assert(int_vec->size() == dst_range.size());
243 uninitialized_copy_n(
244 int_vec->data(), dst_range.size(), attribute_buffer + dst_range.first());
249 BLI_assert_unreachable();
252 column_data = std::monostate{};
255 flattened_attributes[column_i] = std::move(attribute);
260 return flattened_attributes;
267 if (buffer ==
nullptr) {
270 "CSV Import: Cannot open file '%s'",
275 if (buffer_len == 0) {
288 for (
const int i : record.index_range()) {
291 record.field_str(
i), parse_options, allocator);
307 buffer_span, parse_options, parse_header, parse_data_chunk);
309 if (!parsed_chunks.has_value()) {
312 "CSV import: failed to parse file '%s'",
320 chunk_offsets_vec.
append(0);
322 chunk_offsets_vec.
append(chunk_offsets_vec.
last() + chunk.rows_num);
325 const int points_num = chunk_offsets_vec.
last();
334 pointcloud->positions_for_write());
338 columns_info, chunk_offsets, *parsed_chunks);
344 for (
const int column_i : columns_info.
index_range()) {
345 std::optional<GArray<>> &attribute = flattened_attributes[column_i];
346 if (!attribute.has_value()) {
351 const ColumnInfo &column_info = columns_info[column_i];
352 attributes.add(column_info.
name,
356 data->remove_user_and_delete_if_last();