bool-expr.hpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 namespace Gecode {
00039
00040
00041
00042
00043
00044 forceinline
00045 BoolExpr::Node::Node(void) : use(1) {}
00046
00047 forceinline void*
00048 BoolExpr::Node::operator new(size_t size) {
00049 return heap.ralloc(size);
00050 }
00051 forceinline void
00052 BoolExpr::Node::operator delete(void* p, size_t) {
00053 heap.rfree(p);
00054 }
00055
00056 forceinline
00057 BoolExpr::BoolExpr(const BoolExpr& e) : n(e.n) {
00058 n->use++;
00059 }
00060
00061 forceinline
00062 BoolExpr::BoolExpr(const BoolVar& x) : n(new Node) {
00063 n->same = 1;
00064 n->t = NT_VAR;
00065 n->l = NULL;
00066 n->r = NULL;
00067 n->x = x;
00068 }
00069
00070 forceinline
00071 BoolExpr::BoolExpr(const BoolExpr& l, NodeType t, const BoolExpr& r)
00072 : n(new Node) {
00073 unsigned int ls = ((l.n->t == t) || (l.n->t == NT_VAR)) ? l.n->same : 1;
00074 unsigned int rs = ((r.n->t == t) || (r.n->t == NT_VAR)) ? r.n->same : 1;
00075 n->same = ls+rs;
00076 n->t = t;
00077 n->l = l.n;
00078 n->l->use++;
00079 n->r = r.n;
00080 n->r->use++;
00081 }
00082
00083 forceinline
00084 BoolExpr::BoolExpr(const BoolExpr& l, NodeType t) {
00085 (void) t;
00086 assert(t == NT_NOT);
00087 if (l.n->t == NT_NOT) {
00088 n = l.n->l;
00089 n->use++;
00090 } else {
00091 n = new Node;
00092 n->same = 1;
00093 n->t = NT_NOT;
00094 n->l = l.n;
00095 n->l->use++;
00096 n->r = NULL;
00097 }
00098 }
00099
00100 forceinline
00101 BoolExpr::BoolExpr(const LinRel& rl)
00102 : n(new Node) {
00103 n->same = 1;
00104 n->t = NT_RLIN;
00105 n->l = NULL;
00106 n->r = NULL;
00107 n->rl = rl;
00108 }
00109
00110 forceinline BoolVar
00111 BoolExpr::post(Home home, IntConLevel icl) const {
00112 Region r(home);
00113 return NNF::nnf(r,n,false)->post(home,icl);
00114 }
00115
00116 forceinline void
00117 BoolExpr::post(Home home, bool t, IntConLevel icl) const {
00118 Region r(home);
00119 return NNF::nnf(r,n,false)->post(home,t,icl);
00120 }
00121
00122 }
00123
00124