23 inline const ConstColNamesPtr& names()
const noexcept {
return names_; }
24 inline size_t n_cols()
const noexcept {
return names_->size(); }
25 inline const RowOverlay* find_edits(
size_t row)
const {
28 return edits_.empty() ?
nullptr : edits_[row].get();
31 if (
auto* overlay = edits_[row].get()) {
return overlay; }
32 std::lock_guard<std::mutex>
lock(creation_lock_);
33 return edits_[row].ensure();
35 inline size_t physical_column(
size_t column)
const {
36 return column_indices_.empty() ? column : column_indices_[column];
38 inline size_t logical_column(
size_t physical)
const {
39 if (column_indices_.empty()) {
return physical; }
40 const auto position = std::find(column_indices_.begin(), column_indices_.end(),
physical);
41 CSV_DEBUG_ASSERT(
position != column_indices_.end());
42 return static_cast<size_t>(std::distance(column_indices_.begin(),
position));
44 inline CellBinding bind(
size_t row,
size_t column)
const {
45 validate_column(column, n_cols());
46 return CellBinding{find_edits(row), physical_column(column)};
51 if (
cell.overlay &&
cell.overlay->try_get_view(
cell.physical_column, value)) {
return value; }
52 return RowViewAccessor::view(backing_->rows()[row],
cell.physical_column);
54 inline CSVRow make_inserted_row(
const std::vector<std::string>& row,
CSVError& error)
const {
55 if (!validate_row(row, n_cols(), error))
return {};
56 if (column_indices_.empty() && n_cols() == backing_->n_cols()) {
return RowStorageBuilder::make_row(row, backing_->names()); }
57 std::vector<std::string>
expanded(backing_->n_cols());
58 for (
size_t i = 0; i < row.size(); ++i) {
expanded[physical_column(i)] = row[i]; }
59 return RowStorageBuilder::make_row(
expanded, backing_->names());
61 inline void reserve_insert() {
62 backing_->reserve_insert();
65 inline void insert_row(
size_t index,
CSVRow&& row) {
68 backing_->insert_row(index, std::move(row));
71 inline void erase_row(
size_t index) {
72 edits_.erase(edits_.begin() + index);
73 backing_->erase_row(index);
75 inline bool erase_column(
size_t index,
int key_column,
CSVError& error) {
77 if (index >= n_cols()) {
return false; }
78 const size_t physical = physical_column(index);
82 std::vector<std::string> columns = names_->get_col_names();
83 columns.erase(columns.begin() + index);
84 ColNamesPtr names = std::make_shared<ColNames>();
85 names->set_policy(names_->get_policy());
86 names->set_col_names(columns);
87 std::vector<size_t>
mapping = column_indices_;
89 mapping.reserve(backing_->n_cols());
90 for (
size_t i = 0; i < backing_->n_cols(); ++i) {
mapping.push_back(i); }
93 names_ = std::move(names);
94 column_indices_ = std::move(
mapping);
97 inline std::unique_ptr<DirtyDataFrame> selected_rows(
102 result->column_indices_ = column_indices_;
104 for (
size_t i = 0; i <
mask.size(); ++i) {
106 if (
const auto* overlay = find_edits(i)) {
115 template<
typename BeforeReplace>
116 inline bool insert_column(
117 size_t index,
const std::string& name,
const std::string&
default_value,
131 for (
size_t column = 0; column < n_cols(); ++column)
133 for (
const auto& row : backing_->rows()) {
138 std::vector<std::string> columns = names_->get_col_names();
139 columns.insert(columns.begin() + index, name);
140 ColNamesPtr names = std::make_shared<ColNames>();
141 names->set_policy(names_->get_policy());
142 names->set_col_names(columns);
145 const size_t logical = logical_column(
static_cast<size_t>(key_column));
150 std::vector<CSVRow>
rebuilt = edits_.empty() && column_indices_.empty()
151 ? RowStorageBuilder::insert_column(backing_->rows().size(), names, index,
default_value,
152 [
this](
size_t row,
size_t column) { return RowViewAccessor::view(backing_->rows()[row], column); })
153 : RowStorageBuilder::insert_column(backing_->rows().size(), names, index,
default_value,
154 [
this](
size_t row,
size_t column) -> std::string {
155 const CellBinding cell = bind(row, column);
157 if (cell.overlay && cell.overlay->try_get_copy(cell.physical_column, value)) { return value; }
158 return std::string(RowViewAccessor::view(backing_->rows()[row],
cell.physical_column));
162 backing_->replace_rows(std::move(
rebuilt), std::move(names));
169 ConstColNamesPtr names_;
170 std::vector<RowOverlaySlot> edits_;
171 std::vector<size_t> column_indices_;
172 std::mutex creation_lock_;