#ifndef OGPC_PMANAGER_H_ #define OGPC_PMANAGER_H_ #include "BinaryBuffer.h" #include #include #include #include #include inline namespace { template struct FuncArgTraits; template struct FuncArgTraits { using type = std::tuple; }; template struct FuncArgTraits> { using type = std::tuple; }; template struct FuncArgTraits : FuncArgTraits {}; template struct FuncArgTraits { using type = std::tuple; }; } class ProcedureManager { public: ProcedureManager(); template void registerProcedure(const std::uint32_t &id, T&& func) { procedures[id] = [&func](BinaryBuffer &b) -> BinaryBuffer { using Arg = typename FuncArgTraits::type>::type; Arg x; b >> x; auto y = std::apply(func, std::move(x)); BinaryBuffer res; res << y; return res; }; } void handleCall(FILE *in, FILE *out) const; private: std::map> procedures; }; #endif