From 1c04181aaa53e313dd07296fbaab072f0207c919 Mon Sep 17 00:00:00 2001 From: "lperron@google.com" Date: Thu, 31 May 2012 09:51:08 +0000 Subject: [PATCH] more work on table --- src/constraint_solver/bucket_table.cc | 29 ++++++++++++++++++--------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/constraint_solver/bucket_table.cc b/src/constraint_solver/bucket_table.cc index a77ddfd40f..8ab35cf4dc 100644 --- a/src/constraint_solver/bucket_table.cc +++ b/src/constraint_solver/bucket_table.cc @@ -139,11 +139,19 @@ template class RevIntMap { int Capacity() const { return capacity_; } - T operator[](int i) const { - DCHECK_LT(i, capacity_); + + T Element(int i) const { + DCHECK_GE(i, 0); + DCHECK_LT(i, num_elements_.Value()); return elements_[i]; } + T RemovedElement(int i) const { + DCHECK_GE(i, 0); + DCHECK_LT(i + num_elements_.Value(), capacity_); + return elements_[i + num_elements_.Value()]; + } + void Insert(Solver* const solver, T elt) { const int position = num_elements_.Value(); DCHECK_LT(position, capacity_); @@ -314,7 +322,7 @@ class TableVar { RevIntMap* const active_tuples = tuples_per_value_[delta[k]]; const int num_tuples_to_erase = active_tuples->Size(); for (int index = 0; index < num_tuples_to_erase; index++) { - tuples_to_remove->push_back((*active_tuples)[index]); + tuples_to_remove->push_back(active_tuples->Element(index)); } } } @@ -328,7 +336,7 @@ class TableVar { RevIntMap* const active_tuples = tuples_per_value_[value_index]; const int num_tuples = active_tuples->Size(); for (int j = 0; j < num_tuples; j++) { - tuples_to_keep->push_back((*active_tuples)[j]); + tuples_to_keep->push_back(active_tuples->Element(j)); } } } @@ -348,7 +356,7 @@ class TableVar { void OverwriteTuples(const std::vector& tuples) { for (int k = 0; k < active_values_.Size(); k++) { - tuples_per_value_[active_values_[k]]->Clear(solver_); + tuples_per_value_[active_values_.Element(k)]->Clear(solver_); } for (int i = 0; i < tuples.size(); ++i) { const int tuple_index = tuples[i]; @@ -359,15 +367,16 @@ class TableVar { // We check for unsupported values and remove them. int count = 0; for (int k = active_values_.Size() - 1; k >= 0; k--) { - if (tuples_per_value_[active_values_[k]]->Size() == 0) { - active_values_.Remove(solver_, active_values_[k]); + const int64 value_index = active_values_.Element(k); + if (tuples_per_value_[value_index]->Size() == 0) { + active_values_.Remove(solver_, value_index); count++; } } // Removed values have been inserted after the last active value. - const int num_active_values = active_values_.Size(); - for (int k = num_active_values; k < count + num_active_values; ++k) { - var_->RemoveValue(column_.ValueFromIndex(active_values_[k])); + for (int k = 0; k < count; ++k) { + const int64 value_index = active_values_.RemovedElement(k); + var_->RemoveValue(column_.ValueFromIndex(value_index)); } }