summaryrefslogtreecommitdiff
path: root/src/expr/node_value.cpp
blob: 7af2cd2b5e1e5be4f19e7397a9287472223a5ec5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*********************                                           -*- C++ -*-  */
/** node_value.cpp
 ** This file is part of the CVC4 prototype.
 ** Copyright (c) 2009 The Analysis of Computer Systems Group (ACSys)
 ** Courant Institute of Mathematical Sciences
 ** New York University
 ** See the file COPYING in the top-level source directory for licensing
 ** information.
 **
 ** An expression node.
 **
 ** Instances of this class are generally referenced through
 ** cvc4::Node rather than by pointer; cvc4::Node maintains the
 ** reference count on NodeValue instances and
 **/

#include "node_value.h"
#include <sstream>

using namespace std;

namespace CVC4 {

size_t NodeValue::next_id = 1;

NodeValue::NodeValue() :
  d_id(0), d_rc(MAX_RC), d_kind(NULL_EXPR), d_nchildren(0) {
}

NodeValue::NodeValue(int) :
  d_id(0), d_rc(0), d_kind(unsigned(UNDEFINED_KIND)), d_nchildren(0) {
}

NodeValue::~NodeValue() {
  for(ev_iterator i = ev_begin(); i != ev_end(); ++i) {
    (*i)->dec();
  }
}

uint64_t NodeValue::hash() const {
  return computeHash(d_kind, ev_begin(), ev_end());
}

NodeValue* NodeValue::inc() {
  // FIXME multithreading
  if(d_rc < MAX_RC)
    ++d_rc;
  return this;
}

NodeValue* NodeValue::dec() {
  // FIXME multithreading
  if(d_rc < MAX_RC) {
    if(--d_rc == 0) {
      // FIXME gc
      return 0;
    }
  }
  return this;
}

NodeValue::iterator NodeValue::begin() {
  return node_iterator(d_children);
}

NodeValue::iterator NodeValue::end() {
  return node_iterator(d_children + d_nchildren);
}

NodeValue::iterator NodeValue::rbegin() {
  return node_iterator(d_children + d_nchildren - 1);
}

NodeValue::iterator NodeValue::rend() {
  return node_iterator(d_children - 1);
}

NodeValue::const_iterator NodeValue::begin() const {
  return const_node_iterator(d_children);
}

NodeValue::const_iterator NodeValue::end() const {
  return const_node_iterator(d_children + d_nchildren);
}

NodeValue::const_iterator NodeValue::rbegin() const {
  return const_node_iterator(d_children + d_nchildren - 1);
}

NodeValue::const_iterator NodeValue::rend() const {
  return const_node_iterator(d_children - 1);
}

NodeValue::ev_iterator NodeValue::ev_begin() {
  return d_children;
}

NodeValue::ev_iterator NodeValue::ev_end() {
  return d_children + d_nchildren;
}

NodeValue::ev_iterator NodeValue::ev_rbegin() {
  return d_children + d_nchildren - 1;
}

NodeValue::ev_iterator NodeValue::ev_rend() {
  return d_children - 1;
}

NodeValue::const_ev_iterator NodeValue::ev_begin() const {
  return d_children;
}

NodeValue::const_ev_iterator NodeValue::ev_end() const {
  return d_children + d_nchildren;
}

NodeValue::const_ev_iterator NodeValue::ev_rbegin() const {
  return d_children + d_nchildren - 1;
}

NodeValue::const_ev_iterator NodeValue::ev_rend() const {
  return d_children - 1;
}

string NodeValue::toString() const {
  stringstream ss;
  toStream(ss);
  return ss.str();
}

void NodeValue::toStream(std::ostream& out) const {
  out << "(" << Kind(d_kind);
  if(d_kind == VARIABLE) {
    out << ":" << this;
  } else {
    for(const_iterator i = begin(); i != end(); ++i) {
      if(i != end()) {
        out << " ";
      }
      out << *i;
    }
  }
  out << ")";
}

}/* CVC4 namespace */
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback