program.cpp 983 Bytes
Newer Older
Paul's avatar
Paul committed
1
#include <rtg/program.hpp>
Paul's avatar
Paul committed
2
#include <rtg/stringutils.hpp>
Paul's avatar
Paul committed
3
4
5
6
#include <algorithm>

namespace rtg {

Paul's avatar
Paul committed
7
literal program::eval(std::unordered_map<std::string, argument> params) const
Paul's avatar
Paul committed
8
9
10
11
12
13
14
15
16
{
    std::unordered_map<const instruction*, argument> results;
    argument result;
    for(auto& ins:instructions)
    {
        if(ins.name == "literal")
        {
            result = ins.lit.get_argument();
        }
Paul's avatar
Paul committed
17
18
19
20
        else if(starts_with(ins.name, "param:"))
        {
            result = params.at(ins.name.substr(6));
        }
Paul's avatar
Paul committed
21
22
23
24
25
26
27
28
29
30
31
        else
        {
            auto&& op = ops.at(ins.name);
            std::vector<argument> 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);
    }
Paul's avatar
Paul committed
32
    return literal{result.get_shape(), result.data()};
Paul's avatar
Paul committed
33
34
35
36
}

}