diff options
author | Dejan Jovanović <dejan.jovanovic@gmail.com> | 2009-12-11 04:00:14 +0000 |
---|---|---|
committer | Dejan Jovanović <dejan.jovanovic@gmail.com> | 2009-12-11 04:00:14 +0000 |
commit | d26cd7a159bb56f492e21b7536f68abf821ca02a (patch) | |
tree | 3f601cae6490a8bfb4dc7dcdcc5c9b4dd1a75711 /src/expr/expr.cpp | |
parent | 82faddb718aaae5f52001e09d0754a3d254e2285 (diff) |
Extracted the public Expr and ExprManager interface to encapsulate the optimized expressions and the internal expression manager.
Diffstat (limited to 'src/expr/expr.cpp')
-rw-r--r-- | src/expr/expr.cpp | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/src/expr/expr.cpp b/src/expr/expr.cpp new file mode 100644 index 000000000..af685aced --- /dev/null +++ b/src/expr/expr.cpp @@ -0,0 +1,154 @@ +/* + * expr.cpp + * + * Created on: Dec 10, 2009 + * Author: dejan + */ + +#include "expr/expr.h" +#include "expr/node.h" +#include "util/Assert.h" + +namespace CVC4 { + +std::ostream& operator<<(std::ostream& out, const Expr& e) { + e.toStream(out); + return out; +} + +Expr::Expr() : + d_node(new Node()), d_em(NULL) { +} + +Expr::Expr(ExprManager* em, Node* node) : + d_node(node), d_em(em) { +} + +Expr::Expr(const Expr& e) : + d_node(new Node(*e.d_node)), d_em(e.d_em) { +} + +ExprManager* Expr::getExprManager() const { + return d_em; +} + +Expr::~Expr() { + delete d_node; +} + +Expr& Expr::operator=(const Expr& e) { + if(this != &e) { + delete d_node; + d_node = new Node(*e.d_node); + d_em = e.d_em; + } + return *this; +} + +bool Expr::operator==(const Expr& e) const { + if(d_em != e.d_em) + return false;Assert(d_node != NULL, "Unexpected NULL expression pointer!");Assert(e.d_node != NULL, "Unexpected NULL expression pointer!"); + return *d_node == *e.d_node; +} + +bool Expr::operator!=(const Expr& e) const { + return !(*this == e); +} + +bool Expr::operator<(const Expr& e) const { + Assert(d_node != NULL, "Unexpected NULL expression pointer!");Assert(e.d_node != NULL, "Unexpected NULL expression pointer!"); + if(d_em != e.d_em) + return false; + return *d_node < *e.d_node; +} + +uint64_t Expr::hash() const { + Assert(d_node != NULL, "Unexpected NULL expression pointer!"); + return (d_node->isNull()); +} + +Kind Expr::getKind() const { + Assert(d_node != NULL, "Unexpected NULL expression pointer!"); + return d_node->getKind(); +} + +size_t Expr::numChildren() const { + Assert(d_node != NULL, "Unexpected NULL expression pointer!"); + return d_node->numChildren(); +} + +std::string Expr::toString() const { + Assert(d_node != NULL, "Unexpected NULL expression pointer!"); + return d_node->toString(); +} + +bool Expr::isNull() const { + Assert(d_node != NULL, "Unexpected NULL expression pointer!"); + return d_node->isNull(); +} + +void Expr::toStream(std::ostream& out) const { + d_node->toStream(out); +} + +Node Expr::getNode() const { + return *d_node; +} + +BoolExpr::BoolExpr() { +} + +BoolExpr::BoolExpr(const Expr& e) : + Expr(e) { +} + +BoolExpr BoolExpr::notExpr() const { + Assert(d_em != NULL, "Don't have an expression manager for this expression!"); + return d_em->mkExpr(NOT, *this); +} + +BoolExpr BoolExpr::andExpr(const BoolExpr& e) const { + Assert(d_em != NULL, "Don't have an expression manager for this expression!"); + Assert(d_em == e.d_em, "Different expression managers!"); + return d_em->mkExpr(AND, *this, e); +} + +BoolExpr BoolExpr::orExpr(const BoolExpr& e) const { + Assert(d_em != NULL, "Don't have an expression manager for this expression!"); + Assert(d_em == e.d_em, "Different expression managers!"); + return d_em->mkExpr(OR, *this, e); +} + +BoolExpr BoolExpr::xorExpr(const BoolExpr& e) const { + Assert(d_em != NULL, "Don't have an expression manager for this expression!"); + Assert(d_em == e.d_em, "Different expression managers!"); + return d_em->mkExpr(XOR, *this, e); +} + +BoolExpr BoolExpr::iffExpr(const BoolExpr& e) const { + Assert(d_em != NULL, "Don't have an expression manager for this expression!"); + Assert(d_em == e.d_em, "Different expression managers!"); + return d_em->mkExpr(IFF, *this, e); +} + +BoolExpr BoolExpr::impExpr(const BoolExpr& e) const { + Assert(d_em != NULL, "Don't have an expression manager for this expression!"); + Assert(d_em == e.d_em, "Different expression managers!"); + return d_em->mkExpr(IMPLIES, *this, e); +} + +BoolExpr BoolExpr::iteExpr(const BoolExpr& then_e, const BoolExpr& else_e) const { + Assert(d_em != NULL, "Don't have an expression manager for this expression!"); + Assert(d_em == then_e.d_em, "Different expression managers!"); + Assert(d_em == else_e.d_em, "Different expression managers!"); + return d_em->mkExpr(ITE, *this, then_e, else_e); +} + +Expr BoolExpr::iteExpr(const Expr& then_e, const Expr& else_e) const { + Assert(d_em != NULL, "Don't have an expression manager for this expression!"); + Assert(d_em == then_e.getExprManager(), "Different expression managers!"); + Assert(d_em == else_e.getExprManager(), "Different expression managers!"); + return d_em->mkExpr(ITE, *this, then_e, else_e); +} + +} // End namespace CVC4 |