roza/lib/Program.cpp

84 lines
1.5 KiB
C++
Raw Permalink Normal View History

2023-08-30 18:06:26 +00:00
#include "Program.hpp"
namespace roza
{
/*explicit*/ Program::Program()
{
}
/*virtual*/ Program::~Program()
{
}
void Program::push_instr(Opcode opcode, std::optional<param_t> param)
{
m_instrs.push_back({opcode, param});
}
size_t Program::push_value(std::shared_ptr<Value> value)
{
size_t sz = m_values.size();
m_values.push_back(value);
return sz;
}
Opcode Program::opcode(size_t index) const
{
assert(index < size());
return m_instrs[index].opcode;
}
std::optional<param_t> Program::param(size_t index) const
{
assert(index < size());
return m_instrs[index].param;
}
2023-08-30 22:31:19 +00:00
std::shared_ptr<Value> Program::value(size_t index) const
{
assert(has_value(index));
return m_values[index];
}
bool Program::has_value(size_t index) const
{
return index < m_values.size();
}
2023-08-31 23:22:51 +00:00
void Program::set_param(size_t index, param_t param)
{
assert(index < m_instrs.size());
m_instrs[index].param = param;
}
2023-08-30 18:06:26 +00:00
std::string Program::string() const
{
std::stringstream ss;
size_t addr = 0;
for (auto const& instr: m_instrs)
{
2023-08-30 22:31:19 +00:00
ss << addr++
2023-08-30 18:06:26 +00:00
<< "\t"
<< (OpcodeStr[instr.opcode])
2023-08-30 22:31:19 +00:00
<< "\t";
if (instr.param)
{
ss << std::to_string(*instr.param);
if (has_value(*instr.param))
{
ss << "\t" << "(" << value(*instr.param)->string() << ")";
}
}
ss << "\n";
2023-08-30 18:06:26 +00:00
}
return ss.str();
}
}