89 #include "../r_code/object.h"
90 #include "../r_code/utils.h"
105 ~
Context() {
delete implementation_; }
107 _Context *get_implementation()
const {
return implementation_; }
109 uint16 get_children_count()
const {
return implementation_->get_children_count(); }
116 _Context* copy = c.get_implementation()->clone();
117 delete implementation_;
118 implementation_ = copy;
122 bool operator ==(
const Context &c)
const {
return implementation_->equal(c.get_implementation()); }
123 bool operator !=(
const Context &c)
const {
return !implementation_->equal(c.get_implementation()); }
125 Atom &operator [](uint16 i)
const {
return implementation_->get_atom(i); }
127 virtual void setAtomicResult(
Atom a)
const { implementation_->setAtomicResult(a); }
128 virtual void setTimestampResult(Timestamp t)
const { implementation_->setTimestampResult(t); }
129 virtual void setDurationResult(std::chrono::microseconds d)
const { implementation_->setDurationResult(d); }
131 virtual void addCompoundResultPart(
Atom a)
const { implementation_->addCompoundResultPart(a); }
133 void trace(std::ostream& out)
const {
return implementation_->trace(out); }
138 std::vector<r_code::Atom> operation_results_;
140 std::vector<Atom>& operation_results()
const {
141 return const_cast<OpContext*
>(
this)->operation_results_;
148 void setAtomicResult(
Atom a)
const override {
149 Context::setAtomicResult(a);
150 operation_results().push_back(a);
152 void setTimestampResult(Timestamp t)
const override {
153 Context::setTimestampResult(t);
154 operation_results().resize(operation_results_.size() + 3);
155 uint16 value_index = operation_results().size() - 3;
158 void setDurationResult(std::chrono::microseconds d)
const override {
159 Context::setDurationResult(d);
160 operation_results().resize(operation_results_.size() + 3);
161 uint16 value_index = operation_results().size() - 3;
164 uint16 setCompoundResultHead(
Atom a)
const override {
165 uint16 value_index = Context::setCompoundResultHead(a);
166 addCompoundResultPart(a);
169 void addCompoundResultPart(
Atom a)
const override{
170 Context::addCompoundResultPart(a);
171 operation_results().push_back(a);
174 const std::vector<r_code::Atom>& result() {
return operation_results_; }
181 bool red(
const Context &context);
183 bool syn(
const Context &context);
189 bool(*operator_)(
const Context &);
190 bool(*overload_)(
const Context &);
192 static void Register(uint16 opcode,
bool(*op)(
const Context &));
193 static Operator Get(uint16 opcode) {
return Operators_[opcode]; }
194 Operator() : operator_(NULL), overload_(NULL) {}
198 void setOverload(
bool(*o)(
const Context &)) { overload_ = o; }
200 bool operator ()(
const Context &context)
const {
201 if (operator_(context))
204 return overload_(context);
208 bool is_red()
const {
return operator_ == red; }
209 bool is_syn()
const {
return operator_ == syn; }
214 bool now(
const Context &context);
216 bool rnd(
const Context &context);
218 bool equ(
const Context &context);
219 bool neq(
const Context &context);
220 bool gtr(
const Context &context);
221 bool lsr(
const Context &context);
222 bool gte(
const Context &context);
223 bool lse(
const Context &context);
225 bool add(
const Context &context);
226 bool sub(
const Context &context);
227 bool mul(
const Context &context);
228 bool div(
const Context &context);
230 bool dis(
const Context &context);
232 bool ln(
const Context &context);
233 bool exp(
const Context &context);
234 bool log(
const Context &context);
235 bool e10(
const Context &context);
237 bool ins(
const Context &context);
239 bool fvw(
const Context &context);
241 bool is_sim(
const Context &context);
242 bool minimum(
const Context &context);
243 bool maximum(
const Context &context);
244 bool id(
const Context& context);