program.hpp 1.06 KB
Newer Older
Paul's avatar
Paul committed
1
2
3
#ifndef GUARD_RTGLIB_PROGRAM_HPP
#define GUARD_RTGLIB_PROGRAM_HPP

Paul's avatar
Paul committed
4
#include <list>
Paul's avatar
Paul committed
5
6
#include <unordered_map>
#include <rtg/instruction.hpp>
Paul's avatar
Paul committed
7
#include <rtg/operand.hpp>
Paul's avatar
Paul committed
8
#include <rtg/builtin.hpp>
Paul's avatar
Paul committed
9
10
11
12
13

namespace rtg {

struct program
{
Paul's avatar
Paul committed
14
    template<class... Ts>
Paul's avatar
Paul committed
15
    instruction * add_instruction(operand op, Ts*... args)
Paul's avatar
Paul committed
16
17
    {
        shape r = op.compute_shape({args->result...});
Paul's avatar
Paul committed
18
        instructions.push_back({op, r, {args...}});
Paul's avatar
Paul committed
19
20
21
22
23
24
25
26
27
        return std::addressof(instructions.back());
    }
    template<class... Ts>
    instruction * add_literal(Ts&&... xs)
    {
        instructions.emplace_back(literal{std::forward<Ts>(xs)...});
        return std::addressof(instructions.back());
    }

Paul's avatar
Paul committed
28
29
    instruction * add_parameter(std::string name, shape s)
    {
Paul's avatar
Paul committed
30
        instructions.push_back({builtin::param{std::move(name)}, s, {}});
Paul's avatar
Paul committed
31
32
33
34
        return std::addressof(instructions.back());
    }

    literal eval(std::unordered_map<std::string, argument> params) const;
Paul's avatar
Paul committed
35
36
37
38

private:
    // A list is used to keep references to an instruction stable
    std::list<instruction> instructions;
Paul's avatar
Paul committed
39
40
41
42
43
};

}

#endif