3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-08 02:15:19 +00:00
z3/lib/watch_list.h
Leonardo de Moura e9eab22e5c Z3 sources
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
2012-10-02 11:35:25 -07:00

187 lines
5.2 KiB
C++

/*++
Copyright (c) 2006 Microsoft Corporation
Module Name:
watch_list.h
Abstract:
<abstract>
Author:
Leonardo de Moura (leonardo) 2008-05-23.
Revision History:
--*/
#ifndef _WATCH_LIST_H_
#define _WATCH_LIST_H_
#include"smt_clause.h"
#include"memory_manager.h"
namespace smt {
/**
\brief List of clauses and literals watching a given literal.
-------------------------------------------------------------------------------------------
| end_nbegin | begin_lits | end | regular clauses | -> <- | literals |
-------------------------------------------------------------------------------------------
^ ^ ^ ^
| | | |
m_data end_cls begin_lits end_lits
When this class is used to implement unit propagation, a literal l1 in m_watch_list[l2]
represents the binary clause (or l1 (not l2))
*/
class watch_list {
char * m_data;
void expand();
unsigned & end_cls_core() {
SASSERT(m_data);
return reinterpret_cast<unsigned *>(m_data)[-3];
}
unsigned end_cls() {
return m_data ? end_cls_core() : 0;
}
unsigned & begin_lits_core() {
SASSERT(m_data);
return reinterpret_cast<unsigned *>(m_data)[-2];
}
unsigned begin_lits_core() const {
SASSERT(m_data);
return reinterpret_cast<unsigned *>(m_data)[-2];
}
unsigned begin_lits() const {
return m_data ? begin_lits_core() : 0;
}
unsigned & end_lits_core() {
SASSERT(m_data);
return reinterpret_cast<unsigned *>(m_data)[-1];
}
unsigned end_lits_core() const {
SASSERT(m_data);
return reinterpret_cast<unsigned *>(m_data)[-1];
}
unsigned end_lits() const {
return m_data ? end_lits_core() : 0;
}
void destroy();
public:
watch_list():
m_data(0) {
}
~watch_list() {
destroy();
}
unsigned size() const {
if (m_data) {
return
reinterpret_cast<unsigned *>(m_data)[-3] +
reinterpret_cast<unsigned *>(m_data)[-1] -
reinterpret_cast<unsigned *>(m_data)[-2];
}
return 0;
}
typedef clause ** clause_iterator;
void reset() {
if (m_data) {
end_cls_core() = 0;
begin_lits_core() = end_lits_core();
}
}
void reset_and_release_memory() {
destroy();
m_data = 0;
}
clause_iterator begin_clause() {
return reinterpret_cast<clause **>(m_data);
}
clause_iterator end_clause() {
return reinterpret_cast<clause **>(m_data + end_cls());
}
clause_iterator find_clause(clause const * c) {
return std::find(begin_clause(), end_clause(), c);
}
literal * begin_literals() {
return reinterpret_cast<literal *>(m_data + begin_lits());
}
literal * end_literals() {
return reinterpret_cast<literal *>(m_data + end_lits());
}
literal const * begin_literals() const {
return reinterpret_cast<literal const *>(m_data + begin_lits());
}
literal const * end_literals() const {
return reinterpret_cast<literal const *>(m_data + end_lits());
}
literal * find_literal(literal const & l) {
return std::find(begin_literals(), end_literals(), l);
}
literal const * find_literal(literal const & l) const {
return std::find(begin_literals(), end_literals(), l);
}
void insert_clause(clause * c) {
if (m_data == 0 || end_cls_core() + sizeof(clause *) >= begin_lits_core()) {
expand();
}
*(reinterpret_cast<clause **>(m_data + end_cls_core())) = c;
end_cls_core() += sizeof(clause *);
}
void insert_literal(literal const & l) {
if (m_data == 0 || begin_lits_core() <= end_cls_core() + sizeof(literal)) {
expand();
}
SASSERT(begin_lits_core() >= sizeof(literal));
begin_lits_core() -= sizeof(literal);
*(reinterpret_cast<literal *>(m_data + begin_lits_core())) = l;
}
void remove_clause(clause * c);
void remove_literal(literal l);
void set_end_clause(clause_iterator new_end) {
SASSERT(new_end <= end_clause());
if (m_data) {
end_cls_core() = static_cast<unsigned>(reinterpret_cast<char *>(new_end) - m_data);
}
}
};
};
#endif /* _WATCH_LIST_H_ */