#pragma once class AbstractHookEngine { private: const char* name_; public: /* boolean for each hook test case, which are set by the hooks */ struct { bool small_; bool branch; bool rip_relative; bool avx; bool rdrand; bool loop; bool tail_recursion; }; public: AbstractHookEngine(const char* name) : name_(name), small_(false), branch(false), rip_relative(false), avx(false), rdrand(false), loop(false), tail_recursion(false) { } virtual bool hook_all() = 0; virtual bool unhook_all() = 0; bool all_hooked() const { return small_ && branch && rip_relative && avx && rdrand && loop && tail_recursion; } const char* name() const { return name_; } friend std::ostream& operator<< (std::ostream& stream, const AbstractHookEngine& eng) { std::cout << '|' << std::setw(10) << eng.name() << std::setw(1) << '|' << (eng.small_ ? 'X' : ' ') << '|' << (eng.branch ? 'X' : ' ') << '|' << (eng.rip_relative ? 'X' : ' ') << '|' << (eng.avx ? 'X' : ' ') << '|' << (eng.rdrand ? 'X' : ' ') << '|' << (eng.loop ? 'X' : ' ') << '|' << (eng.tail_recursion ? 'X' : ' ') << '|'; return stream; } };