From 9e13bf0d7409b27e47a41fe4b50bccd6bee0d9bd Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Wed, 29 May 2024 12:15:12 +0300 Subject: [PATCH] ... --- CMakeLists.txt | 4 +++- common/adc_traits.h | 3 ++- net/adc_netmessage.h | 29 +++++++++++++++++------------ net/adc_netproto.h | 1 + tests/adc_netmsg_test.cpp | 15 +++++++++++++++ 5 files changed, 38 insertions(+), 14 deletions(-) create mode 100644 net/adc_netproto.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 72f69e1..e234c7a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,7 +23,9 @@ set(ADC_DEVICE_HEADERS set(ADC_NETWORK_HEADERS - net/adc_netmessage.h) + net/adc_netmessage.h + net/adc_netproto.h +) option(BUILD_TESTS "Build tests" ON) diff --git a/common/adc_traits.h b/common/adc_traits.h index f1ac9fe..f37dc82 100644 --- a/common/adc_traits.h +++ b/common/adc_traits.h @@ -32,7 +32,8 @@ concept adc_char_range = // output range of char/const char template -concept adc_output_char_range = std::ranges::output_range; +concept adc_output_char_range = + std::ranges::output_range && std::same_as>, CharT>; // range of char/const char diff --git a/net/adc_netmessage.h b/net/adc_netmessage.h index 837d84d..393e844 100644 --- a/net/adc_netmessage.h +++ b/net/adc_netmessage.h @@ -76,7 +76,7 @@ public: if constexpr (traits::adc_input_char_range) { std::ranges::copy(v, std::back_inserter(_storageSequence.emplace_back())); } else if constexpr (traits::formattable) { - std::format_to(std::back_inserter(_storageSequence.emplace_back()), v); + std::format_to(std::back_inserter(_storageSequence.emplace_back()), "{}", v); } else { static_assert(false, "UNSUPPORTED TYPE!!!"); } @@ -133,7 +133,7 @@ public: } - template + template R> size_t bytes(R& r) { if (_outputSequence.empty()) { @@ -154,7 +154,7 @@ protected: output_seq_t _outputSequence; - AdcNetMessageInterface() : _storageSequence(), _outputSequence() {}; + AdcNetMessageInterface() : _storageSequence(), _outputSequence(){}; template AdcNetMessageInterface(const T& v, const Ts&... vs) : AdcNetMessageInterface() @@ -240,6 +240,10 @@ public: template void appendTokens(const T& v, const Ts&... vs) { + if (_storageSequence.size()) { // some tokens are already in storage + _outputSequence.emplace_back(tokenDelimiter); // add delimiter in output sequence + } + if constexpr (traits::adc_input_char_range || traits::formattable) { this->appendBytes(v); } else if constexpr (std::ranges::input_range) { @@ -254,7 +258,7 @@ public: } } else { - static_assert(false, "INVALID TYPE OF INPUT TOKENS!!!"); + static_assert(false, "UNSUPPORTED (CANNOT BE SERIALIZED TO BYTES) TYPE OF INPUT TOKENS!!!"); } if constexpr (sizeof...(Ts)) { @@ -347,13 +351,13 @@ public: protected: - void updateState() override - { - if (_outputSequence.size()) { - _outputSequence.emplace_back(tokenDelimiter); // add delimiter in output sequence - } - _outputSequence.emplace_back(_storageSequence.back()); - } + // void updateState() override + // { + // if (_outputSequence.size()) { // some tokens are already in storage + // _outputSequence.emplace_back(tokenDelimiter); // add delimiter in output sequence + // } + // _outputSequence.emplace_back(_storageSequence.back()); + // } }; @@ -404,7 +408,8 @@ public: this->_outputSequence.emplace_back(_key); if constexpr (sizeof...(ParamTs)) { - this->setTokens(params...); + this->_outputSequence.emplace_back(keyparamDelimiter); // add key-param delimiter in output sequence + this->appendTokens(params...); } } diff --git a/net/adc_netproto.h b/net/adc_netproto.h new file mode 100644 index 0000000..6f70f09 --- /dev/null +++ b/net/adc_netproto.h @@ -0,0 +1 @@ +#pragma once diff --git a/tests/adc_netmsg_test.cpp b/tests/adc_netmsg_test.cpp index 379d208..0d4be1b 100644 --- a/tests/adc_netmsg_test.cpp +++ b/tests/adc_netmsg_test.cpp @@ -39,4 +39,19 @@ TEST_CASE("[ADC NET MESSAGE]") std::cout << "MESSAGE: [" << bb << "]\n"; REQUIRE_EQ(bb, bytes); + + // msg.setKeyParam("GET", "IMAGE", std::string_view("CROP"), 4, 7, std::make_pair(10, 20)); + msg.setKeyParam("GET", "IMAGE", std::string_view("CROP"), 4, 7); + bb.clear(); + msg.bytes(bb); + + std::cout << "MSG: [" << bb << "]\n"; + key.clear(); + msg.key(key); + std::cout << "KEY: [" << key << "]\n"; + ls.clear(); + msg.params(ls, 1, 3); + for (auto& el : ls) { + std::cout << "PAR: [" << el << "]\n"; + } }