2 Commits

Author SHA1 Message Date
a63395f219 better fields 2025-02-06 18:30:35 +01:00
8ecfb95167 fields builder 2025-02-06 18:01:27 +01:00
6 changed files with 34 additions and 11 deletions

View File

@@ -4,18 +4,10 @@
#include <sp/protocol/Field.h>
#include <sp/protocol/MessageBase.h>
enum PacketId {
KeepAlive = 0,
};
enum KeepAlivePacketFields {
KeepAliveId = 0
};
using KeepAliveFields = std::tuple<sp::Field<std::uint64_t>>;
using KeepAliveFields = std::tuple<std::uint64_t /*KeepAliveId*/>;
class KeepAlivePacket : public sp::MessageBase<sp::PacketMessage,
sp::option::StaticNumIdImpl<KeepAlive>, // provide idImpl() if needed
sp::option::DispatchImpl<KeepAlivePacket>, // provide dispatchImpl() if needed
sp::option::FieldsImpl<KeepAliveFields> // provide access to fields
> {};
DeclarePacket(KeepAlive);

View File

@@ -1,5 +1,9 @@
#pragma once
enum PacketId {
KeepAlive
};
#include <examples/KeepAlivePacket.h>
using AllPackets = std::tuple<KeepAlivePacket>;

View File

@@ -13,4 +13,10 @@ using PacketMessage = Message<
option::Handler<PacketHandler> // add dispatch() operation
>;
#define DeclarePacket(packetName) class packetName##Packet : public sp::MessageBase<sp::PacketMessage,\
sp::option::StaticNumIdImpl<packetName>, \
sp::option::DispatchImpl<packetName##Packet>, \
sp::option::FieldsImpl<packetName##Fields> \
> {}
} // namespace sp

View File

@@ -1,6 +1,7 @@
#pragma once
#include <sp/common/DataBuffer.h>
#include <sp/protocol/Templates.h>
namespace sp {
@@ -62,4 +63,23 @@ class FieldWriter {
DataBuffer& m_Buffer;
};
template <typename... TFields>
struct FieldsBuilder {};
template <>
struct FieldsBuilder<> {
using Type = std::tuple<>;
};
template<typename... TFields>
struct FieldsBuilder<std::tuple<TFields...>> {
using Type = typename FieldsBuilder<TFields...>::Type;
};
template <typename TField, typename... TFields>
struct FieldsBuilder<TField, TFields...> {
using Type = sp::tuple_cat_t<std::tuple<Field<TField>>, typename FieldsBuilder<TFields...>::Type>;
};
} // namespace sp

View File

@@ -54,7 +54,7 @@ struct MessageImplParsedOptions<option::DispatchImpl<TActual>, TOptions...> : pu
template <typename TFields, typename... TOptions>
struct MessageImplParsedOptions<option::FieldsImpl<TFields>, TOptions...> : public MessageImplParsedOptions<TOptions...> {
static const bool HasFieldsImpl = true;
using Fields = TFields;
using Fields = typename FieldsBuilder<TFields>::Type;
};

View File

@@ -16,6 +16,7 @@ int main() {
KeepAliveHandler handler;
msg->Dispatch(handler);
//TODO: constructor
keepAlive->GetField<KeepAliveId>() = 69;
sp::DataBuffer buffer;
msg->Write(buffer);