mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 17:15:31 +00:00
remove template Context dependency in every trail object
This commit is contained in:
parent
df0a449f70
commit
a152bb1e80
65 changed files with 413 additions and 413 deletions
159
src/util/trail.h
159
src/util/trail.h
|
@ -23,16 +23,16 @@ Revision History:
|
|||
#include "util/obj_ref.h"
|
||||
#include "util/vector.h"
|
||||
|
||||
template<typename Ctx>
|
||||
|
||||
class trail {
|
||||
public:
|
||||
virtual ~trail() {
|
||||
}
|
||||
virtual void undo(Ctx & ctx) = 0;
|
||||
virtual void undo() = 0;
|
||||
};
|
||||
|
||||
template<typename Ctx, typename T>
|
||||
class value_trail : public trail<Ctx> {
|
||||
template<typename T>
|
||||
class value_trail : public trail {
|
||||
T & m_value;
|
||||
T m_old_value;
|
||||
|
||||
|
@ -51,15 +51,15 @@ public:
|
|||
~value_trail() override {
|
||||
}
|
||||
|
||||
void undo(Ctx & ctx) override {
|
||||
void undo() override {
|
||||
m_value = m_old_value;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
template<typename Ctx, typename T, typename Ts>
|
||||
class scoped_value_trail : public trail<Ctx> {
|
||||
template<typename T, typename Ts>
|
||||
class scoped_value_trail : public trail {
|
||||
T & m_value;
|
||||
Ts & m_values;
|
||||
|
||||
|
@ -72,15 +72,14 @@ public:
|
|||
~scoped_value_trail() override {
|
||||
}
|
||||
|
||||
void undo(Ctx & ctx) override {
|
||||
void undo() override {
|
||||
m_value = m_values.back();
|
||||
m_values.pop_back();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template<typename Ctx>
|
||||
class reset_flag_trail : public trail<Ctx> {
|
||||
class reset_flag_trail : public trail {
|
||||
bool & m_value;
|
||||
public:
|
||||
reset_flag_trail(bool & value):
|
||||
|
@ -90,13 +89,13 @@ public:
|
|||
~reset_flag_trail() override {
|
||||
}
|
||||
|
||||
void undo(Ctx & ctx) override {
|
||||
void undo() override {
|
||||
m_value = false;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename Ctx, typename T>
|
||||
class set_ptr_trail : public trail<Ctx> {
|
||||
template<typename T>
|
||||
class set_ptr_trail : public trail {
|
||||
T * & m_ptr;
|
||||
public:
|
||||
set_ptr_trail(T * & ptr):
|
||||
|
@ -104,13 +103,13 @@ public:
|
|||
SASSERT(m_ptr == 0);
|
||||
}
|
||||
|
||||
void undo(Ctx & ctx) override {
|
||||
void undo() override {
|
||||
m_ptr = nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename Ctx, typename T, bool CallDestructors=true>
|
||||
class restore_size_trail : public trail<Ctx> {
|
||||
template<typename T, bool CallDestructors=true>
|
||||
class restore_size_trail : public trail {
|
||||
vector<T, CallDestructors> & m_vector;
|
||||
unsigned m_old_size;
|
||||
public:
|
||||
|
@ -124,13 +123,13 @@ public:
|
|||
}
|
||||
~restore_size_trail() override {
|
||||
}
|
||||
void undo(Ctx & ctx) override {
|
||||
void undo() override {
|
||||
m_vector.shrink(m_old_size);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename Ctx, typename T, bool CallDestructors=true>
|
||||
class vector_value_trail : public trail<Ctx> {
|
||||
template<typename T, bool CallDestructors=true>
|
||||
class vector_value_trail : public trail {
|
||||
vector<T, CallDestructors> & m_vector;
|
||||
unsigned m_idx;
|
||||
T m_old_value;
|
||||
|
@ -144,13 +143,13 @@ public:
|
|||
~vector_value_trail() override {
|
||||
}
|
||||
|
||||
void undo(Ctx & ctx) override {
|
||||
void undo() override {
|
||||
m_vector[m_idx] = m_old_value;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename Ctx, typename V, typename T>
|
||||
class vector2_value_trail : public trail<Ctx> {
|
||||
template<typename V, typename T>
|
||||
class vector2_value_trail : public trail {
|
||||
V & m_vector;
|
||||
unsigned m_i;
|
||||
unsigned m_j;
|
||||
|
@ -166,57 +165,57 @@ public:
|
|||
~vector2_value_trail() override {
|
||||
}
|
||||
|
||||
void undo(Ctx & ctx) override {
|
||||
void undo() override {
|
||||
m_vector[m_i][m_j] = m_old_value;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template<typename Ctx, typename D, typename R>
|
||||
class insert_obj_map : public trail<Ctx> {
|
||||
template<typename D, typename R>
|
||||
class insert_obj_map : public trail {
|
||||
obj_map<D,R>& m_map;
|
||||
D* m_obj;
|
||||
public:
|
||||
insert_obj_map(obj_map<D,R>& t, D* o) : m_map(t), m_obj(o) {}
|
||||
~insert_obj_map() override {}
|
||||
void undo(Ctx & ctx) override { m_map.remove(m_obj); }
|
||||
void undo() override { m_map.remove(m_obj); }
|
||||
};
|
||||
|
||||
template<typename Ctx, typename D, typename R>
|
||||
class remove_obj_map : public trail<Ctx> {
|
||||
template<typename D, typename R>
|
||||
class remove_obj_map : public trail {
|
||||
obj_map<D,R>& m_map;
|
||||
D* m_obj;
|
||||
R m_value;
|
||||
public:
|
||||
remove_obj_map(obj_map<D,R>& t, D* o, R v) : m_map(t), m_obj(o), m_value(v) {}
|
||||
~remove_obj_map() override {}
|
||||
void undo(Ctx & ctx) override { m_map.insert(m_obj, m_value); }
|
||||
void undo() override { m_map.insert(m_obj, m_value); }
|
||||
};
|
||||
|
||||
template<typename Ctx, typename M, typename D>
|
||||
class insert_map : public trail<Ctx> {
|
||||
template<typename M, typename D>
|
||||
class insert_map : public trail {
|
||||
M& m_map;
|
||||
D m_obj;
|
||||
public:
|
||||
insert_map(M& t, D o) : m_map(t), m_obj(o) {}
|
||||
~insert_map() override {}
|
||||
void undo(Ctx & ctx) override { m_map.remove(m_obj); }
|
||||
void undo() override { m_map.remove(m_obj); }
|
||||
};
|
||||
|
||||
|
||||
template<typename Ctx, typename M, typename Mgr, typename D>
|
||||
class insert_ref_map : public trail<Ctx> {
|
||||
template<typename M, typename Mgr, typename D>
|
||||
class insert_ref_map : public trail {
|
||||
Mgr& m;
|
||||
M& m_map;
|
||||
D m_obj;
|
||||
public:
|
||||
insert_ref_map(Mgr& m, M& t, D o) : m(m), m_map(t), m_obj(o) {}
|
||||
virtual ~insert_ref_map() {}
|
||||
virtual void undo(Ctx & ctx) { m_map.remove(m_obj); m.dec_ref(m_obj); }
|
||||
virtual void undo() { m_map.remove(m_obj); m.dec_ref(m_obj); }
|
||||
};
|
||||
|
||||
template<typename Ctx, typename Mgr, typename D, typename R>
|
||||
class insert_ref2_map : public trail<Ctx> {
|
||||
template<typename Mgr, typename D, typename R>
|
||||
class insert_ref2_map : public trail {
|
||||
Mgr& m;
|
||||
obj_map<D,R*>& m_map;
|
||||
D* m_obj;
|
||||
|
@ -224,25 +223,25 @@ class insert_ref2_map : public trail<Ctx> {
|
|||
public:
|
||||
insert_ref2_map(Mgr& m, obj_map<D,R*>& t, D*o, R*r) : m(m), m_map(t), m_obj(o), m_val(r) {}
|
||||
virtual ~insert_ref2_map() {}
|
||||
virtual void undo(Ctx & ctx) { m_map.remove(m_obj); m.dec_ref(m_obj); m.dec_ref(m_val); }
|
||||
virtual void undo() { m_map.remove(m_obj); m.dec_ref(m_obj); m.dec_ref(m_val); }
|
||||
};
|
||||
|
||||
|
||||
template<typename Ctx, typename V>
|
||||
class push_back_vector : public trail<Ctx> {
|
||||
template<typename V>
|
||||
class push_back_vector : public trail {
|
||||
V & m_vector;
|
||||
public:
|
||||
push_back_vector(V & v):
|
||||
m_vector(v) {
|
||||
}
|
||||
|
||||
void undo(Ctx & ctx) override {
|
||||
void undo() override {
|
||||
m_vector.pop_back();
|
||||
}
|
||||
};
|
||||
|
||||
template<typename Ctx, typename T>
|
||||
class set_vector_idx_trail : public trail<Ctx> {
|
||||
template<typename T>
|
||||
class set_vector_idx_trail : public trail {
|
||||
ptr_vector<T> & m_vector;
|
||||
unsigned m_idx;
|
||||
public:
|
||||
|
@ -254,13 +253,13 @@ public:
|
|||
~set_vector_idx_trail() override {
|
||||
}
|
||||
|
||||
void undo(Ctx & ctx) override {
|
||||
void undo() override {
|
||||
m_vector[m_idx] = 0;
|
||||
}
|
||||
};
|
||||
|
||||
template<typename Ctx, typename T, bool CallDestructors=true>
|
||||
class pop_back_trail : public trail<Ctx> {
|
||||
template<typename T, bool CallDestructors=true>
|
||||
class pop_back_trail : public trail {
|
||||
vector<T, CallDestructors> & m_vector;
|
||||
T m_value;
|
||||
public:
|
||||
|
@ -269,13 +268,13 @@ public:
|
|||
m_value(m_vector.back()) {
|
||||
}
|
||||
|
||||
virtual void undo(Ctx & ctx) {
|
||||
virtual void undo() {
|
||||
m_vector.push_back(m_value);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename Ctx, typename T, bool CallDestructors=true>
|
||||
class pop_back2_trail : public trail<Ctx> {
|
||||
template<typename T, bool CallDestructors=true>
|
||||
class pop_back2_trail : public trail {
|
||||
vector<T, CallDestructors> & m_vector;
|
||||
typedef vector<vector<T, CallDestructors>, true> vector_t;
|
||||
unsigned m_index;
|
||||
|
@ -287,28 +286,28 @@ public:
|
|||
m_value(m_vector[index].back()) {
|
||||
}
|
||||
|
||||
virtual void undo(Ctx & ctx) {
|
||||
virtual void undo() {
|
||||
m_vector[m_index].push_back(m_value);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
template<typename Ctx, typename T, bool CallDestructors=true>
|
||||
class push_back_trail : public trail<Ctx> {
|
||||
template<typename T, bool CallDestructors=true>
|
||||
class push_back_trail : public trail {
|
||||
vector<T, CallDestructors> & m_vector;
|
||||
public:
|
||||
push_back_trail(vector<T, CallDestructors> & v):
|
||||
m_vector(v) {
|
||||
}
|
||||
|
||||
void undo(Ctx & ctx) override {
|
||||
void undo() override {
|
||||
m_vector.pop_back();
|
||||
}
|
||||
};
|
||||
|
||||
template<typename Ctx, typename T, bool CallDestructors=true>
|
||||
class push_back2_trail : public trail<Ctx> {
|
||||
template<typename T, bool CallDestructors=true>
|
||||
class push_back2_trail : public trail {
|
||||
typedef vector<vector<T, CallDestructors>, true> vector_t;
|
||||
vector_t & m_vector;
|
||||
unsigned m_index;
|
||||
|
@ -318,13 +317,13 @@ public:
|
|||
m_index(index) {
|
||||
}
|
||||
|
||||
virtual void undo(Ctx & ctx) {
|
||||
virtual void undo() {
|
||||
m_vector[m_index].pop_back();
|
||||
}
|
||||
};
|
||||
|
||||
template<typename Ctx>
|
||||
class set_bitvector_trail : public trail<Ctx> {
|
||||
|
||||
class set_bitvector_trail : public trail {
|
||||
bool_vector & m_vector;
|
||||
unsigned m_idx;
|
||||
public:
|
||||
|
@ -335,14 +334,14 @@ public:
|
|||
m_vector[m_idx] = true;
|
||||
}
|
||||
|
||||
void undo(Ctx & ctx) override {
|
||||
void undo() override {
|
||||
m_vector[m_idx] = false;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template<typename Ctx, typename T, bool CallDestructors = true>
|
||||
class history_trail : public trail<Ctx> {
|
||||
template<typename T, bool CallDestructors = true>
|
||||
class history_trail : public trail {
|
||||
vector<T, CallDestructors>& m_dst;
|
||||
unsigned m_idx;
|
||||
vector<T, CallDestructors>& m_hist;
|
||||
|
@ -355,69 +354,69 @@ public:
|
|||
~history_trail() override {
|
||||
}
|
||||
|
||||
void undo(Ctx& ctx) override {
|
||||
void undo() override {
|
||||
m_dst[m_idx] = m_hist.back();
|
||||
m_hist.pop_back();
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template<typename Ctx, typename T>
|
||||
class new_obj_trail : public trail<Ctx> {
|
||||
template<typename T>
|
||||
class new_obj_trail : public trail {
|
||||
T * m_obj;
|
||||
public:
|
||||
new_obj_trail(T * obj):
|
||||
m_obj(obj) {
|
||||
}
|
||||
|
||||
void undo(Ctx & ctx) override {
|
||||
void undo() override {
|
||||
dealloc(m_obj);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename Ctx, typename M, typename T>
|
||||
class obj_ref_trail : public trail<Ctx> {
|
||||
template<typename M, typename T>
|
||||
class obj_ref_trail : public trail {
|
||||
obj_ref<T,M> m_obj;
|
||||
public:
|
||||
obj_ref_trail(obj_ref<T,M>& obj):
|
||||
m_obj(obj) {
|
||||
}
|
||||
|
||||
virtual void undo(Ctx & ctx) {
|
||||
virtual void undo() {
|
||||
m_obj.reset();
|
||||
}
|
||||
};
|
||||
|
||||
template<typename Ctx, typename T>
|
||||
class insert_obj_trail : public trail<Ctx> {
|
||||
template<typename T>
|
||||
class insert_obj_trail : public trail {
|
||||
obj_hashtable<T>& m_table;
|
||||
T* m_obj;
|
||||
public:
|
||||
insert_obj_trail(obj_hashtable<T>& t, T* o) : m_table(t), m_obj(o) {}
|
||||
~insert_obj_trail() override {}
|
||||
void undo(Ctx & ctx) override { m_table.remove(m_obj); }
|
||||
void undo() override { m_table.remove(m_obj); }
|
||||
};
|
||||
|
||||
|
||||
template<typename Ctx, typename T>
|
||||
class remove_obj_trail : public trail<Ctx> {
|
||||
template<typename T>
|
||||
class remove_obj_trail : public trail {
|
||||
obj_hashtable<T>& m_table;
|
||||
T* m_obj;
|
||||
public:
|
||||
remove_obj_trail(obj_hashtable<T>& t, T* o) : m_table(t), m_obj(o) {}
|
||||
virtual ~remove_obj_trail() {}
|
||||
virtual void undo(Ctx & ctx) { m_table.insert(m_obj); }
|
||||
virtual void undo() { m_table.insert(m_obj); }
|
||||
};
|
||||
|
||||
|
||||
template<typename Ctx>
|
||||
void undo_trail_stack(Ctx & ctx, ptr_vector<trail<Ctx> > & s, unsigned old_size) {
|
||||
void undo_trail_stack(Ctx & ctx, ptr_vector<trail> & s, unsigned old_size) {
|
||||
SASSERT(old_size <= s.size());
|
||||
typename ptr_vector<trail<Ctx> >::iterator begin = s.begin() + old_size;
|
||||
typename ptr_vector<trail<Ctx> >::iterator it = s.end();
|
||||
typename ptr_vector<trail >::iterator begin = s.begin() + old_size;
|
||||
typename ptr_vector<trail >::iterator it = s.end();
|
||||
while (it != begin) {
|
||||
--it;
|
||||
(*it)->undo(ctx);
|
||||
(*it)->undo();
|
||||
}
|
||||
s.shrink(old_size);
|
||||
}
|
||||
|
@ -425,7 +424,7 @@ void undo_trail_stack(Ctx & ctx, ptr_vector<trail<Ctx> > & s, unsigned old_size)
|
|||
template<typename Ctx>
|
||||
class trail_stack {
|
||||
Ctx & m_ctx;
|
||||
ptr_vector<trail<Ctx> > m_trail_stack;
|
||||
ptr_vector<trail> m_trail_stack;
|
||||
unsigned_vector m_scopes;
|
||||
region m_region;
|
||||
public:
|
||||
|
@ -441,7 +440,7 @@ public:
|
|||
undo_trail_stack(m_ctx, m_trail_stack, 0);
|
||||
}
|
||||
|
||||
void push_ptr(trail<Ctx> * t) { m_trail_stack.push_back(t); }
|
||||
void push_ptr(trail * t) { m_trail_stack.push_back(t); }
|
||||
|
||||
template<typename TrailObject>
|
||||
void push(TrailObject const & obj) { m_trail_stack.push_back(new (m_region) TrailObject(obj)); }
|
||||
|
|
|
@ -47,12 +47,12 @@ class union_find {
|
|||
class mk_var_trail;
|
||||
friend class mk_var_trail;
|
||||
|
||||
class mk_var_trail : public trail<StackCtx> {
|
||||
class mk_var_trail : public trail {
|
||||
union_find & m_owner;
|
||||
public:
|
||||
mk_var_trail(union_find & o):m_owner(o) {}
|
||||
~mk_var_trail() override {}
|
||||
void undo(StackCtx& ctx) override {
|
||||
void undo() override {
|
||||
m_owner.m_find.pop_back();
|
||||
m_owner.m_size.pop_back();
|
||||
m_owner.m_next.pop_back();
|
||||
|
@ -64,13 +64,13 @@ class union_find {
|
|||
class merge_trail;
|
||||
friend class merge_trail;
|
||||
|
||||
class merge_trail : public trail<StackCtx> {
|
||||
class merge_trail : public trail {
|
||||
union_find & m_owner;
|
||||
unsigned m_r1;
|
||||
public:
|
||||
merge_trail(union_find & o, unsigned r1):m_owner(o), m_r1(r1) {}
|
||||
~merge_trail() override {}
|
||||
void undo(StackCtx& ctx) override { m_owner.unmerge(m_r1); }
|
||||
void undo() override { m_owner.unmerge(m_r1); }
|
||||
};
|
||||
|
||||
void unmerge(unsigned r1) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue