#include #include #include namespace rtg { literal program::eval(std::unordered_map params) const { std::unordered_map results; argument result; for(auto& ins:instructions) { if(ins.name == builtin::literal) { result = ins.lit.get_argument(); } else if(starts_with(ins.name, builtin::param)) { result = params.at(ins.name.substr(6)); } else { auto&& op = ops.at(ins.name); std::vector values(ins.arguments.size()); std::transform(ins.arguments.begin(), ins.arguments.end(), values.begin(), [&](instruction * i) { return results.at(i); }); result = op.compute(values); } results.emplace(std::addressof(ins), result); } return literal{result.get_shape(), result.data()}; } }