constructor for packets
This commit is contained in:
@@ -1,22 +1,26 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <sp/protocol/Message.h>
|
|
||||||
#include <sp/protocol/GenericHandler.h>
|
#include <sp/protocol/GenericHandler.h>
|
||||||
|
#include <sp/protocol/Message.h>
|
||||||
|
|
||||||
namespace sp {
|
namespace sp {
|
||||||
class PacketHandler;
|
class PacketHandler;
|
||||||
|
|
||||||
using PacketMessage = Message<
|
using PacketMessage = Message<option::MsgIdType<std::uint8_t>, // add id() operation
|
||||||
option::MsgIdType<std::uint8_t>, // add id() operation
|
|
||||||
option::ReadOperations, // add read() operation
|
option::ReadOperations, // add read() operation
|
||||||
option::WriteOperations, // add write() operation
|
option::WriteOperations, // add write() operation
|
||||||
option::Handler<PacketHandler> // add dispatch() operation
|
option::Handler<PacketHandler> // add dispatch() operation
|
||||||
>;
|
>;
|
||||||
|
|
||||||
#define DeclarePacket(packetName) class packetName##Packet : public sp::MessageBase<sp::PacketMessage,\
|
#define DeclarePacket(packetName) \
|
||||||
sp::option::StaticNumIdImpl<packetName>, \
|
class packetName##Packet : public sp::MessageBase<sp::PacketMessage, sp::option::StaticNumIdImpl<packetName>, \
|
||||||
sp::option::DispatchImpl<packetName##Packet>, \
|
sp::option::DispatchImpl<packetName##Packet>, sp::option::FieldsImpl<packetName##Fields>> { \
|
||||||
sp::option::FieldsImpl<packetName##Fields> \
|
public: \
|
||||||
> {}
|
packetName##Packet() {} \
|
||||||
|
template <typename... Args> \
|
||||||
|
packetName##Packet(Args... args) { \
|
||||||
|
Construct(args...); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace sp
|
} // namespace sp
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ struct MessageImplParsedOptions<option::DispatchImpl<TActual>, TOptions...> : pu
|
|||||||
template <typename TFields, typename... TOptions>
|
template <typename TFields, typename... TOptions>
|
||||||
struct MessageImplParsedOptions<option::FieldsImpl<TFields>, TOptions...> : public MessageImplParsedOptions<TOptions...> {
|
struct MessageImplParsedOptions<option::FieldsImpl<TFields>, TOptions...> : public MessageImplParsedOptions<TOptions...> {
|
||||||
static const bool HasFieldsImpl = true;
|
static const bool HasFieldsImpl = true;
|
||||||
using Fields = typename FieldsBuilder<TFields>::Type;
|
using Fields = TFields;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -92,7 +92,12 @@ class MessageImplDispatchBase : public TBase {
|
|||||||
template <typename TBase, typename TFields>
|
template <typename TBase, typename TFields>
|
||||||
class MessageImplFieldsBase : public TBase {
|
class MessageImplFieldsBase : public TBase {
|
||||||
public:
|
public:
|
||||||
using AllFields = TFields;
|
using AllFields = typename FieldsBuilder<TFields>::Type;
|
||||||
|
|
||||||
|
template<typename... Args>
|
||||||
|
void Construct(Args... args) {
|
||||||
|
m_Fields = std::make_tuple(args...);
|
||||||
|
}
|
||||||
|
|
||||||
AllFields& GetFields() {
|
AllFields& GetFields() {
|
||||||
return m_Fields;
|
return m_Fields;
|
||||||
@@ -107,7 +112,7 @@ class MessageImplFieldsBase : public TBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TFields m_Fields;
|
AllFields m_Fields;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename TBase>
|
template <typename TBase>
|
||||||
@@ -116,7 +121,7 @@ class MessageImplFieldsReadBase : public TBase {
|
|||||||
void ReadImpl(DataBuffer& buffer) override {
|
void ReadImpl(DataBuffer& buffer) override {
|
||||||
//TODO: add endianess
|
//TODO: add endianess
|
||||||
auto& allFields = TBase::GetFields();
|
auto& allFields = TBase::GetFields();
|
||||||
tupleForEach(allFields, FieldReader{buffer});
|
std::apply(FieldReader{buffer}, allFields);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -126,7 +131,7 @@ class MessageImplFieldsWriteBase : public TBase {
|
|||||||
void WriteImpl(DataBuffer& buffer) override {
|
void WriteImpl(DataBuffer& buffer) override {
|
||||||
//TODO: add endianess
|
//TODO: add endianess
|
||||||
auto& allFields = TBase::GetFields();
|
auto& allFields = TBase::GetFields();
|
||||||
tupleForEach(allFields, FieldWriter{buffer});
|
std::apply(FieldWriter{buffer}, allFields);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -33,54 +33,5 @@ constexpr int get_tuple_index<T, std::tuple<T, Rest...>> = 0;
|
|||||||
template <typename T, typename First, typename... Rest>
|
template <typename T, typename First, typename... Rest>
|
||||||
constexpr int get_tuple_index<T, std::tuple<First, Rest...>> = 1 + get_tuple_index<T, std::tuple<Rest...>>;
|
constexpr int get_tuple_index<T, std::tuple<First, Rest...>> = 1 + get_tuple_index<T, std::tuple<Rest...>>;
|
||||||
|
|
||||||
// Template black magic to loop at compile time
|
|
||||||
template <std::size_t... indices, class LoopBody>
|
|
||||||
void loop_impl(std::index_sequence<indices...>, LoopBody&& loop_body) {
|
|
||||||
(loop_body(std::integral_constant<std::size_t, indices>{}), ...);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <std::size_t N, class LoopBody>
|
|
||||||
void loop(LoopBody&& loop_body) {
|
|
||||||
loop_impl(std::make_index_sequence<N>{}, std::forward<LoopBody>(loop_body));
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace details {
|
|
||||||
template <std::size_t TRem>
|
|
||||||
class TupleForEachHelper {
|
|
||||||
public:
|
|
||||||
template <typename TTuple, typename TFunc>
|
|
||||||
static void exec(TTuple&& tuple, TFunc&& func) {
|
|
||||||
using Tuple = typename std::decay<TTuple>::type;
|
|
||||||
static const std::size_t TupleSize = std::tuple_size<Tuple>::value;
|
|
||||||
static_assert(TRem <= TupleSize, "Incorrect parameters");
|
|
||||||
|
|
||||||
// Invoke function with current element
|
|
||||||
static const std::size_t Idx = TupleSize - TRem;
|
|
||||||
func(std::get<Idx>(std::forward<TTuple>(tuple)));
|
|
||||||
|
|
||||||
// Compile time recursion - invoke function with the remaining elements
|
|
||||||
TupleForEachHelper<TRem - 1>::exec(std::forward<TTuple>(tuple), std::forward<TFunc>(func));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <>
|
|
||||||
class TupleForEachHelper<0> {
|
|
||||||
public:
|
|
||||||
// Stop compile time recursion
|
|
||||||
template <typename TTuple, typename TFunc>
|
|
||||||
static void exec(TTuple&& tuple, TFunc&& func) {
|
|
||||||
static_cast<void>(tuple);
|
|
||||||
static_cast<void>(func);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} // namespace details
|
|
||||||
|
|
||||||
template <typename TTuple, typename TFunc>
|
|
||||||
void tupleForEach(TTuple&& tuple, TFunc&& func) {
|
|
||||||
using Tuple = typename std::decay<TTuple>::type;
|
|
||||||
static const std::size_t TupleSize = std::tuple_size<Tuple>::value;
|
|
||||||
|
|
||||||
details::TupleForEachHelper<TupleSize>::exec(std::forward<TTuple>(tuple), std::forward<TFunc>(func));
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace sp
|
} // namespace sp
|
||||||
|
|||||||
@@ -10,14 +10,12 @@ class KeepAliveHandler : public sp::PacketHandler {
|
|||||||
};
|
};
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
auto keepAlive = std::make_unique<KeepAlivePacket>();
|
auto keepAlive = std::make_unique<KeepAlivePacket>(69);
|
||||||
sp::PacketMessage* msg = keepAlive.get();
|
sp::PacketMessage* msg = keepAlive.get();
|
||||||
|
|
||||||
KeepAliveHandler handler;
|
KeepAliveHandler handler;
|
||||||
msg->Dispatch(handler);
|
msg->Dispatch(handler);
|
||||||
|
|
||||||
//TODO: constructor
|
|
||||||
keepAlive->GetField<KeepAliveId>() = 69;
|
|
||||||
sp::DataBuffer buffer;
|
sp::DataBuffer buffer;
|
||||||
msg->Write(buffer);
|
msg->Write(buffer);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user