3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-02 20:31:21 +00:00

remove template dependency for trail objects

This commit is contained in:
Nikolaj Bjorner 2021-03-19 11:14:20 -07:00
parent c05c5caab5
commit 15a7621e27
28 changed files with 46 additions and 58 deletions

View file

@ -82,7 +82,7 @@ class emonics {
}; };
union_find<emonics> m_u_f; union_find<emonics> m_u_f;
trail_stack<emonics> m_u_f_stack; trail_stack m_u_f_stack;
mutable svector<lpvar> m_find_key; // the key used when looking for a monic with the specific variables mutable svector<lpvar> m_find_key; // the key used when looking for a monic with the specific variables
var_eqs<emonics>& m_ve; var_eqs<emonics>& m_ve;
mutable vector<monic> m_monics; // set of monics mutable vector<monic> m_monics; // set of monics
@ -124,7 +124,7 @@ public:
*/ */
emonics(var_eqs<emonics>& ve): emonics(var_eqs<emonics>& ve):
m_u_f(*this), m_u_f(*this),
m_u_f_stack(*this), m_u_f_stack(),
m_ve(ve), m_ve(ve),
m_visited(0), m_visited(0),
m_cg_hash(*this), m_cg_hash(*this),
@ -141,7 +141,7 @@ public:
void after_merge_eh(unsigned r2, unsigned r1, unsigned v2, unsigned v1) {} void after_merge_eh(unsigned r2, unsigned r1, unsigned v2, unsigned v1) {}
// this method is required by union_find // this method is required by union_find
trail_stack<emonics> & get_trail_stack() { return m_u_f_stack; } trail_stack & get_trail_stack() { return m_u_f_stack; }
/** /**
\brief push/pop scopes. \brief push/pop scopes.

View file

@ -72,7 +72,7 @@ class var_eqs {
m_trail; m_trail;
vector<svector<eq_edge>> m_eqs; // signed_var.index() -> the edges adjacent to signed_var.index() vector<svector<eq_edge>> m_eqs; // signed_var.index() -> the edges adjacent to signed_var.index()
trail_stack<var_eqs> m_stack; trail_stack m_stack;
mutable svector<var_frame> m_todo; mutable svector<var_frame> m_todo;
mutable bool_vector m_marked; mutable bool_vector m_marked;
mutable unsigned_vector m_marked_trail; mutable unsigned_vector m_marked_trail;
@ -80,7 +80,7 @@ class var_eqs {
mutable stats m_stats; mutable stats m_stats;
public: public:
var_eqs(): m_merge_handler(nullptr), m_uf(*this), m_stack(*this) {} var_eqs(): m_merge_handler(nullptr), m_uf(*this), m_stack() {}
/** /**
\brief push a scope */ \brief push a scope */
void push() { void push() {
@ -328,7 +328,7 @@ public:
// union find event handlers // union find event handlers
void set_merge_handler(T* mh) { m_merge_handler = mh; } void set_merge_handler(T* mh) { m_merge_handler = mh; }
// this method is required by union_find // this method is required by union_find
trail_stack<var_eqs> & get_trail_stack() { return m_stack; } trail_stack & get_trail_stack() { return m_stack; }
void unmerge_eh(unsigned i, unsigned j) { void unmerge_eh(unsigned i, unsigned j) {
if (m_merge_handler) { if (m_merge_handler) {

View file

@ -210,7 +210,7 @@ namespace datalog {
m_contains_p(*this), m_contains_p(*this),
m_rule_properties(m, m_rule_manager, *this, m_contains_p), m_rule_properties(m, m_rule_manager, *this, m_contains_p),
m_transf(*this), m_transf(*this),
m_trail(*this), m_trail(),
m_pinned(m), m_pinned(m),
m_bind_variables(m), m_bind_variables(m),
m_rule_set(*this), m_rule_set(*this),

View file

@ -176,7 +176,7 @@ namespace datalog {
contains_pred m_contains_p; contains_pred m_contains_p;
rule_properties m_rule_properties; rule_properties m_rule_properties;
rule_transformer m_transf; rule_transformer m_transf;
trail_stack<context> m_trail; trail_stack m_trail;
ast_ref_vector m_pinned; ast_ref_vector m_pinned;
bind_variables m_bind_variables; bind_variables m_bind_variables;
sort_domain_map m_sorts; sort_domain_map m_sorts;

View file

@ -44,7 +44,7 @@ struct dl_context {
unsigned m_ref_count; unsigned m_ref_count;
datalog::dl_decl_plugin* m_decl_plugin; datalog::dl_decl_plugin* m_decl_plugin;
scoped_ptr<datalog::context> m_context; scoped_ptr<datalog::context> m_context;
trail_stack<dl_context> m_trail; trail_stack m_trail;
fp_params const& get_params() { fp_params const& get_params() {
init(); init();
@ -57,7 +57,7 @@ struct dl_context {
m_collected_cmds(collected_cmds), m_collected_cmds(collected_cmds),
m_ref_count(0), m_ref_count(0),
m_decl_plugin(nullptr), m_decl_plugin(nullptr),
m_trail(*this) {} m_trail() {}
void inc_ref() { void inc_ref() {
++m_ref_count; ++m_ref_count;

View file

@ -716,7 +716,7 @@ namespace bv {
values[n->get_root_id()] = bv.mk_numeral(val, m_bits[v].size()); values[n->get_root_id()] = bv.mk_numeral(val, m_bits[v].size());
} }
trail_stack<euf::solver>& solver::get_trail_stack() { trail_stack& solver::get_trail_stack() {
return ctx.get_trail_stack(); return ctx.get_trail_stack();
} }

View file

@ -359,7 +359,7 @@ namespace bv {
void merge_eh(theory_var, theory_var, theory_var v1, theory_var v2); void merge_eh(theory_var, theory_var, theory_var v1, theory_var v2);
void after_merge_eh(theory_var r1, theory_var r2, theory_var v1, theory_var v2) { SASSERT(check_zero_one_bits(r1)); } void after_merge_eh(theory_var r1, theory_var r2, theory_var v1, theory_var v2) { SASSERT(check_zero_one_bits(r1)); }
void unmerge_eh(theory_var v1, theory_var v2); void unmerge_eh(theory_var v1, theory_var v2);
trail_stack<euf::solver>& get_trail_stack(); trail_stack& get_trail_stack();
// diagnostics // diagnostics
std::ostream& display(std::ostream& out, theory_var v) const; std::ostream& display(std::ostream& out, theory_var v) const;

View file

@ -42,7 +42,7 @@ namespace euf {
m(m), m(m),
si(si), si(si),
m_egraph(m), m_egraph(m),
m_trail(*this), m_trail(),
m_rewriter(m), m_rewriter(m),
m_unhandled_functions(m), m_unhandled_functions(m),
m_lookahead(nullptr), m_lookahead(nullptr),

View file

@ -73,7 +73,6 @@ namespace euf {
struct scope { struct scope {
unsigned m_var_lim; unsigned m_var_lim;
}; };
typedef trail_stack<solver> euf_trail_stack;
size_t* to_ptr(sat::literal l) { return TAG(size_t*, reinterpret_cast<size_t*>((size_t)(l.index() << 4)), 1); } size_t* to_ptr(sat::literal l) { return TAG(size_t*, reinterpret_cast<size_t*>((size_t)(l.index() << 4)), 1); }
@ -93,7 +92,7 @@ namespace euf {
sat::sat_internalizer& si; sat::sat_internalizer& si;
smt_params m_config; smt_params m_config;
euf::egraph m_egraph; euf::egraph m_egraph;
euf_trail_stack m_trail; trail_stack m_trail;
stats m_stats; stats m_stats;
th_rewriter m_rewriter; th_rewriter m_rewriter;
func_decl_ref_vector m_unhandled_functions; func_decl_ref_vector m_unhandled_functions;
@ -265,7 +264,7 @@ namespace euf {
vec.push_back(val); vec.push_back(val);
push(push_back_trail< V, false>(vec)); push(push_back_trail< V, false>(vec));
} }
euf_trail_stack& get_trail_stack() { return m_trail; } trail_stack& get_trail_stack() { return m_trail; }
void updt_params(params_ref const& p); void updt_params(params_ref const& p);
void set_lookahead(sat::lookahead* s) override { m_lookahead = s; } void set_lookahead(sat::lookahead* s) override { m_lookahead = s; }

View file

@ -71,8 +71,6 @@ namespace q {
class mam_impl; class mam_impl;
typedef trail_stack<mam_impl> mam_trail_stack;
template<typename T> template<typename T>
class mam_value_trail : public value_trail<T> { class mam_value_trail : public value_trail<T> {

View file

@ -65,7 +65,7 @@ namespace euf {
return ctx.get_region(); return ctx.get_region();
} }
trail_stack<euf::solver>& th_euf_solver::get_trail_stack() { trail_stack& th_euf_solver::get_trail_stack() {
return ctx.get_trail_stack(); return ctx.get_trail_stack();
} }

View file

@ -182,7 +182,7 @@ namespace euf {
sat::literal mk_literal(expr* e) const; sat::literal mk_literal(expr* e) const;
theory_var get_th_var(enode* n) const { return n->get_th_var(get_id()); } theory_var get_th_var(enode* n) const { return n->get_th_var(get_id()); }
theory_var get_th_var(expr* e) const; theory_var get_th_var(expr* e) const;
trail_stack<euf::solver>& get_trail_stack(); trail_stack& get_trail_stack();
bool is_attached_to_var(enode* n) const; bool is_attached_to_var(enode* n) const;
bool is_root(theory_var v) const { return var2enode(v)->is_root(); } bool is_root(theory_var v) const { return var2enode(v)->is_root(); }
void push() override { m_num_scopes++; } void push() override { m_num_scopes++; }

View file

@ -64,7 +64,7 @@ namespace {
class mam_impl; class mam_impl;
typedef trail_stack<mam_impl> mam_trail_stack; typedef trail_stack mam_trail_stack;
typedef trail mam_trail; typedef trail mam_trail;
@ -3816,7 +3816,7 @@ namespace {
mam(ctx), mam(ctx),
m(ctx.get_manager()), m(ctx.get_manager()),
m_use_filters(use_filters), m_use_filters(use_filters),
m_trail_stack(*this), m_trail_stack(),
m_ct_manager(m_lbl_hasher, m_trail_stack), m_ct_manager(m_lbl_hasher, m_trail_stack),
m_compiler(ctx, m_ct_manager, m_lbl_hasher, use_filters), m_compiler(ctx, m_ct_manager, m_lbl_hasher, use_filters),
m_interpreter(ctx, *this, use_filters), m_interpreter(ctx, *this, use_filters),

View file

@ -1941,7 +1941,7 @@ namespace smt {
\brief Execute generic undo-objects. \brief Execute generic undo-objects.
*/ */
void context::undo_trail_stack(unsigned old_size) { void context::undo_trail_stack(unsigned old_size) {
::undo_trail_stack(*this, m_trail_stack, old_size); ::undo_trail_stack(m_trail_stack, old_size);
} }
/** /**

View file

@ -28,7 +28,7 @@ namespace smt {
theory_array_base(ctx), theory_array_base(ctx),
m_params(ctx.get_fparams()), m_params(ctx.get_fparams()),
m_find(*this), m_find(*this),
m_trail_stack(*this), m_trail_stack(),
m_final_check_idx(0) { m_final_check_idx(0) {
if (!ctx.relevancy()) if (!ctx.relevancy())
m_params.m_array_laziness = 0; m_params.m_array_laziness = 0;

View file

@ -35,7 +35,6 @@ namespace smt {
class theory_array : public theory_array_base { class theory_array : public theory_array_base {
protected: protected:
typedef trail_stack<theory_array> th_trail_stack;
typedef union_find<theory_array> th_union_find; typedef union_find<theory_array> th_union_find;
struct var_data { struct var_data {
@ -51,7 +50,7 @@ namespace smt {
theory_array_params& m_params; theory_array_params& m_params;
theory_array_stats m_stats; theory_array_stats m_stats;
th_union_find m_find; th_union_find m_find;
th_trail_stack m_trail_stack; trail_stack m_trail_stack;
unsigned m_final_check_idx; unsigned m_final_check_idx;
theory_var mk_var(enode * n) override; theory_var mk_var(enode * n) override;
@ -104,7 +103,7 @@ namespace smt {
virtual void display_var(std::ostream & out, theory_var v) const; virtual void display_var(std::ostream & out, theory_var v) const;
void display(std::ostream & out) const override; void display(std::ostream & out) const override;
void collect_statistics(::statistics & st) const override; void collect_statistics(::statistics & st) const override;
th_trail_stack & get_trail_stack() { return m_trail_stack; } trail_stack & get_trail_stack() { return m_trail_stack; }
virtual void merge_eh(theory_var v1, theory_var v2, theory_var, theory_var); virtual void merge_eh(theory_var v1, theory_var v2, theory_var, theory_var);
static void after_merge_eh(theory_var r1, theory_var r2, theory_var v1, theory_var v2) {} static void after_merge_eh(theory_var r1, theory_var r2, theory_var v1, theory_var v2) {}
void unmerge_eh(theory_var v1, theory_var v2); void unmerge_eh(theory_var v1, theory_var v2);

View file

@ -1442,7 +1442,7 @@ namespace smt {
m_util(ctx.get_manager()), m_util(ctx.get_manager()),
m_autil(ctx.get_manager()), m_autil(ctx.get_manager()),
m_bb(ctx.get_manager(), ctx.get_fparams()), m_bb(ctx.get_manager(), ctx.get_fparams()),
m_trail_stack(*this), m_trail_stack(),
m_find(*this), m_find(*this),
m_approximates_large_bvs(false) { m_approximates_large_bvs(false) {
memset(m_eq_activity, 0, sizeof(m_eq_activity)); memset(m_eq_activity, 0, sizeof(m_eq_activity));

View file

@ -37,7 +37,6 @@ namespace smt {
class theory_bv : public theory { class theory_bv : public theory {
typedef rational numeral; typedef rational numeral;
typedef trail_stack<theory_bv> th_trail_stack;
typedef union_find<theory_bv> th_union_find; typedef union_find<theory_bv> th_union_find;
typedef std::pair<theory_var, unsigned> var_pos; typedef std::pair<theory_var, unsigned> var_pos;
@ -108,7 +107,7 @@ namespace smt {
bv_util m_util; bv_util m_util;
arith_util m_autil; arith_util m_autil;
bit_blaster m_bb; bit_blaster m_bb;
th_trail_stack m_trail_stack; trail_stack m_trail_stack;
th_union_find m_find; th_union_find m_find;
vector<literal_vector> m_bits; // per var, the bits of a given variable. vector<literal_vector> m_bits; // per var, the bits of a given variable.
ptr_vector<expr> m_bits_expr; ptr_vector<expr> m_bits_expr;
@ -268,7 +267,7 @@ namespace smt {
char const * get_name() const override { return "bit-vector"; } char const * get_name() const override { return "bit-vector"; }
th_trail_stack & get_trail_stack() { return m_trail_stack; } trail_stack & get_trail_stack() { return m_trail_stack; }
void merge_eh(theory_var, theory_var, theory_var v1, theory_var v2); void merge_eh(theory_var, theory_var, theory_var v1, theory_var v2);
void after_merge_eh(theory_var r1, theory_var r2, theory_var v1, theory_var v2) { SASSERT(check_zero_one_bits(r1)); } void after_merge_eh(theory_var r1, theory_var r2, theory_var v1, theory_var v2) { SASSERT(check_zero_one_bits(r1)); }
void unmerge_eh(theory_var v1, theory_var v2); void unmerge_eh(theory_var v1, theory_var v2);

View file

@ -701,7 +701,7 @@ namespace smt {
m_util(m), m_util(m),
m_autil(m), m_autil(m),
m_find(*this), m_find(*this),
m_trail_stack(*this) { m_trail_stack() {
} }
theory_datatype::~theory_datatype() { theory_datatype::~theory_datatype() {

View file

@ -27,7 +27,6 @@ Revision History:
namespace smt { namespace smt {
class theory_datatype : public theory { class theory_datatype : public theory {
typedef trail_stack<theory_datatype> th_trail_stack;
typedef union_find<theory_datatype> th_union_find; typedef union_find<theory_datatype> th_union_find;
struct var_data { struct var_data {
@ -49,7 +48,7 @@ namespace smt {
array_util m_autil; array_util m_autil;
ptr_vector<var_data> m_var_data; ptr_vector<var_data> m_var_data;
th_union_find m_find; th_union_find m_find;
th_trail_stack m_trail_stack; trail_stack m_trail_stack;
datatype_factory * m_factory; datatype_factory * m_factory;
stats m_stats; stats m_stats;
@ -137,7 +136,7 @@ namespace smt {
void collect_statistics(::statistics & st) const override; void collect_statistics(::statistics & st) const override;
void init_model(model_generator & m) override; void init_model(model_generator & m) override;
model_value_proc * mk_value(enode * n, model_generator & m) override; model_value_proc * mk_value(enode * n, model_generator & m) override;
th_trail_stack & get_trail_stack() { return m_trail_stack; } trail_stack & get_trail_stack() { return m_trail_stack; }
virtual void merge_eh(theory_var v1, theory_var v2, theory_var, theory_var); virtual void merge_eh(theory_var v1, theory_var v2, theory_var, theory_var);
static void after_merge_eh(theory_var r1, theory_var r2, theory_var v1, theory_var v2) {} static void after_merge_eh(theory_var r1, theory_var r2, theory_var v1, theory_var v2) {}
void unmerge_eh(theory_var v1, theory_var v2); void unmerge_eh(theory_var v1, theory_var v2);

View file

@ -30,7 +30,7 @@ namespace smt {
m_th_rw(ctx.get_manager()), m_th_rw(ctx.get_manager()),
m_converter(ctx.get_manager(), m_th_rw), m_converter(ctx.get_manager(), m_th_rw),
m_rw(ctx.get_manager(), m_converter, params_ref()), m_rw(ctx.get_manager(), m_converter, params_ref()),
m_trail_stack(*this), m_trail_stack(),
m_fpa_util(m_converter.fu()), m_fpa_util(m_converter.fu()),
m_bv_util(m_converter.bu()), m_bv_util(m_converter.bu()),
m_arith_util(m_converter.au()), m_arith_util(m_converter.au()),

View file

@ -30,7 +30,6 @@ namespace smt {
class theory_fpa : public theory { class theory_fpa : public theory {
protected: protected:
typedef trail_stack<theory_fpa> th_trail_stack;
class fpa_value_proc : public model_value_proc { class fpa_value_proc : public model_value_proc {
@ -84,7 +83,7 @@ namespace smt {
th_rewriter m_th_rw; th_rewriter m_th_rw;
fpa2bv_converter_wrapped m_converter; fpa2bv_converter_wrapped m_converter;
fpa2bv_rewriter m_rw; fpa2bv_rewriter m_rw;
th_trail_stack m_trail_stack; trail_stack m_trail_stack;
fpa_value_factory * m_factory; fpa_value_factory * m_factory;
fpa_util & m_fpa_util; fpa_util & m_fpa_util;
bv_util & m_bv_util; bv_util & m_bv_util;

View file

@ -275,7 +275,7 @@ theory_seq::theory_seq(context& ctx):
m_eq(m, *this, m_ax.ax()), m_eq(m, *this, m_ax.ax()),
m_regex(*this), m_regex(*this),
m_arith_value(m), m_arith_value(m),
m_trail_stack(*this), m_trail_stack(),
m_ls(m), m_rs(m), m_ls(m), m_rs(m),
m_lhs(m), m_rhs(m), m_lhs(m), m_rhs(m),
m_new_eqs(m), m_new_eqs(m),

View file

@ -49,7 +49,6 @@ namespace smt {
typedef scoped_dependency_manager<assumption> dependency_manager; typedef scoped_dependency_manager<assumption> dependency_manager;
typedef dependency_manager::dependency dependency; typedef dependency_manager::dependency dependency;
typedef trail_stack<theory_seq> th_trail_stack;
struct expr_dep { struct expr_dep {
expr* v; expr* v;
expr* e; expr* e;
@ -365,7 +364,7 @@ namespace smt {
seq::eq_solver m_eq; seq::eq_solver m_eq;
seq_regex m_regex; seq_regex m_regex;
arith_value m_arith_value; arith_value m_arith_value;
th_trail_stack m_trail_stack; trail_stack m_trail_stack;
stats m_stats; stats m_stats;
ptr_vector<expr> m_todo, m_concat; ptr_vector<expr> m_todo, m_concat;
expr_ref_vector m_ls, m_rs, m_lhs, m_rhs; expr_ref_vector m_ls, m_rs, m_lhs, m_rhs;
@ -622,7 +621,7 @@ namespace smt {
// model building // model building
app* mk_value(app* a); app* mk_value(app* a);
th_trail_stack& get_trail_stack() { return m_trail_stack; } trail_stack& get_trail_stack() { return m_trail_stack; }
void merge_eh(theory_var, theory_var, theory_var v1, theory_var v2) {} void merge_eh(theory_var, theory_var, theory_var v1, theory_var v2) {}
void after_merge_eh(theory_var r1, theory_var r2, theory_var v1, theory_var v2) { } void after_merge_eh(theory_var r1, theory_var r2, theory_var v1, theory_var v2) { }
void unmerge_eh(theory_var v1, theory_var v2) {} void unmerge_eh(theory_var v1, theory_var v2) {}

View file

@ -85,8 +85,8 @@ namespace smt {
cacheHitCount(0), cacheHitCount(0),
cacheMissCount(0), cacheMissCount(0),
m_fresh_id(0), m_fresh_id(0),
m_trail_stack(*this), m_trail_stack(),
m_library_aware_trail_stack(*this), m_library_aware_trail_stack(),
m_find(*this), m_find(*this),
fixed_length_subterm_trail(m), fixed_length_subterm_trail(m),
fixed_length_assumptions(m) fixed_length_assumptions(m)

View file

@ -332,7 +332,6 @@ class theory_str : public theory {
} }
}; };
typedef trail_stack<theory_str> th_trail_stack;
typedef union_find<theory_str> th_union_find; typedef union_find<theory_str> th_union_find;
typedef map<rational, expr*, obj_hash<rational>, default_eq<rational> > rational_map; typedef map<rational, expr*, obj_hash<rational>, default_eq<rational> > rational_map;
@ -525,8 +524,8 @@ protected:
// cache mapping each string S to Length(S) // cache mapping each string S to Length(S)
obj_map<expr, app*> length_ast_map; obj_map<expr, app*> length_ast_map;
th_trail_stack m_trail_stack; trail_stack m_trail_stack;
th_trail_stack m_library_aware_trail_stack; trail_stack m_library_aware_trail_stack;
th_union_find m_find; th_union_find m_find;
theory_var get_var(expr * n) const; theory_var get_var(expr * n) const;
expr * get_eqc_next(expr * n); expr * get_eqc_next(expr * n);
@ -792,7 +791,7 @@ public:
bool overlapping_variables_detected() const { return loopDetected; } bool overlapping_variables_detected() const { return loopDetected; }
th_trail_stack& get_trail_stack() { return m_trail_stack; } trail_stack& get_trail_stack() { return m_trail_stack; }
void merge_eh(theory_var, theory_var, theory_var v1, theory_var v2) {} void merge_eh(theory_var, theory_var, theory_var v1, theory_var v2) {}
void after_merge_eh(theory_var r1, theory_var r2, theory_var v1, theory_var v2) { } void after_merge_eh(theory_var r1, theory_var r2, theory_var v1, theory_var v2) { }
void unmerge_eh(theory_var v1, theory_var v2) {} void unmerge_eh(theory_var v1, theory_var v2) {}

View file

@ -409,8 +409,7 @@ public:
}; };
template<typename Ctx> inline void undo_trail_stack(ptr_vector<trail> & s, unsigned old_size) {
void undo_trail_stack(Ctx & ctx, ptr_vector<trail> & s, unsigned old_size) {
SASSERT(old_size <= s.size()); SASSERT(old_size <= s.size());
typename ptr_vector<trail >::iterator begin = s.begin() + old_size; typename ptr_vector<trail >::iterator begin = s.begin() + old_size;
typename ptr_vector<trail >::iterator it = s.end(); typename ptr_vector<trail >::iterator it = s.end();
@ -421,14 +420,12 @@ void undo_trail_stack(Ctx & ctx, ptr_vector<trail> & s, unsigned old_size) {
s.shrink(old_size); s.shrink(old_size);
} }
template<typename Ctx>
class trail_stack { class trail_stack {
Ctx & m_ctx;
ptr_vector<trail> m_trail_stack; ptr_vector<trail> m_trail_stack;
unsigned_vector m_scopes; unsigned_vector m_scopes;
region m_region; region m_region;
public: public:
trail_stack(Ctx & c):m_ctx(c) {} trail_stack() {}
~trail_stack() {} ~trail_stack() {}
@ -437,7 +434,7 @@ public:
void reset() { void reset() {
pop_scope(m_scopes.size()); pop_scope(m_scopes.size());
// Undo trail objects stored at lvl 0 (avoid memory leaks if lvl 0 contains new_obj_trail objects). // Undo trail objects stored at lvl 0 (avoid memory leaks if lvl 0 contains new_obj_trail objects).
undo_trail_stack(m_ctx, m_trail_stack, 0); undo_trail_stack(m_trail_stack, 0);
} }
void push_ptr(trail * t) { m_trail_stack.push_back(t); } void push_ptr(trail * t) { m_trail_stack.push_back(t); }
@ -455,7 +452,7 @@ public:
SASSERT(num_scopes <= lvl); SASSERT(num_scopes <= lvl);
unsigned new_lvl = lvl - num_scopes; unsigned new_lvl = lvl - num_scopes;
unsigned old_size = m_scopes[new_lvl]; unsigned old_size = m_scopes[new_lvl];
undo_trail_stack(m_ctx, m_trail_stack, old_size); undo_trail_stack(m_trail_stack, old_size);
m_scopes.shrink(new_lvl); m_scopes.shrink(new_lvl);
m_region.pop_scope(num_scopes); m_region.pop_scope(num_scopes);
} }

View file

@ -23,8 +23,8 @@ Revision History:
class union_find_default_ctx { class union_find_default_ctx {
public: public:
typedef trail_stack<union_find_default_ctx> _trail_stack; typedef trail_stack _trail_stack;
union_find_default_ctx() : m_stack(*this) {} union_find_default_ctx() : m_stack() {}
void unmerge_eh(unsigned, unsigned) {} void unmerge_eh(unsigned, unsigned) {}
void merge_eh(unsigned, unsigned, unsigned, unsigned) {} void merge_eh(unsigned, unsigned, unsigned, unsigned) {}
@ -39,7 +39,7 @@ private:
template<typename Ctx = union_find_default_ctx, typename StackCtx = Ctx> template<typename Ctx = union_find_default_ctx, typename StackCtx = Ctx>
class union_find { class union_find {
Ctx & m_ctx; Ctx & m_ctx;
trail_stack<StackCtx> & m_trail_stack; trail_stack & m_trail_stack;
svector<unsigned> m_find; svector<unsigned> m_find;
svector<unsigned> m_size; svector<unsigned> m_size;
svector<unsigned> m_next; svector<unsigned> m_next;