Files
Simple-Protocol-Lib/include/sp/protocol/MessageFactory.h
2025-06-30 12:07:59 +02:00

41 lines
1.0 KiB
C++

#pragma once
#include <array>
#include <functional>
#include <memory>
#include <sp/common/Tuples.h>
namespace sp {
template <typename TBase, typename TTMessages>
class MessageFactory {
public:
using IdType = typename TBase::MessageIdType;
using MessageBaseType = TBase;
MessageFactory() {
constexpr std::size_t messageCount = std::tuple_size_v<TTMessages>;
m_Factory.resize(messageCount);
TupleForEach([this](const auto& message){
std::size_t messageID = static_cast<std::size_t>(message.GetId());
using MessageType = std::decay_t<decltype(message)>;
m_Factory.emplace(m_Factory.begin() + messageID, []() -> std::unique_ptr<TBase> { return std::make_unique<MessageType>(); });
}, TTMessages{});
}
std::unique_ptr<TBase> CreateMessage(IdType id) const {
std::size_t idSize = static_cast<std::size_t>(id);
if (idSize >= m_Factory.size())
return nullptr;
return m_Factory.at(idSize)();
}
private:
std::vector<std::function<std::unique_ptr<TBase>(void)>> m_Factory;
};
} // namespace sp