3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-07-19 10:52:02 +00:00

cleaner iterator

Signed-off-by: Lev <levnach@hotmail.com>
This commit is contained in:
Lev 2019-01-10 01:48:18 -08:00 committed by Lev Nachmanson
parent bd1be96e0f
commit d223f47526

View file

@ -51,20 +51,21 @@ struct solver::imp {
struct const_iterator_equiv_mon { struct const_iterator_equiv_mon {
// fields // fields
const unsigned_vector m_vars; vector<const unsigned_vector*> m_same_abs_vals;
vector<unsigned_vector::const_iterator> m_offsets; vector<unsigned_vector::const_iterator> m_its;
const imp& m_imp;
bool m_done; bool m_done;
const imp * m_imp;
// constructor for begin() // constructor for begin()
const_iterator_equiv_mon(const unsigned_vector& vars, const_iterator_equiv_mon(vector<const unsigned_vector*> abs_vals, const imp* i)
vector<unsigned_vector::const_iterator> offsets, : m_same_abs_vals(abs_vals),
const imp& i) : m_vars(vars), m_done(false),
m_offsets(offsets), m_imp(i) {
m_imp(i), for (auto it: abs_vals){
m_done(false) {} m_its.push_back(it->begin());
}
}
// constructor for end() // constructor for end()
const_iterator_equiv_mon( const imp& i) :m_imp(i), const_iterator_equiv_mon() : m_done(true) {}
m_done(true) {}
//typedefs //typedefs
typedef const_iterator_equiv_mon self_type; typedef const_iterator_equiv_mon self_type;
@ -77,10 +78,10 @@ struct solver::imp {
if (m_done) if (m_done)
return; return;
unsigned k = 0; unsigned k = 0;
for (; k < m_offsets.size(); k++) { for (; k < m_its.size(); k++) {
auto & it = m_offsets[k]; auto & it = m_its[k];
it++; it++;
const auto & evars = m_imp.abs_eq_vars(m_vars[k]); const auto & evars = *(m_same_abs_vals[k]);
if (it == evars.end()) { if (it == evars.end()) {
it = evars.begin(); it = evars.begin();
} else { } else {
@ -88,24 +89,23 @@ struct solver::imp {
} }
} }
if (k == m_vars.size()) { if (k == m_its.size()) {
m_done = true; m_done = true;
} }
} }
unsigned_vector get_key() const { unsigned_vector get_key() const {
unsigned_vector r; unsigned_vector r;
for(const auto& it : m_offsets){ for(const auto& it : m_its){
r.push_back(*it); r.push_back(*it);
} }
std::sort(r.begin(), r.end()); std::sort(r.begin(), r.end());
TRACE("nla_solver", tout << "r = "; m_imp.print_product_with_vars(r, tout);); TRACE("nla_solver", tout << "r = "; m_imp->print_product_with_vars(r, tout););
return r; return r;
} }
unsigned get_monomial() const { unsigned get_monomial() const {
unsigned_vector key = get_key(); return m_imp->find_monomial(get_key());
return m_imp.find_monomial(key);
} }
self_type operator++() {self_type i = *this; operator++(1); return i;} self_type operator++() {self_type i = *this; operator++(1); return i;}
@ -117,7 +117,7 @@ struct solver::imp {
unsigned i = get_monomial(); unsigned i = get_monomial();
TRACE("nla_solver", TRACE("nla_solver",
if (static_cast<int>(i) != -1) if (static_cast<int>(i) != -1)
m_imp.print_monomial_with_vars(m_imp.m_monomials[i], tout); m_imp->print_monomial_with_vars(m_imp->m_monomials[i], tout);
else else
tout << "not found";); tout << "not found";);
return i; return i;
@ -129,26 +129,18 @@ struct solver::imp {
const imp& m_imp; const imp& m_imp;
equiv_monomials(const monomial & m, const imp& i) : m_mon(m), m_imp(i) {} equiv_monomials(const monomial & m, const imp& i) : m_mon(m), m_imp(i) {}
const_iterator_equiv_mon begin() { vector<const unsigned_vector*> vars_eqs() const {
return const_iterator_equiv_mon(m_mon.vars(), vars_eq_offsets_begin(), m_imp); vector<const unsigned_vector*> r;
}
const_iterator_equiv_mon end() {
return const_iterator_equiv_mon(m_imp);
}
vector<unsigned_vector::const_iterator> vars_eq_offsets_end() const {
vector<unsigned_vector::const_iterator> r;
for(lpvar j : m_mon.vars()) { for(lpvar j : m_mon.vars()) {
r.push_back(m_imp.abs_eq_vars(j).end()); r.push_back(&m_imp.abs_eq_vars(j));
} }
return r; return r;
} }
vector<unsigned_vector::const_iterator> vars_eq_offsets_begin() const { const_iterator_equiv_mon begin() const {
vector<unsigned_vector::const_iterator> r; return const_iterator_equiv_mon(vars_eqs(), &m_imp);
for(lpvar j : m_mon.vars()) { }
r.push_back(m_imp.abs_eq_vars(j).begin()); const_iterator_equiv_mon end() const {
} return const_iterator_equiv_mon();
return r;
} }
}; };