#ifndef roza_PROGRAM_HPP #define roza_PROGRAM_HPP #include "commons.hpp" #include "opcodes.hpp" #include "Value.hpp" namespace roza { using param_t = int; struct Instr { Opcode opcode; std::optional param; }; class Program { public: explicit Program(); virtual ~Program(); size_t size() const { return m_instrs.size(); } void push_instr(Opcode opcode, std::optional param = std::nullopt); size_t push_value(std::shared_ptr value); Opcode opcode(size_t index) const; std::optional param(size_t index) const; std::shared_ptr value(size_t index) const; bool has_value(size_t index) const; void set_param(size_t index, param_t param); std::string string() const; private: std::vector m_instrs; std::vector> m_values; }; } #endif