40 lines
1.0 KiB
C++
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
|