program.cpp 773 Bytes
Newer Older
Paul's avatar
Paul committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <rtg/program.hpp>
#include <algorithm>

namespace rtg {

literal program::eval() const
{
    std::unordered_map<const instruction*, argument> results;
    argument result;
    for(auto& ins:instructions)
    {
        if(ins.name == "literal")
        {
            result = ins.lit.get_argument();
        }
        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);
    }
    return literal{result.s, result.data()};
}

}