Files
Simple-Protocol-Lib/include/sp/protocol/MessageFactory.h
Persson-dev 10b49b34dd
All checks were successful
Linux arm64 / Build (push) Successful in 1m17s
working dispatcher + factory
2025-06-25 19:33:11 +02:00

40 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;
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::remove_const_t<std::remove_reference_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