33 std::weak_ptr<CallableFunction>
f;
43 bool UnitsExpressionWalker::check=
true;
44 Units UserFunction::units(
bool check)
const 46 UnitsExpressionWalker::check=check;
47 vector<UnitsExpressionWalker> args(argNames.size());
48 if (!args.empty()) args[0].units=m_ports[1]->units(check);
49 if (args.size()>1) args[1].units=m_ports[2]->units(check);
53 vector<UnitsExpressionWalker> externalUnits;
54 exprtk::symbol_table<UnitsExpressionWalker> symbolTable, unknownVariables;
55 exprtk::expression<UnitsExpressionWalker> compiled;
56 compiled.register_symbol_table(unknownVariables);
57 compiled.register_symbol_table(symbolTable);
58 for (
size_t i=0; i<args.size(); ++i)
61 symbolTable.add_variable(argNames[i],args[i]);
64 const std::vector<std::string> externalIds=symbolNames();
65 vector<ExprTkCallableFunction> externalFunctions;
67 externalUnits.reserve(externalIds.size());
68 for (
auto& i: externalIds)
70 if (find(argNames.begin(), argNames.end(), i)!=argNames.end())
continue;
73 if (v!=
minsky().variableValues.end())
75 externalUnits.emplace_back();
76 externalUnits.back().units=v->second->units;
77 externalUnits.back().check=check;
78 unknownVariables.add_variable(i, externalUnits.back());
82 if (
f!=
minsky().userFunctions.end())
84 externalFunctions.emplace_back(
f->second);
85 unknownVariables.add_function(i,externalFunctions.back());
93 return compiled.value().units;
95 catch (
const std::exception& ex)
98 throw_error(ex.what());
UnitsExpressionWalker operator()(const std::vector< UnitsExpressionWalker > &)
std::weak_ptr< CallableFunction > f
VariableValues variableValues
Creation and access to the minskyTCL_obj object, which has code to record whenever Minsky's state cha...
represents the units (in sense of dimensional analysis) of a variable.
const Minsky & cminsky()
const version to help in const correctness
string canonicalName(const string &name)
convert a raw name into a canonical name - this is not idempotent.
ExprTkCallableFunction(const std::weak_ptr< CallableFunction > &f)
Exclude< std::map< std::string, std::shared_ptr< CallableFunction > > > userFunctions
string valueIdFromScope(const GroupPtr &scope, const std::string &name)
value Id from scope and canonical name name
exprtk::parser< UnitsExpressionWalker > unitsParser
UnitsExpressionWalker timeUnit