diff --git a/include/sp/default/DefaultPacket.h b/include/sp/default/DefaultPacket.h index fb629f4..048b0e5 100644 --- a/include/sp/default/DefaultPacket.h +++ b/include/sp/default/DefaultPacket.h @@ -1,22 +1,26 @@ #pragma once -#include #include +#include namespace sp { class PacketHandler; -using PacketMessage = Message< - option::MsgIdType, // add id() operation +using PacketMessage = Message, // add id() operation option::ReadOperations, // add read() operation option::WriteOperations, // add write() operation option::Handler // add dispatch() operation >; -#define DeclarePacket(packetName) class packetName##Packet : public sp::MessageBase, \ - sp::option::DispatchImpl, \ - sp::option::FieldsImpl \ - > {} +#define DeclarePacket(packetName) \ + class packetName##Packet : public sp::MessageBase, \ + sp::option::DispatchImpl, sp::option::FieldsImpl> { \ + public: \ + packetName##Packet() {} \ + template \ + packetName##Packet(Args... args) { \ + Construct(args...); \ + } \ + } } // namespace sp diff --git a/include/sp/protocol/MessageBase.h b/include/sp/protocol/MessageBase.h index f7decc9..57e291c 100644 --- a/include/sp/protocol/MessageBase.h +++ b/include/sp/protocol/MessageBase.h @@ -54,7 +54,7 @@ struct MessageImplParsedOptions, TOptions...> : pu template struct MessageImplParsedOptions, TOptions...> : public MessageImplParsedOptions { static const bool HasFieldsImpl = true; - using Fields = typename FieldsBuilder::Type; + using Fields = TFields; }; @@ -92,7 +92,12 @@ class MessageImplDispatchBase : public TBase { template class MessageImplFieldsBase : public TBase { public: - using AllFields = TFields; + using AllFields = typename FieldsBuilder::Type; + + template + void Construct(Args... args) { + m_Fields = std::make_tuple(args...); + } AllFields& GetFields() { return m_Fields; @@ -107,7 +112,7 @@ class MessageImplFieldsBase : public TBase { } private: - TFields m_Fields; + AllFields m_Fields; }; template @@ -116,7 +121,7 @@ class MessageImplFieldsReadBase : public TBase { void ReadImpl(DataBuffer& buffer) override { //TODO: add endianess 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 { //TODO: add endianess auto& allFields = TBase::GetFields(); - tupleForEach(allFields, FieldWriter{buffer}); + std::apply(FieldWriter{buffer}, allFields); } }; diff --git a/include/sp/protocol/Templates.h b/include/sp/protocol/Templates.h index efbc5ad..53743d1 100644 --- a/include/sp/protocol/Templates.h +++ b/include/sp/protocol/Templates.h @@ -33,54 +33,5 @@ constexpr int get_tuple_index> = 0; template constexpr int get_tuple_index> = 1 + get_tuple_index>; -// Template black magic to loop at compile time -template -void loop_impl(std::index_sequence, LoopBody&& loop_body) { - (loop_body(std::integral_constant{}), ...); -} - -template -void loop(LoopBody&& loop_body) { - loop_impl(std::make_index_sequence{}, std::forward(loop_body)); -} - -namespace details { -template -class TupleForEachHelper { - public: - template - static void exec(TTuple&& tuple, TFunc&& func) { - using Tuple = typename std::decay::type; - static const std::size_t TupleSize = std::tuple_size::value; - static_assert(TRem <= TupleSize, "Incorrect parameters"); - - // Invoke function with current element - static const std::size_t Idx = TupleSize - TRem; - func(std::get(std::forward(tuple))); - - // Compile time recursion - invoke function with the remaining elements - TupleForEachHelper::exec(std::forward(tuple), std::forward(func)); - } -}; - -template <> -class TupleForEachHelper<0> { - public: - // Stop compile time recursion - template - static void exec(TTuple&& tuple, TFunc&& func) { - static_cast(tuple); - static_cast(func); - } -}; -} // namespace details - -template -void tupleForEach(TTuple&& tuple, TFunc&& func) { - using Tuple = typename std::decay::type; - static const std::size_t TupleSize = std::tuple_size::value; - - details::TupleForEachHelper::exec(std::forward(tuple), std::forward(func)); -} } // namespace sp diff --git a/src/main.cpp b/src/main.cpp index 5b42916..20e93f5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -10,14 +10,12 @@ class KeepAliveHandler : public sp::PacketHandler { }; int main() { - auto keepAlive = std::make_unique(); + auto keepAlive = std::make_unique(69); sp::PacketMessage* msg = keepAlive.get(); KeepAliveHandler handler; msg->Dispatch(handler); - //TODO: constructor - keepAlive->GetField() = 69; sp::DataBuffer buffer; msg->Write(buffer);