2 #ifndef _MADARA_NO_KARL_
17 key_expansion_necessary_(false)
22 if (
key.find(
"{") !=
key.npos)
25 "madara::expression::VariableNode: "
26 "Variable %s requires variable expansion.\n",
32 for (
size_t i = 0; i <
key.size(); ++i)
39 else if (
key[i] ==
'}')
48 std::stringstream buffer;
49 buffer <<
"madara::expression::VariableNode";
50 buffer <<
": KARL COMPILE ERROR: matching braces not found in ";
51 buffer <<
key <<
"@" << i <<
"\n";
62 std::stringstream buffer;
63 buffer <<
"madara::expression::VariableNode: ";
64 buffer <<
"KARL COMPILE ERROR: more opening braces than closers in ";
65 buffer <<
key <<
"\n";
70 else if (num_opens < 0)
72 std::stringstream buffer;
73 buffer <<
"madara::expression::VariableNode: ";
74 buffer <<
"KARL COMPILE ERROR: more closing braces than openers in ";
75 buffer <<
key <<
"\n";
91 size_t opener,
size_t& closer)
const
93 size_t i = opener + 1;
94 size_t start = markers_[opener] + 1;
96 std::stringstream builder;
99 "madara::expression::VariableNode:expand_opener: "
100 "key=%s, opener_index=%d, start=%d.\n",
101 key_.c_str(), (
int)opener);
103 for (; i < markers_.size(); ++i)
105 if (key_[markers_[i]] ==
'{')
108 if (start < markers_[i])
110 builder << key_.substr(start, markers_[i] - start);
112 "madara::expression::VariableNode:expand_opener: "
113 "%d-%d{: added %d chars.\n",
114 (
int)start, (
int)markers_[i], (
int)(markers_[i] - start));
117 size_t sub_opener = i;
118 builder << expand_opener(i, i);
120 "madara::expression::VariableNode:expand_opener: "
121 "get_record(expand_opener()) "
122 "expand_opener(%d, %d).\n",
123 (
int)sub_opener, (
int)i);
126 start = markers_[i] + 1;
128 else if (key_[markers_[i]] ==
'}')
133 size_t end = markers_[closer];
135 builder << *
context_.get_record(key_.substr(start, end - start));
137 "madara::expression::VariableNode:expand_opener(%d,%d): "
138 "{%d-%d}: added %d chars.\n",
139 (
int)opener, (
int)closer, (
int)start, (
int)end, (
int)(end - start));
147 "madara::expression::VariableNode:expand_opener(%d,%d): "
149 (
int)opener, (
int)closer, result.c_str());
156 if (key_expansion_necessary_)
159 "madara::expression::VariableNode:expand_key: "
160 "Variable %s requires variable expansion"
162 key_.c_str(), (
int)markers_.size());
168 std::stringstream builder;
170 for (; i < markers_.size(); ++i)
172 if (key_[markers_[i]] ==
'{')
175 if (start < markers_[i])
177 builder << key_.substr(start, markers_[i] - start);
179 "madara::expression::VariableNode:expand_key: "
180 "%d-%d{: added %d chars.\n",
181 (
int)start, (
int)markers_[i], (
int)(markers_[i] - start));
185 builder << expand_opener(i, i);
187 "madara::expression::VariableNode:expand_key: "
188 "adding results of expand_opener(%d, %d).\n",
189 (
int)opener, (
int)i);
191 start = markers_[i] + 1;
196 if (start < key_.size() && key_.size() - start > 0)
199 "madara::expression::VariableNode:expand_key: "
200 "substr add from index %d, %d chars.\n",
201 (
int)start, (
int)key_.size() - start);
202 builder << key_.substr(start, key_.size() - start);
208 "madara::expression::VariableNode:expand_key: "
222 visitor.
visit(*
this);
229 return *ref_.get_record_unsafe();
247 return *ref_.get_record_unsafe();
257 "madara::expression::VariableNode::evaluate: "
258 "Returning variable %s.\n",
263 auto ret = ref_.get_record_unsafe();
267 std::stringstream buffer;
268 buffer <<
"madara::expression::VariableNode::evaluate: ";
269 buffer <<
"ERROR: settings do not allow reads of unset vars and ";
270 buffer << ref_.get_name() <<
" is uninitialized";
278 auto ret =
context_.get(expand_key(), settings);
282 std::stringstream buffer;
283 buffer <<
"madara::expression::VariableNode::evaluate: ";
284 buffer <<
"ERROR: settings do not allow reads of unset vars and ";
285 buffer << ref_.get_name() <<
" is uninitialized";
307 "madara::expression::VariableNode::set: "
308 "Attempting to set variable %s to a KnowledgeRecord parameter (%s).\n",
309 key_.c_str(), value.
to_string().c_str());
313 ref =
context_.get_ref(key_, settings);
330 if (record->write_quality != record->quality)
331 record->
quality = record->write_quality;
334 "madara::expression::VariableNode::set: "
335 "Setting variable %s with KnowledgeRecord assignment operator.\n",
352 "madara::expression::VariableNode::set: "
353 "Attempting to set variable %s to an Integer parameter (%d).\n",
354 key_.c_str(), (
int)value);
363 "madara::expression::VariableNode::set: "
364 "Attempting to set variable %s to a double parameter (%f).\n",
365 key_.c_str(), value);
374 "madara::expression::VariableNode::set: "
375 "Attempting to set variable %s to a string parameter (%s).\n",
376 key_.c_str(), value.c_str());
386 auto record = ref_.get_record_unsafe();
395 if (record->write_quality != record->quality)
396 record->
quality = record->write_quality;
406 return context_.dec(expand_key(), settings);
414 auto record = ref_.get_record_unsafe();
423 if (record->write_quality != record->quality)
424 record->
quality = record->write_quality;
434 return context_.inc(expand_key(), settings);
#define madara_logger_ptr_log(loggering, level,...)
Fast version of the madara::logger::log method for Logger pointers.
const ThreadSafeContext * context_
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::string expand_opener(size_t opener, size_t &closer) const
madara::knowledge::ThreadSafeContext & context_
const std::string & key(void) const
Return the variable key.
virtual madara::knowledge::KnowledgeRecord item(void) const
Return the item stored in the node.
virtual madara::knowledge::KnowledgeRecord evaluate(const madara::knowledge::KnowledgeUpdateSettings &settings)
Evaluates the node and its children.
VariableNode(const std::string &key, madara::knowledge::ThreadSafeContext &context)
Ctor.
virtual void accept(Visitor &visitor) const
Define the accept() operation used for the Visitor pattern.
bool key_expansion_necessary_
Expansion necessary.
std::vector< size_t > markers_
madara::knowledge::VariableReference ref_
int set(const madara::knowledge::KnowledgeRecord::Integer &value, const madara::knowledge::KnowledgeUpdateSettings &settings=knowledge::KnowledgeUpdateSettings())
Sets the value stored in the node.
madara::knowledge::KnowledgeRecord dec(const madara::knowledge::KnowledgeUpdateSettings &settings=knowledge::KnowledgeUpdateSettings())
Atomically decrement the variable.
madara::knowledge::KnowledgeRecord inc(const madara::knowledge::KnowledgeUpdateSettings &settings=knowledge::KnowledgeUpdateSettings())
Atomically increment the variable.
std::string expand_key(void) const
Expands the key (if necessary).
virtual madara::knowledge::KnowledgeRecord prune(bool &can_change)
Prune the tree of unnecessary nodes.
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.
std::string to_string(const std::string &delimiter=", ") const
converts the value to a string.
uint32_t quality
priority of the update
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...
VariableReference get_ref(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings())
Atomically returns a reference to the variable.
Optimized reference to a variable within the knowledge base.
bool is_valid(void) const
Checks to see if the variable reference has been initialized.
KnowledgeRecord * get_record_unsafe(void) const
Returns a pointer to the variable's KnowledgeRecord Do not use this pointer unless you've locked the ...