program.cpp 961 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
{
    std::unordered_map<const instruction*, argument> results;
    argument result;
    for(auto& ins:instructions)
    {
Paul's avatar
Paul committed
13
        if(ins.op.name() == "@literal")
Paul's avatar
Paul committed
14
15
16
        {
            result = ins.lit.get_argument();
        }
Paul's avatar
Paul committed
17
        else if(starts_with(ins.op.name(), "@param"))
Paul's avatar
Paul committed
18
        {
Paul's avatar
Paul committed
19
            result = params.at(ins.op.name().substr(7));
Paul's avatar
Paul committed
20
        }
Paul's avatar
Paul committed
21
22
23
24
25
26
        else
        {
            std::vector<argument> values(ins.arguments.size());
            std::transform(ins.arguments.begin(), ins.arguments.end(), values.begin(), [&](instruction * i) {
                return results.at(i);
            });
Paul's avatar
Paul committed
27
            result = ins.op.compute(values);
Paul's avatar
Paul committed
28
29
30
        }
        results.emplace(std::addressof(ins), result);
    }
Paul's avatar
Paul committed
31
    return literal{result.get_shape(), result.data()};
Paul's avatar
Paul committed
32
33
34
35
}

}