read/write
This commit is contained in:
@@ -1,61 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \file PacketDispatcher.h
|
|
||||||
* \brief File containing the td::protocol::PacketDispatcher class
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <sp/common/NonCopyable.h>
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
namespace sp {
|
|
||||||
namespace protocol {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \class Dispatcher
|
|
||||||
* \brief Class used to dispatch things
|
|
||||||
*/
|
|
||||||
template <typename T_Enum, typename T_Handler, typename T>
|
|
||||||
class Dispatcher : private NonCopyable {
|
|
||||||
private:
|
|
||||||
std::map<T_Enum, std::vector<T_Handler*>> m_Handlers;
|
|
||||||
|
|
||||||
public:
|
|
||||||
/**
|
|
||||||
* \brief Constructor
|
|
||||||
*/
|
|
||||||
Dispatcher() {}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Dispatch a packet
|
|
||||||
* \param packet The packet to dispatch
|
|
||||||
*/
|
|
||||||
void Dispatch(const T& packet);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Register a packet handler
|
|
||||||
* \param type The packet type
|
|
||||||
* \param handler The packet handler
|
|
||||||
*/
|
|
||||||
void RegisterHandler(T_Enum type, T_Handler& handler);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Unregister a packet handler
|
|
||||||
* \param type The packet type
|
|
||||||
* \param handler The packet handler
|
|
||||||
*/
|
|
||||||
void UnregisterHandler(T_Enum type, T_Handler& handler);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* \brief Unregister a packet handler
|
|
||||||
* \param handler The packet handler
|
|
||||||
*/
|
|
||||||
void UnregisterHandler(T_Handler& handler);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace protocol
|
|
||||||
} // namespace td
|
|
||||||
|
|
||||||
#include "Dispatcher.inl"
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
namespace sp {
|
|
||||||
namespace protocol {
|
|
||||||
|
|
||||||
template <typename T_Enum, typename T_Handler, typename T>
|
|
||||||
void Dispatcher<T_Enum, T_Handler, T>::Dispatch(const T& packet) {
|
|
||||||
T_Enum type = packet.GetType();
|
|
||||||
for (auto* handler : m_Handlers[type])
|
|
||||||
handler->Check(packet);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T_Enum, typename T_Handler, typename T>
|
|
||||||
void Dispatcher<T_Enum, T_Handler, T>::RegisterHandler(T_Enum type, T_Handler& handler) {
|
|
||||||
auto found = std::find(m_Handlers[type].begin(), m_Handlers[type].end(), &handler);
|
|
||||||
if (found == m_Handlers[type].end())
|
|
||||||
m_Handlers[type].push_back(&handler);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T_Enum, typename T_Handler, typename T>
|
|
||||||
void Dispatcher<T_Enum, T_Handler, T>::UnregisterHandler(T_Enum type, T_Handler& handler) {
|
|
||||||
m_Handlers[type].erase(std::remove(m_Handlers[type].begin(), m_Handlers[type].end(), &handler), m_Handlers[type].end());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T_Enum, typename T_Handler, typename T>
|
|
||||||
void Dispatcher<T_Enum, T_Handler, T>::UnregisterHandler(T_Handler& handler) {
|
|
||||||
for (auto& pair : m_Handlers) {
|
|
||||||
if (pair.second.empty())
|
|
||||||
continue;
|
|
||||||
|
|
||||||
auto type = pair.first;
|
|
||||||
|
|
||||||
m_Handlers[type].erase(std::remove(m_Handlers[type].begin(), m_Handlers[type].end(), &handler), m_Handlers[type].end());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace protocol
|
|
||||||
} // namespace td
|
|
||||||
@@ -8,8 +8,12 @@ template <typename ValueType>
|
|||||||
class Field {
|
class Field {
|
||||||
public:
|
public:
|
||||||
// Provide an access to the stored value
|
// Provide an access to the stored value
|
||||||
ValueType& GetValue();
|
ValueType& GetValue() {
|
||||||
const ValueType& GetValue() const;
|
return m_Value;
|
||||||
|
}
|
||||||
|
const ValueType& GetValue() const {
|
||||||
|
return m_Value;
|
||||||
|
}
|
||||||
|
|
||||||
// Read (deserialise) and update internal value
|
// Read (deserialise) and update internal value
|
||||||
void Read(DataBuffer& buffer) {
|
void Read(DataBuffer& buffer) {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <sp/Message.h>
|
#include <sp/Message.h>
|
||||||
|
#include <sp/Templates.h>
|
||||||
|
|
||||||
namespace sp {
|
namespace sp {
|
||||||
namespace option {
|
namespace option {
|
||||||
@@ -100,6 +101,11 @@ class MessageImplFieldsBase : public TBase {
|
|||||||
return m_Fields;
|
return m_Fields;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<std::size_t FIndex>
|
||||||
|
auto& GetField() {
|
||||||
|
return std::get<FIndex>(GetFields()).GetValue();
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TFields m_Fields;
|
TFields m_Fields;
|
||||||
};
|
};
|
||||||
@@ -108,9 +114,9 @@ template <typename TBase>
|
|||||||
class MessageImplFieldsReadBase : public TBase {
|
class MessageImplFieldsReadBase : public TBase {
|
||||||
protected:
|
protected:
|
||||||
void ReadImpl(DataBuffer& buffer) override {
|
void ReadImpl(DataBuffer& buffer) override {
|
||||||
// Access fields via interface provided in previous chunk
|
//TODO: add endianess
|
||||||
auto& allFields = TBase::GetFields();
|
auto& allFields = TBase::GetFields();
|
||||||
//... // read all the fields
|
tupleForEach(allFields, FieldReader{buffer});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -118,9 +124,9 @@ template <typename TBase>
|
|||||||
class MessageImplFieldsWriteBase : public TBase {
|
class MessageImplFieldsWriteBase : public TBase {
|
||||||
protected:
|
protected:
|
||||||
void WriteImpl(DataBuffer& buffer) override {
|
void WriteImpl(DataBuffer& buffer) override {
|
||||||
// Access fields via interface provided in previous chunk
|
//TODO: add endianess
|
||||||
auto& allFields = TBase::GetFields();
|
auto& allFields = TBase::GetFields();
|
||||||
//... // write all the fields
|
tupleForEach(allFields, FieldWriter{buffer});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
12
src/main.cpp
12
src/main.cpp
@@ -52,7 +52,19 @@ class MyHandler : public sp::GenericHandler<MyMessage, AllMessages> {
|
|||||||
int main() {
|
int main() {
|
||||||
MyMessage::MsgIdType test;
|
MyMessage::MsgIdType test;
|
||||||
auto yes = std::make_unique<ActualMessage1<MyMessage>>();
|
auto yes = std::make_unique<ActualMessage1<MyMessage>>();
|
||||||
|
auto& fields = yes->GetFields();
|
||||||
|
|
||||||
|
std::get<0>(fields) = 69;
|
||||||
|
std::get<1>(fields) = 42;
|
||||||
|
|
||||||
MyHandler handlerTest;
|
MyHandler handlerTest;
|
||||||
yes->Dispatch(handlerTest);
|
yes->Dispatch(handlerTest);
|
||||||
|
sp::DataBuffer buffer;
|
||||||
|
yes->Write(buffer);
|
||||||
|
|
||||||
|
auto yesyes = std::make_unique<ActualMessage1<MyMessage>>();
|
||||||
|
yesyes->Read(buffer);
|
||||||
|
std::cout << "Field 1 : " << yesyes->GetField<0>() << std::endl;
|
||||||
|
std::cout << "Field 2 : " << (unsigned) yesyes->GetField<1>() << std::endl;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user