working dispatcher + factory
All checks were successful
Linux arm64 / Build (push) Successful in 1m17s

This commit is contained in:
2025-06-25 19:33:11 +02:00
parent 392fcb3d17
commit 10b49b34dd
35 changed files with 315 additions and 1472 deletions

View File

@@ -2,28 +2,36 @@
#include <array>
#include <functional>
#include <iostream>
#include <memory>
#include <sp/protocol/message/ArrayFillerImpl.h>
#include <sp/common/Tuples.h>
namespace sp {
template <typename TBase, typename TTMessages>
class MessageFactory {
public:
using IdType = typename TBase::MsgIdType;
using IdType = typename TBase::MessageIdType;
MessageFactory() : m_Factory(details::ArrayFiller<TBase, TTMessages>::ArrayCreate()) {}
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 {
if (id >= m_Factory.size())
std::size_t idSize = static_cast<std::size_t>(id);
if (idSize >= m_Factory.size())
return nullptr;
return m_Factory.at(id)();
return m_Factory.at(idSize)();
}
private:
details::ArrayType<TBase> m_Factory;
std::vector<std::function<std::unique_ptr<TBase>(void)>> m_Factory;
};