2 #ifndef _MADARA_NO_KARL_
18 key_expansion_necessary_(false)
27 if (key_expansion_necessary_)
30 "Variable %s requires variable expansion\n", key_.c_str());
32 unsigned int count = 0;
35 std::stringstream builder;
36 std::vector<std::string>::const_iterator token = tokens_.begin();
40 for (++token, ++count; token != tokens_.end(); ++token, ++count)
45 if (count < pivot_list_.size() && pivot_list_[count] ==
"}")
47 builder <<
context_.get_record(*token)->to_string();
76 return ref_.get_record_unsafe()->retrieve_index(index);
80 return context_.get(expand_key()).retrieve_index(index);
99 "CompositeArrayReference::prune: "
100 "KARL COMPILE ERROR:"
101 "Reserved word 'nan' used as an array reference.\n",
106 "madara::expression::ComponentNode: "
107 "KARL COMPILE ERROR: "
108 "Reserved word 'nan' used as an array reference.");
110 else if (key ==
"inf")
113 "CompositeArrayReference::prune: "
114 "KARL COMPILE ERROR:"
115 "Reserved word 'inf' used as an array reference.\n",
120 "madara::expression::ComponentNode: "
121 "KARL COMPILE ERROR: "
122 "Reserved word 'inf' used as an array reference.");
128 return *ref_.get_record_unsafe();
139 size_t index = right_->evaluate(settings).
to_integer();
143 auto ret = ref_.get_record_unsafe();
147 std::stringstream buffer;
148 buffer <<
"madara::expression::CompositeArrayReference::evaluate: ";
149 buffer <<
"ERROR: settings do not allow reads of unset vars and ";
150 buffer << ref_.get_name() <<
" is uninitialized";
154 return ret->retrieve_index(index);
158 auto ret =
context_.get(expand_key()).retrieve_index(index);
162 std::stringstream buffer;
163 buffer <<
"madara::expression::CompositeArrayReference::evaluate: ";
164 buffer <<
"ERROR: settings do not allow reads of unset vars and ";
165 buffer << ref_.get_name() <<
" is uninitialized";
183 size_t index = size_t(right_->evaluate(settings).to_integer());
187 auto record = ref_.get_record_unsafe();
192 return context_.retrieve_index(expand_key(), index, settings);
196 if (record->write_quality != record->quality)
197 record->quality = record->write_quality;
208 context_.retrieve_index(expand_key(), index, settings) -
225 size_t index = size_t(right_->evaluate(settings).to_integer());
229 auto record = ref_.get_record_unsafe();
234 return context_.retrieve_index(expand_key(), index, settings);
238 if (record->write_quality != record->quality)
239 record->quality = record->write_quality;
250 context_.retrieve_index(expand_key(), index, settings) +
266 int return_value = 0;
269 return_value = set(value.
to_integer(), settings);
271 return_value = set(value.
to_double(), settings);
280 size_t index = size_t(right_->evaluate(settings).to_integer());
284 auto record = ref_.get_record_unsafe();
293 if (record->write_quality != record->quality)
294 record->quality = record->write_quality;
296 record->set_index(index, value);
303 return context_.set_index(expand_key(), index, value, settings);
309 size_t index = size_t(right_->evaluate(settings).to_integer());
313 auto record = ref_.get_record_unsafe();
322 if (record->write_quality != record->quality)
323 record->quality = record->write_quality;
325 record->set_index(index, value);
332 return context_.set_index(expand_key(), index, value, settings);
#define madara_logger_ptr_log(loggering, level,...)
Fast version of the madara::logger::log method for Logger pointers.
const ThreadSafeContext * context_
madara::knowledge::KnowledgeRecord KnowledgeRecord
An exception for unrecoverable KaRL compilation issues.
An exception for attempting to access an invalid context1.
An abstract base class defines a simple abstract implementation of an expression tree node.
logger::Logger * logger_
handle the context
std::vector< std::string > pivot_list_
std::vector< std::string > tokens_
std::vector< std::string > splitters_
std::string expand_key(void) const
Expands the key (if necessary).
const std::string & key(void) const
Return the variable key.
virtual madara::knowledge::KnowledgeRecord evaluate(const madara::knowledge::KnowledgeUpdateSettings &settings)
Evaluates the node and its children.
CompositeArrayReference(const std::string &key, ComponentNode *index, madara::knowledge::ThreadSafeContext &context)
Constructor.
virtual madara::knowledge::KnowledgeRecord prune(bool &can_change)
Prune the tree of unnecessary nodes.
knowledge::KnowledgeRecord inc(const madara::knowledge::KnowledgeUpdateSettings &settings=knowledge::KnowledgeUpdateSettings())
Sets the value stored in the node.
bool key_expansion_necessary_
Expansion necessary.
virtual void accept(Visitor &visitor) const
Define the accept() operation used for the Visitor pattern.
int set(const madara::knowledge::KnowledgeRecord::Integer &value, const madara::knowledge::KnowledgeUpdateSettings &settings=knowledge::KnowledgeUpdateSettings())
Sets the value stored in the node.
virtual madara::knowledge::KnowledgeRecord item(void) const
Return the item stored in the node.
madara::knowledge::VariableReference ref_
knowledge::KnowledgeRecord dec(const madara::knowledge::KnowledgeUpdateSettings &settings=knowledge::KnowledgeUpdateSettings())
Sets the value stored in the node.
Encapsulates a single expression tree.
madara::knowledge::VariableReference expand(const std::string &key, const std::string &print_prefix, madara::knowledge::ThreadSafeContext &context, madara::logger::Logger *cur_logger, bool &key_expansion_necessary, std::vector< std::string > &splitters, std::vector< std::string > &tokens, std::vector< std::string > &pivot_list)
Expands a key into either a VariableReference or tokens.
Abstract base class for all visitors to all classes that derive from ComponentNode.
virtual void visit(const LeafNode &node)=0
Visit a LeafNode.
This class encapsulates an entry in a KnowledgeBase.
uint32_t type(void) const
returns the type of the value
double to_double(void) const
converts the value to a float/double.
Integer to_integer(void) const
converts the value to an integer.
bool exception_on_unitialized
throw an exception if reference is on uninitialized variable
Settings for applying knowledge updates.
bool always_overwrite
Toggle for always overwriting records, regardless of quality, clock values, etc.
This class stores variables and their values for use by any entity needing state information in a thr...