MADARA  3.4.1
CompositeConstArray.cpp
Go to the documentation of this file.
1 /* -*- C++ -*- */
2 #ifndef _FUNCTION_NODE_CPP_
3 #define _FUNCTION_NODE_CPP_
4 
5 #ifndef _MADARA_NO_KARL_
6 
7 #include <iostream>
8 #include <sstream>
9 
16 
19 
20 #ifdef _MADARA_PYTHON_CALLBACKS_
21 
22 #include <boost/python/call.hpp>
23 
24 #endif
25 
26 #ifdef _MADARA_JAVA_
27 
28 #include "madara_jni.h"
29 
30 #endif
31 
32 // Ctor
33 
35  logger::Logger& logger, const ComponentNodes& nodes)
36  : madara::expression::CompositeTernaryNode(logger, nodes)
37 {
38 }
39 
40 // Dtor
42 
45 {
47  return record;
48 }
49 
55 {
56  can_change = false;
57 
60  args.resize(nodes_.size());
61 
62  bool is_double(false);
63  ComponentNodes::size_type i = 0;
64 
65  for (; i < nodes_.size(); ++i)
66  {
67  bool arg_can_change = false;
68  args[i] = nodes_[i]->prune(arg_can_change);
69 
70  // we cannot initialize the array until we know if there are any doubles
71  if (args[i].type() == knowledge::KnowledgeRecord::DOUBLE)
72  {
73  is_double = true;
74  }
75 
76  if (!arg_can_change && dynamic_cast<LeafNode*>(nodes_[i]) == 0)
77  {
78  delete nodes_[i];
79  nodes_[i] = new LeafNode(*(this->logger_), result);
80  }
81  else if (arg_can_change)
82  {
83  can_change = true;
84  }
85  }
86 
87  // if we are looking at a static const array, then leafize it
88  if (i > 0)
89  {
90  result.clear_value();
91 
92  if (is_double)
93  result.set_index(i - 1, args[i - 1].to_double());
94  else
95  result.set_index(i - 1, args[i - 1].to_integer());
96 
97  for (i = 0; i < args.size() - 1; ++i)
98  {
99  if (is_double)
100  result.set_index(i, args[i].to_double());
101  else
102  result.set_index(i, args[i].to_integer());
103  }
104  }
105  else
106  {
108  "KARL COMPILE ERROR: Array initialized with no elements\n");
109  }
110 
111  return result;
112 }
113 
119 {
122 
123  args.resize(nodes_.size());
124 
125  bool is_double(false);
126 
127  int j = 0;
128 
129  for (ComponentNodes::iterator i = nodes_.begin(); i != nodes_.end(); ++i, ++j)
130  {
131  args[j] = (*i)->evaluate(settings);
132 
133  // we cannot initialize the array until we know if there are any doubles
134  if (args[j].type() == knowledge::KnowledgeRecord::DOUBLE)
135  {
136  is_double = true;
137  }
138  else if (args[j].type() != knowledge::KnowledgeRecord::INTEGER)
139  {
140  args[j] =
141  knowledge::KnowledgeRecord((*i)->evaluate(settings).to_integer());
142  }
143  }
144 
145  // check if we have any args or if this was a poorly done array
146  if (args.size() > 0)
147  {
148  // set last element first so there is only one resize
149  if (is_double)
150  result.set_index(j - 1, args[j - 1].to_double());
151  else
152  result.set_index(j - 1, args[j - 1].to_integer());
153 
154  for (size_t i = 0; i < args.size() - 1; ++i)
155  {
156  if (is_double)
157  result.set_index(i, args[i].to_double());
158  else
159  result.set_index(i, args[i].to_integer());
160  }
161  }
162 
163  return result;
164 }
165 
166 // accept a visitor
168 {
169  visitor.visit(*this);
170 }
171 
172 #endif // _MADARA_NO_KARL_
173 
174 #endif /* _FUNCTION_NODE_CPP_ */
#define madara_logger_ptr_log(loggering, level,...)
Fast version of the madara::logger::log method for Logger pointers.
Definition: Logger.h:41
madara::knowledge::KnowledgeRecord KnowledgeRecord
virtual void accept(Visitor &visitor) const
Accepts a visitor subclassed from the Visitor class.
virtual madara::knowledge::KnowledgeRecord evaluate(const madara::knowledge::KnowledgeUpdateSettings &settings)
Evaluates the expression tree.
CompositeConstArray(logger::Logger &logger, const ComponentNodes &nodes)
Constructor.
virtual madara::knowledge::KnowledgeRecord prune(bool &can_change)
Prunes the expression tree of unnecessary nodes.
virtual madara::knowledge::KnowledgeRecord item(void) const
Returns the printable character of the node.
Defines a node that contains a madara::knowledge::KnowledgeRecord::Integer value.
Definition: LeafNode.h:25
Abstract base class for all visitors to all classes that derive from ComponentNode.
Definition: Visitor.h:93
virtual void visit(const LeafNode &node)=0
Visit a LeafNode.
This class encapsulates an entry in a KnowledgeBase.
void set_index(size_t index, T value)
sets the value at the index to the specified value.
void clear_value(void) noexcept
clears any dynamic values.
void resize(size_t new_size)
resizes an array to a new size
Settings for applying knowledge updates.
A multi-threaded logger for logging to one or more destinations.
Definition: Logger.h:165
std::deque< ComponentNode * > ComponentNodes
a vector of Component Nodes
std::vector< KnowledgeRecord > FunctionArguments
Provides knowledge logging services to files and terminals.
Definition: GlobalLogger.h:12
Copyright(c) 2020 Galois.