18 return owner->make_cell(row_index,
false);
25 DataFrameColumn() : frame_(nullptr), mutable_frame_(nullptr), col_index_(0), generation_value_(0) {}
29 mutable_frame_(nullptr),
30 col_index_(col_index),
31 generation_(frame ? frame->column_generation_ : std::shared_ptr<size_t>()),
32 generation_value_(generation_ ? *generation_ : 0) {}
34 DataFrameColumn(DataFrame<KeyType>* frame,
size_t col_index)
36 mutable_frame_(frame),
37 col_index_(col_index),
38 generation_(frame ? frame->column_generation_ : std::shared_ptr<size_t>()),
39 generation_value_(generation_ ? *generation_ : 0) {}
42#if CSV_EXCEPTIONS_ENABLED
43 const std::string&
name()
const {
45 this->require_valid(error);
46 internals::throw_dataframe_error(error);
47 return frame_->
columns()[col_index_];
53 if (!this->require_valid(error))
return {};
54 return frame_->try_make_cell(row_index, col_index_, mutable_frame_ !=
nullptr, error);
57 if (!this->require_valid(error))
return {};
58 return frame_->try_make_cell(row_index, col_index_,
false, error);
63 if (!this->require_valid(error) || !frame_)
return {};
64 const auto binding = frame_->storage_.try_bind(row_index, col_index_, error);
66 return error ?
csv::string_view() : frame_->cell_view(row_index, col_index_);
69 if (!this->require_valid(error) || !frame_)
return {};
72 template<
typename T = std::
string>
73 std::vector<T> try_to_vector(CSVError& error)
const {
74 std::vector<T> values;
75 if (!this->require_valid(error))
return values;
76 values.reserve(this->
size());
77 for (
size_t i = 0; i < this->
size(); ++i) {
79 if (error)
return values;
82 if (!cell.try_get(value, conversion)) {
86 values.push_back(std::move(value));
90 bool try_erase(CSVError& error) {
91 if (!this->require_valid(error))
return false;
94 return mutable_frame_->erase_column_at_index(col_index_, error);
99 return frame_ && generation_ && *generation_ == generation_value_
100 && col_index_ < frame_->
n_cols();
114 return frame_->
size();
119 return this->
size() == 0;
123#if CSV_EXCEPTIONS_ENABLED
126 auto result = this->
try_field(row_index, error);
127 internals::throw_dataframe_error(error);
133#if CSV_EXCEPTIONS_ENABLED
136 auto result = this->
try_field(row_index, error);
137 internals::throw_dataframe_error(error);
148#if CSV_EXCEPTIONS_ENABLED
151 auto result = this->try_get_sv(row_index, error);
152 internals::throw_dataframe_error(error);
158#if CSV_EXCEPTIONS_ENABLED
159 template<
typename T = std::
string>
162 auto result = this->
template try_to_vector<T>(error);
163 internals::throw_dataframe_error(error);
169#if CSV_EXCEPTIONS_ENABLED
170 operator std::vector<std::string>()
const {
171 std::vector<std::string> result;
172 result.reserve(this->
size());
173 for (
size_t i = 0; i < this->
size(); ++i)
174 result.emplace_back(this->make_cell(i,
false).get_sv());
183#if CSV_EXCEPTIONS_ENABLED
186 const bool result = this->try_erase(error);
187 internals::throw_dataframe_error(error);
192#if defined(CSV_HAS_CXX20) && CSV_EXCEPTIONS_ENABLED
198 return std::views::iota(
size_t{0}, this->
size())
199 | std::views::transform([
this](
size_t row_index) {
200 return std::string(this->make_cell(row_index,
false).
get_sv());
205#if CSV_EXCEPTIONS_ENABLED
208 iterator end()
const {
return iterator(
this, this->
size()); }
209 const_iterator cbegin()
const {
return const_iterator(
this, 0); }
210 const_iterator cend()
const {
return const_iterator(
this, this->
size()); }
215 DataFrameCell make_cell(
size_t row_index,
bool mutable_access)
const {
216#if CSV_EXCEPTIONS_ENABLED
218 if (!this->require_valid(error) || !frame_->validate_row_index(row_index, error))
219 internals::throw_dataframe_error(error);
221 CSV_DEBUG_ASSERT(this->
is_valid() && row_index < this->
size());
223 return frame_->make_cell(row_index, col_index_, mutable_access);
226 bool require_valid(CSVError& error)
const {
228 if (!frame_ || !generation_ || *generation_ != generation_value_)
230 "DataFrameColumn proxy is invalid after structural column mutation");
231 return col_index_ < frame_->
n_cols() || internals::fail_static(
235 const DataFrame<KeyType>* frame_;
236 DataFrame<KeyType>* mutable_frame_;
238 std::shared_ptr<size_t> generation_;
239 size_t generation_value_;