Int Column<Float>::scan(Float value) const { if (table_->max_row_id().is_na()) { return Int::na(); } size_t table_size = table_->max_row_id().raw() + 1; size_t valid_size = (values_.size() < table_size) ? values_.size() : table_size; if (value.is_na()) { if (values_.size() < table_size) { return table_->max_row_id(); } bool is_full = table_->is_full(); for (size_t i = 0; i < valid_size; ++i) { if (values_[i].is_na() && (is_full || table_->_test_row(i))) { return Int(i); } } } else { for (size_t i = 0; i < valid_size; ++i) { if (values_[i].match(value)) { return Int(i); } } } return Int::na(); }
Int Column<Float>::find_one(const Datum &datum) const { // TODO: Choose the best index. Float value = parse_datum(datum); if (!value.is_na() && !indexes_.is_empty()) { return indexes_[0]->find_one(datum); } return scan(value); }
void Column<Float>::unset(Int row_id) { Float value = get(row_id); if (!value.is_na()) { // Update indexes if exist. for (size_t i = 0; i < num_indexes(); ++i) { indexes_[i]->remove(row_id, value); } values_[row_id.raw()] = Float::na(); } }
bool Column<Float>::contains(const Datum &datum) const { // TODO: Choose the best index. Float value = parse_datum(datum); if (!indexes_.is_empty()) { if (value.is_na()) { return table_->num_rows() != indexes_[0]->num_entries(); } return indexes_[0]->contains(datum); } return !scan(value).is_na(); }