// opcode.h
// feltételezve, hogy a getvar, result, stb. definiálva van. nyilván lehet komplexebb módon is, de ez egy példa

DEFINE_OPCODE(add, Result() = GetVar(0) + GetVar(1))
DEFINE_OPCODE(sub, Result() = GetVar(0) - GetVar(1))
DEFINE_OPCODE(jmp, InstructionPointer() = GetVar(0))

// akármi.cpp

// opcode function definitions
#define DEFINE_OPCODE(name, ...) \
  void opcode_##name() { \
    __VA_ARGS__ ; \
  }
#include "opcode.h"
#undef DEFINE_OPCODE

// ez csak kis extra
// enum class c++11 feature de mindegy
enum class Opcodes {
#define DEFINE_OPCODE(name, ...) \
name ,
#include "opcode.h"
#undef DEFINE_OPCODE
Count };

// nem tudom a függvény pointer pontos szintaxisát de ez az lesz
std::vector<(void)*()> opcodes;

void InitializeOpcodes() {

#define DEFINE_OPCODE(name, ...) \
  opcodes.push_back(name); \
  assert(opcodes.count() == Opcodes::name + 1);
#include "opcode.h"
#undef DEFINE_OPCODE
  assert(opcodes.count() == Opcodes::Count);
}

// ezután pl opcodes[Opcodes::add] egy pointer lesz az opcode_add() függvényre
// nyilván a függvényeknek át kell adni valamilyen paramétert (asm stream), azt nem vettem ebbe bele