#ifndef RTG_GUARD_RTGLIB_PROGRAM_HPP #define RTG_GUARD_RTGLIB_PROGRAM_HPP #include #include #include #include #include #include namespace rtg { struct instruction; struct program_impl; struct program { program();; program(program&&) = default; program& operator=(program&&) = default; ~program(); template instruction* add_instruction(operation op, Ts*... args) { return add_instruction(op, {args...}); } instruction* add_instruction(operation op, std::vector args); template instruction* add_literal(Ts&&... xs) { return add_literal(literal{std::forward(xs)...}); } instruction* add_literal(literal l); instruction* add_parameter(std::string name, shape s); literal eval(std::unordered_map params) const; // TODO: Change to stream operator void print() const; bool has_instruction(const instruction* ins) const; private: std::unique_ptr impl; }; } // namespace rtg #endif