#pragma once #include #include #include "ServerAdminMessageFactory.h" static std::function(TiltedPhoques::Buffer::Reader& aReader)> s_serverAdminMessageExtractor[kServerAdminOpcodeMax]; namespace details { static struct ServerAdminMessageFactoryInit { ServerAdminMessageFactoryInit() { auto extractor = [](auto& x) { using T = typename std::remove_reference_t::Type; s_serverAdminMessageExtractor[T::Opcode] = [](TiltedPhoques::Buffer::Reader& aReader) { auto ptr = TiltedPhoques::MakeUnique(); ptr->DeserializeRaw(aReader); return TiltedPhoques::CastUnique(std::move(ptr)); }; return false; }; ServerAdminMessageFactory::Visit(extractor); } } s_ServerAdminMessageFactoryInit; } // namespace details UniquePtr ServerAdminMessageFactory::Extract(TiltedPhoques::Buffer::Reader& aReader) const noexcept { uint64_t data; aReader.ReadBits(data, sizeof(ServerAdminOpcode) * 8); if (data >= kServerAdminOpcodeMax) [[unlikely]] return {nullptr}; const auto opcode = static_cast(data); return s_serverAdminMessageExtractor[opcode](aReader); }