MADARA  3.4.1
ExpressionTree.cpp
Go to the documentation of this file.
1 /* -*- C++ -*- */
2 #ifndef _EXPRESSION_TREE_CPP_
3 #define _EXPRESSION_TREE_CPP_
4 
5 #ifndef _MADARA_NO_KARL_
6 
7 #include <stdlib.h>
8 #include <algorithm>
9 #include <sstream>
10 #include <string>
11 #include <map>
12 #include <stdexcept>
13 
20 
21 namespace madara
22 {
23 namespace expression
24 {
40 enum
41 {
42  EQUALITY_CHAR = 0 - 1,
43  INEQUALITY_CHAR = 0 - 2,
46 };
47 
49 {
50 public:
53 
57  ExpressionTree& tree, const std::string& traversal_order, bool end_iter);
58 
59 private:
63  ExpressionTree& tree, bool end_iter);
64 
68  ExpressionTree& tree, bool end_iter);
69 
73  ExpressionTree& tree, bool end_iter);
74 
78  ExpressionTree& tree, bool end_iter);
79 
82  ExpressionTree& tree, bool end_iter);
83  typedef ::std::map<std::string, TRAVERSAL_PTMF> TRAVERSAL_MAP;
84 
86 };
87 }
88 }
89 
92 {
93  traversal_map_["in-order"] =
95  traversal_map_["pre-order"] =
97  traversal_map_["post-order"] =
99  traversal_map_["level-order"] =
101 }
102 
105  madara::expression::ExpressionTree& tree, bool end_iter)
106 {
107  return new LevelOrderExpressionTreeIteratorImpl(tree, end_iter);
108 }
109 
112  madara::expression::ExpressionTree& tree, bool end_iter)
113 {
114  return new InOrderIteratorImpl(tree, end_iter);
115 }
116 
119  madara::expression::ExpressionTree& tree, bool end_iter)
120 {
121  return new PreOrderIteratorImpl(tree, end_iter);
122 }
123 
126  ExpressionTree& tree, bool end_iter)
127 {
128  return new PostOrderIteratorImpl(tree, end_iter);
129 }
130 
134  const std::string& traversal_order, bool end_iter)
135 {
136  TRAVERSAL_MAP::iterator iter = traversal_map_.find(traversal_order);
137  if (iter == traversal_map_.end())
138  {
139  return 0;
140  }
141  else
142  {
144  return (this->*ptmf)(tree, end_iter);
145  }
146 }
147 
148 // Define a single instance of a factory that's local to this class.
150 
151 // Default ctor
152 
154  : logger_(&logger), root_(0)
155 {
156 }
157 
158 // Ctor take an underlying NODE*.
159 
161  madara::expression::ComponentNode* root, bool increase_count)
162  : logger_(&logger), root_(root, increase_count)
163 {
164 }
165 
166 // Copy ctor
167 
170  : logger_(&logger), root_(t.root_)
171 {
172 }
173 
174 // Copy ctor
175 
178  : logger_(t.logger_), root_(t.root_)
179 {
180 }
181 
182 // Assignment operator
183 
186 {
187  // Refcounter class takes care of the internal decrements and
188  // increments.
189  if (this != &t)
190  {
191  logger_ = t.logger_;
192  root_ = t.root_;
193  }
194 }
195 
196 // Dtor
197 
199 {
200  // taken care of by Refcounter class
201 }
202 
203 // Check if the tree is empty.
204 
206 {
207  return root_.get_ptr() == 0;
208 }
209 
214  void)
215 {
216  bool root_can_change = false;
218 
219  if (this->root_.get_ptr())
220  {
221  root_value = this->root_->prune(root_can_change);
222  if (!root_can_change && dynamic_cast<LeafNode*>(this->root_.get_ptr()) == 0)
223  {
224  root_ = new LeafNode(*(this->logger_), root_value);
225  }
226  }
227 
228  return root_value;
229 }
230 
235 {
236  if (root_.get_ptr() != 0)
237  return root_->evaluate(settings);
238  else
240 }
241 
242 // return root pointer
244  void)
245 {
246  return root_.get_ptr();
247 }
248 
249 // Return the stored item.
250 
252  void) const
253 {
254  return root_->item();
255 }
256 
257 // Return the left branch.
258 
260  void)
261 {
262  return ExpressionTree(*logger_, root_->left(), true);
263 }
264 
265 // Return the left branch.
266 
268  void)
269 {
270  return ExpressionTree(*logger_, root_->right(), true);
271 }
272 
273 // Return a begin iterator of a specified type.
274 
277 {
279  tree_iterator_factory.make_tree_iterator(*this, traversal_order, false));
280 }
281 
282 // Return an end iterator of a specified type.
283 
286 {
288  tree_iterator_factory.make_tree_iterator(*this, traversal_order, true));
289 }
290 
291 // Return a begin iterator of a specified type.
292 
295  const std::string& traversal_order) const
296 {
297  ExpressionTree* non_const_this = const_cast<ExpressionTree*>(this);
300  *non_const_this, traversal_order, false));
301 }
302 
303 // Return an end iterator of a specified type.
304 
307  const std::string& traversal_order) const
308 {
309  ExpressionTree* non_const_this = const_cast<ExpressionTree*>(this);
312  *non_const_this, traversal_order, true));
313 }
314 
316 
318 {
319  root_->accept(visitor);
320 }
321 
322 #endif // _MADARA_NO_KARL_
323 
324 #endif /* _EXPRESSION_TREE_CPP_ */
static madara::expression::ExpressionTreeIteratorFactory tree_iterator_factory
madara::knowledge::KnowledgeRecord KnowledgeRecord
An abstract base class defines a simple abstract implementation of an expression tree node.
Definition: ComponentNode.h:37
Constant iterator over an expression tree.
Definition: Iterator.h:77
Implementation of a factory pattern that dynamically allocates the appropriate ExpressionTreeIterator...
ExpressionTreeIteratorImpl * make_in_order_tree_iterator(ExpressionTree &tree, bool end_iter)
Dynamically allocate a new ExpressionTreeLevelOrderIteratorImpl object based on the designated end_it...
::std::map< std::string, TRAVERSAL_PTMF > TRAVERSAL_MAP
ExpressionTreeIteratorImpl * make_level_order_tree_iterator(ExpressionTree &tree, bool end_iter)
Dynamically allocate a new ExpressionTreeLevelOrderIteratorImpl object based on the designated end_it...
ExpressionTreeIteratorImpl *(ExpressionTreeIteratorFactory::* TRAVERSAL_PTMF)(ExpressionTree &tree, bool end_iter)
ExpressionTreeIteratorImpl * make_pre_order_tree_iterator(ExpressionTree &tree, bool end_iter)
Dynamically allocate a new ExpressionTreePreOrderIteratorImpl object based on the designated end_iter...
ExpressionTreeIteratorImpl * make_tree_iterator(ExpressionTree &tree, const std::string &traversal_order, bool end_iter)
Dynamically allocate a new ExpressionTreeIteratorImpl object based on the designated traversal_order ...
ExpressionTreeIteratorImpl * make_post_order_tree_iterator(ExpressionTree &tree, bool end_iter)
Dynamically allocate a new ExpressionTreePostOrderIteratorImpl object based on the designated end_ite...
Implementation of the ExpressionTreeIterator pattern that is used to define the various iterations al...
Definition: IteratorImpl.h:42
Non-const iterator for traversing an expression tree.
Definition: Iterator.h:27
Encapsulates a MADARA KaRL expression into an evaluatable tree.
ExpressionTree(logger::Logger &logger= *logger::global_logger.get())
Constructor.
ExpressionTree left(void)
Returns the left expression of this tree.
madara::knowledge::KnowledgeRecord evaluate(const madara::knowledge::KnowledgeUpdateSettings &settings=knowledge::KnowledgeUpdateSettings())
Evaluates the expression tree.
iterator begin(const std::string &traversal_order)
Returns an iterator to the beginning of the expression tree.
bool is_null(void) const
Checks if root pointer is null.
ExpressionTree right(void)
Returns the right expression of this tree.
ComponentNode * get_root(void)
Returns the root node of the expression tree.
iterator end(const std::string &traversal_order)
Returns an iterator to the end of the expression tree.
ExpressionTreeIterator iterator
logger::Logger * logger_
handle for logging information
void operator=(const ExpressionTree &tree)
Non-deep copies an expression tree into this instance.
madara::knowledge::KnowledgeRecord prune(void)
Prunes the expression tree of unnecessary nodes.
madara::utility::Refcounter< ComponentNode > root_
root of the expression tree
ExpressionTreeConstIterator const_iterator
madara::knowledge::KnowledgeRecord item(void) const
Returns value of tree.
void accept(Visitor &visitor) const
Accepts a visitor subclassed from the Visitor class.
Iterates through an ExpressionTree in in-order.
Definition: IteratorImpl.h:92
Defines a node that contains a madara::knowledge::KnowledgeRecord::Integer value.
Definition: LeafNode.h:25
Iterates through an ExpressionTree in level-order.
Definition: IteratorImpl.h:251
Iterates through an ExpressionTree in post-order.
Definition: IteratorImpl.h:198
Iterates through an ExpressionTree in level-order.
Definition: IteratorImpl.h:145
Abstract base class for all visitors to all classes that derive from ComponentNode.
Definition: Visitor.h:93
This class encapsulates an entry in a KnowledgeBase.
Settings for applying knowledge updates.
A multi-threaded logger for logging to one or more destinations.
Definition: Logger.h:165
constexpr string_t string
Provides knowledge logging services to files and terminals.
Definition: GlobalLogger.h:12
Copyright(c) 2020 Galois.