MADARA  3.1.8
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 
19 
20 namespace madara
21 {
22  namespace expression
23  {
40  enum
41  {
46  };
47 
48 
50  {
51  public:
54 
58  const std::string &traversal_order,
59  bool end_iter);
60 
61  private:
65  bool end_iter);
66 
70  bool end_iter);
71 
75  bool end_iter);
76 
80  bool end_iter);
81 
83  (ExpressionTree &tree, bool end_iter);
84  typedef ::std::map < std::string, TRAVERSAL_PTMF> TRAVERSAL_MAP;
85 
86  TRAVERSAL_MAP traversal_map_;
87  };
88  }
89 }
90 
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 
133  madara::expression::ExpressionTree &tree, const std::string &traversal_order,
134  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 
155  : logger_ (&logger), root_ (0)
156 {
157 }
158 
159 // Ctor take an underlying NODE*.
160 
163  madara::expression::ComponentNode *root, bool increase_count)
164  : logger_ (&logger), root_ (root, increase_count)
165 {
166 }
167 
168 // Copy ctor
169 
173  : logger_ (&logger), root_ (t.root_)
174 {
175 }
176 
177 // Assignment operator
178 
179 void
182 {
183  // Refcounter class takes care of the internal decrements and
184  // increments.
185  if (this != &t)
186  {
187  logger_ = t.logger_;
188  root_ = t.root_;
189  }
190 }
191 
192 // Dtor
193 
195 {
196  // taken care of by Refcounter class
197 }
198 
199 // Check if the tree is empty.
200 
201 bool
203 {
204  return root_.get_ptr () == 0;
205 }
206 
207 
213 {
214  bool root_can_change = false;
216 
217  if (this->root_.get_ptr ())
218  {
219  root_value = this->root_->prune (root_can_change);
220  if (!root_can_change &&
221  dynamic_cast <LeafNode *> (this->root_.get_ptr ()) == 0)
222  {
223  root_ = new LeafNode (*(this->logger_), root_value);
224  }
225  }
226 
227  return root_value;
228 }
229 
230 
236 {
237  if (root_.get_ptr () != 0)
238  return root_->evaluate (settings);
239  else
241 }
242 
243 
244 // return root pointer
247 {
248  return root_.get_ptr ();
249 }
250 
251 // Return the stored item.
252 
255 {
256  return root_->item ();
257 }
258 
259 // Return the left branch.
260 
263 {
264  return ExpressionTree (*logger_, root_->left (), true);
265 }
266 
267 // Return the left branch.
268 
271 {
272  return ExpressionTree (*logger_, root_->right (), true);
273 }
274 
275 // Return a begin iterator of a specified type.
276 
279 {
281  (tree_iterator_factory.make_tree_iterator (*this,
282  traversal_order,
283  false));
284 }
285 
286 // Return an end iterator of a specified type.
287 
290 {
292  (tree_iterator_factory.make_tree_iterator (*this,
293  traversal_order,
294  true));
295 }
296 
297 // Return a begin iterator of a specified type.
298 
301 {
302  ExpressionTree *non_const_this = const_cast <ExpressionTree *> (this);
303  return ExpressionTree::const_iterator (tree_iterator_factory.make_tree_iterator (*non_const_this,
304  traversal_order,
305  false));
306 }
307 
308 // Return an end iterator of a specified type.
309 
312 {
313  ExpressionTree *non_const_this = const_cast <ExpressionTree *> (this);
314  return ExpressionTree::const_iterator (tree_iterator_factory.make_tree_iterator (*non_const_this,
315  traversal_order,
316  true));
317 }
318 
320 
321 void
323 {
324  root_->accept (visitor);
325 }
326 
327 #endif // _MADARA_NO_KARL_
328 
329 #endif /* _EXPRESSION_TREE_CPP_ */
This class encapsulates an entry in a KnowledgeBase.
madara::knowledge::KnowledgeRecord item(void) const
Returns value of tree.
Encapsulates a MADARA KaRL expression into an evaluatable tree.
madara::knowledge::KnowledgeRecord KnowledgeRecord
ExpressionTree(logger::Logger &logger=*logger::global_logger.get())
Constructor.
bool is_null(void) const
Checks if root pointer is null.
iterator end(const std::string &traversal_order)
Returns an iterator to the end of the expression tree.
Iterates through an ExpressionTree in in-order.
Definition: IteratorImpl.h:93
Constant iterator over an expression tree.
Definition: Iterator.h:76
ExpressionTreeIteratorImpl *(ExpressionTreeIteratorFactory::* TRAVERSAL_PTMF)(ExpressionTree &tree, bool end_iter)
void accept(Visitor &visitor) const
Accepts a visitor subclassed from the Visitor class.
Non-const iterator for traversing an expression tree.
Definition: Iterator.h:26
ExpressionTreeIteratorImpl * make_post_order_tree_iterator(ExpressionTree &tree, bool end_iter)
Dynamically allocate a new ExpressionTreePostOrderIteratorImpl object based on the designated end_ite...
madara::knowledge::KnowledgeRecord prune(void)
Prunes the expression tree of unnecessary nodes.
Defines a node that contains a madara::knowledge::KnowledgeRecord::Integer value. ...
Definition: LeafNode.h:23
Provides knowledge logging services to files and terminals.
Definition: GlobalLogger.h:11
Implementation of a factory pattern that dynamically allocates the appropriate ExpressionTreeIterator...
A multi-threaded logger for logging to one or more destinations.
Definition: Logger.h:88
ExpressionTreeIteratorImpl * make_in_order_tree_iterator(ExpressionTree &tree, bool end_iter)
Dynamically allocate a new ExpressionTreeLevelOrderIteratorImpl object based on the designated end_it...
static madara::expression::ExpressionTreeIteratorFactory tree_iterator_factory
ExpressionTreeConstIterator const_iterator
Iterates through an ExpressionTree in post-order.
Definition: IteratorImpl.h:204
ExpressionTreeIteratorImpl * make_level_order_tree_iterator(ExpressionTree &tree, bool end_iter)
Dynamically allocate a new ExpressionTreeLevelOrderIteratorImpl object based on the designated end_it...
ComponentNode * get_root(void)
Returns the root node of the expression tree.
Iterates through an ExpressionTree in level-order.
Definition: IteratorImpl.h:260
An abstract base class defines a simple abstract implementation of an expression tree node...
Definition: ComponentNode.h:35
Abstract base class for all visitors to all classes that derive from ComponentNode.
Definition: Visitor.h:90
ExpressionTree left(void)
Returns the left expression of this tree.
static constexpr struct madara::knowledge::tags::string_t string
ExpressionTree right(void)
Returns the right expression of this tree.
::std::map< std::string, TRAVERSAL_PTMF > TRAVERSAL_MAP
Iterates through an ExpressionTree in level-order.
Definition: IteratorImpl.h:148
logger::Logger * logger_
handle for logging information
ExpressionTreeIterator iterator
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 ...
Settings for applying knowledge updates.
Copyright (c) 2015 Carnegie Mellon University.
madara::utility::Refcounter< ComponentNode > root_
root of the expression tree
Implementation of the ExpressionTreeIterator pattern that is used to define the various iterations al...
Definition: IteratorImpl.h:41
void operator=(const ExpressionTree &tree)
Non-deep copies an expression tree into this instance.
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.