mirror of
https://github.com/Z3Prover/z3
synced 2025-04-27 10:55:50 +00:00
Z3 sources
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
3f9edad676
commit
e9eab22e5c
1186 changed files with 381859 additions and 0 deletions
120
lib/use_list.h
Normal file
120
lib/use_list.h
Normal file
|
@ -0,0 +1,120 @@
|
|||
/*++
|
||||
Copyright (c) 2006 Microsoft Corporation
|
||||
|
||||
Module Name:
|
||||
|
||||
use_list.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Use list expression index.
|
||||
|
||||
Author:
|
||||
|
||||
Leonardo de Moura (leonardo) 2008-02-04.
|
||||
|
||||
Revision History:
|
||||
|
||||
--*/
|
||||
#ifndef _USE_LIST_H_
|
||||
#define _USE_LIST_H_
|
||||
|
||||
#include"ast.h"
|
||||
#include"vector.h"
|
||||
|
||||
/**
|
||||
\brief Generic use-list data-structure.
|
||||
*/
|
||||
template<typename T>
|
||||
class use_list {
|
||||
typedef vector<T> set;
|
||||
vector<set> m_use_list;
|
||||
public:
|
||||
typedef typename set::const_iterator iterator;
|
||||
use_list() {}
|
||||
|
||||
void insert(T const & parent, expr * child) {
|
||||
unsigned id = child->get_id();
|
||||
if (id >= m_use_list.size())
|
||||
m_use_list.resize(id+1, set());
|
||||
set & s = m_use_list[id];
|
||||
s.push_back(parent);
|
||||
}
|
||||
|
||||
void erase(T const & parent, expr * child) {
|
||||
unsigned id = child->get_id();
|
||||
if (id >= m_use_list.size())
|
||||
return;
|
||||
set & s = m_use_list[id];
|
||||
s.erase(parent);
|
||||
}
|
||||
|
||||
void reset() {
|
||||
m_use_list.reset();
|
||||
}
|
||||
|
||||
iterator begin(expr * e) const {
|
||||
unsigned id = e->get_id();
|
||||
if (id >= m_use_list.size())
|
||||
return 0;
|
||||
return m_use_list[id].begin();
|
||||
}
|
||||
|
||||
iterator end(expr * e) const {
|
||||
unsigned id = e->get_id();
|
||||
if (id >= m_use_list.size())
|
||||
return 0;
|
||||
return m_use_list[id].end();
|
||||
}
|
||||
|
||||
bool empty(expr * e) const {
|
||||
unsigned id = e->get_id();
|
||||
if (id >= m_use_list.size())
|
||||
return true;
|
||||
return m_use_list[id].empty();
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
\brief Index for tracking the uses of an expression. It is a
|
||||
mapping from expressions to expressions. For example, consider the
|
||||
term (f a (g a)), the constant a is used by f and g applications.
|
||||
|
||||
\remark The expressions inserted in this index should not contain
|
||||
quantifiers.
|
||||
|
||||
\warning This index will not increase the reference counter of the
|
||||
indexed expressions.
|
||||
*/
|
||||
class app_use_list : use_list<app*> {
|
||||
|
||||
bool m_ignore_vars; //!< when true, variables are not indexed
|
||||
unsigned_vector m_ref_counter;
|
||||
ptr_vector<app> m_todo;
|
||||
|
||||
void inc_ref(app * n);
|
||||
void dec_ref(app * n);
|
||||
|
||||
public:
|
||||
/**
|
||||
\brief If ignore_vars = true, then the index will not track
|
||||
the use of variables.
|
||||
*/
|
||||
app_use_list(bool ignore_vars = true):
|
||||
m_ignore_vars(ignore_vars) {
|
||||
}
|
||||
|
||||
/**
|
||||
\brief Update the use list of all direct/indirect children of n.
|
||||
*/
|
||||
void insert(expr * n);
|
||||
|
||||
/**
|
||||
\brief Remove n (and its unreachable direct/indirect children) from the index.
|
||||
*/
|
||||
void erase(expr * n);
|
||||
|
||||
void reset();
|
||||
};
|
||||
|
||||
#endif /* _USE_LIST_H_ */
|
Loading…
Add table
Add a link
Reference in a new issue