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