6#include "../csv_exceptions.hpp"
7#include "../csv_row.hpp"
8#include "../raw_csv_data.hpp"
9#include "row_overlay.hpp"
13 namespace data_frame {
19 size_t physical_column;
22 template<
typename Container>
23 inline void reserve_next(
Container& values) {
24 const size_t required = values.size() + 1;
26 values.reserve(std::max(
required, values.capacity() * 2));
30 inline void validate_column(
size_t index,
size_t count) {
31 CSV_DEBUG_ASSERT(index < count);
32 (void)index; (void)count;
35 inline bool validate_row(
const std::vector<std::string>& row,
size_t columns, CSVError& error) {
37 if (columns == 0 && !row.empty()) {
40 if (row.size() != columns) {
46 inline std::vector<CSVRow> select_parsed_rows(
47 const std::vector<CSVRow>& rows,
const std::vector<std::uint8_t>& mask, CSVError& error
50 if (mask.size() != rows.size()) {
54 std::vector<CSVRow> selected;
55 selected.reserve(
static_cast<size_t>(std::count_if(mask.begin(), mask.end(),
56 [](std::uint8_t value) { return value != 0; })));
57 for (
size_t i = 0; i < rows.size(); ++i) {
58 if (mask[i]) { selected.push_back(rows[i]); }
66 explicit inline RowStorageBuilder(ConstColNamesPtr names) : names_(std::move(names)) {}
68 inline void begin_row() {
72 data_ = std::make_shared<RawCSVData>();
73 data_->col_names = std::const_pointer_cast<ColNames>(names_);
76 field_start_ = data_->fields.size();
77 data_->fields.reserve_for_source_size(field_start_ + names_->size());
81 const size_t offset = data_->quote_arena.append(value);
82 data_->fields.emplace_back(offset, value.size(),
true);
83 bytes_ += value.size();
86 inline CSVRow finish_row()
const {
87 return CSVRow(data_, 0, field_start_, data_->fields.size() - field_start_);
90 static inline CSVRow make_row(
const std::vector<std::string>& values, ConstColNamesPtr names) {
93 for (
const auto& value : values) { storage.append_field(
csv::string_view(value)); }
94 return storage.finish_row();
97 template<
typename FieldAt>
98 static inline std::vector<CSVRow> insert_column(
99 size_t count, ConstColNamesPtr names,
size_t index,
105 for (
size_t row = 0; row <
count; ++row) {
107 for (
size_t column = 0; column < names->size(); ++column) {
110 const auto value =
field_at(row, column < index ? column : column - 1);
114 rebuilt.push_back(storage.finish_row());
120 ConstColNamesPtr names_;
123 size_t field_start_ = 0;
Data structure for representing CSV rows.
Borrow a row and error state for synchronous, single-pass field access.
Shared lossless owned-row construction for insertion and materialization.
constexpr size_t CSV_CHUNK_SIZE_DEFAULT
Default chunk size for lazy-loading large CSV files.
The all encompassing namespace.
@ InvalidArgument
Invalid operation input, such as a null stream or zero batch size.
std::string_view string_view
The string_view class used by this library.