working dispatcher + factory
All checks were successful
Linux arm64 / Build (push) Successful in 1m17s
All checks were successful
Linux arm64 / Build (push) Successful in 1m17s
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user