1 /********************* */
3 ** Original author: dejan
4 ** Major contributors: cconway, mdeters
5 ** Minor contributors (to current version): none
6 ** This file is part of the CVC4 prototype.
7 ** Copyright (c) 2009, 2010 The Analysis of Computer Systems Group (ACSys)
8 ** Courant Institute of Mathematical Sciences
10 ** See the file COPYING in the top-level source directory for licensing
13 ** [[ Add file-specific comments here ]]
19 * Created on: Dec 10, 2009
23 #include "expr/node.h"
24 #include "expr/expr.h"
25 #include "expr/type.h"
26 #include "expr/node_manager.h"
27 #include "expr/expr_manager.h"
33 ExprManager::ExprManager() :
34 d_nodeManager(new NodeManager()) {
37 ExprManager::~ExprManager() {
41 const BooleanType
* ExprManager::booleanType() {
42 NodeManagerScope
nms(d_nodeManager
);
43 return BooleanType::getInstance();
46 const KindType
* ExprManager::kindType() {
47 NodeManagerScope
nms(d_nodeManager
);
48 return KindType::getInstance();
51 Expr
ExprManager::mkExpr(Kind kind
) {
52 NodeManagerScope
nms(d_nodeManager
);
53 return Expr(this, new Node(d_nodeManager
->mkNode(kind
)));
56 Expr
ExprManager::mkExpr(Kind kind
, const Expr
& child1
) {
57 NodeManagerScope
nms(d_nodeManager
);
58 return Expr(this, new Node(d_nodeManager
->mkNode(kind
, child1
.getNode())));
61 Expr
ExprManager::mkExpr(Kind kind
, const Expr
& child1
, const Expr
& child2
) {
62 NodeManagerScope
nms(d_nodeManager
);
63 return Expr(this, new Node(d_nodeManager
->mkNode(kind
, child1
.getNode(),
67 Expr
ExprManager::mkExpr(Kind kind
, const Expr
& child1
, const Expr
& child2
,
69 NodeManagerScope
nms(d_nodeManager
);
70 return Expr(this, new Node(d_nodeManager
->mkNode(kind
, child1
.getNode(),
71 child2
.getNode(), child3
.getNode())));
74 Expr
ExprManager::mkExpr(Kind kind
, const Expr
& child1
, const Expr
& child2
,
75 const Expr
& child3
, const Expr
& child4
) {
76 NodeManagerScope
nms(d_nodeManager
);
77 return Expr(this, new Node(d_nodeManager
->mkNode(kind
, child1
.getNode(),
78 child2
.getNode(), child3
.getNode(),
82 Expr
ExprManager::mkExpr(Kind kind
, const Expr
& child1
, const Expr
& child2
,
83 const Expr
& child3
, const Expr
& child4
,
85 NodeManagerScope
nms(d_nodeManager
);
86 return Expr(this, new Node(d_nodeManager
->mkNode(kind
, child1
.getNode(),
87 child2
.getNode(), child3
.getNode(),
91 Expr
ExprManager::mkExpr(Kind kind
, const vector
<Expr
>& children
) {
92 NodeManagerScope
nms(d_nodeManager
);
95 vector
<Expr
>::const_iterator it
= children
.begin();
96 vector
<Expr
>::const_iterator it_end
= children
.end();
98 nodes
.push_back(it
->getNode());
101 return Expr(this, new Node(d_nodeManager
->mkNode(kind
, nodes
)));
104 /** Make a function type from domain to range. */
106 ExprManager::mkFunctionType(const Type
* domain
,
108 NodeManagerScope
nms(d_nodeManager
);
109 return FunctionType::getInstance(this, domain
, range
);
112 /** Make a function type with input types from argTypes. */
114 ExprManager::mkFunctionType(const std::vector
<const Type
*>& argTypes
,
116 NodeManagerScope
nms(d_nodeManager
);
117 return FunctionType::getInstance(this, argTypes
, range
);
120 const Type
* ExprManager::mkSort(std::string name
) {
121 // FIXME: Sorts should be unique per-ExprManager
122 NodeManagerScope
nms(d_nodeManager
);
123 return new SortType(this, name
);
126 Expr
ExprManager::mkVar(const Type
* type
, string name
) {
127 NodeManagerScope
nms(d_nodeManager
);
128 return Expr(this, new Node(d_nodeManager
->mkVar(type
, name
)));
131 Expr
ExprManager::mkVar(const Type
* type
) {
132 NodeManagerScope
nms(d_nodeManager
);
133 return Expr(this, new Node(d_nodeManager
->mkVar(type
)));
136 NodeManager
* ExprManager::getNodeManager() const {
137 return d_nodeManager
;
140 } // End namespace CVC4