From 22e20bb52f3066551a26eb90469f341cbe90cbc1 Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Thu, 3 Oct 2024 17:17:47 +0300 Subject: [PATCH] ... --- net/adc_netmsg.h | 82 +++++++++++++++++++++++++++++++++- net/asio/adc_netservice_asio.h | 28 ++++++------ 2 files changed, 95 insertions(+), 15 deletions(-) diff --git a/net/adc_netmsg.h b/net/adc_netmsg.h index 1ce2b58..d7676d0 100644 --- a/net/adc_netmsg.h +++ b/net/adc_netmsg.h @@ -13,6 +13,15 @@ namespace adc { +namespace traits +{ + +template +concept adc_has_clear_c = requires(T t) { t.clear(); }; + +} // namespace traits + + namespace utils { @@ -535,9 +544,80 @@ public: +template +class AdcTokenMessage +{ +public: + static constexpr std::span tokenDelimiter{DELIM, sizeof(DELIM) - 1}; // "-1" to remove trailing '\0' + + AdcTokenMessage(R& byte_seq) : _byteSequence(byte_seq) {} + + auto parts(size_t start_idx = 0, size_t N = std::numeric_limits::max()) + { + return tokens(start_idx, N); + } + + template + auto addParts(T&& part, Ts&&... parts) + { + return addToken(std::forward(part), std::forward(parts)...); + } + + auto tokens(size_t start_idx = 0, size_t N = std::numeric_limits::max()) + { + return std::views::split(_byteSequence, tokenDelimiter) | std::views::drop(start_idx) | std::views::take(N); + } + + template + AdcTokenMessage& addTokens(TokT&& token, TokTs&&... tokens) + { + if (std::ranges::size(_byteSequence)) { + std::ranges::copy(tokenDelimiter, std::back_inserter(_byteSequence)); + } + + utils::convertToBytes(_byteSequence, std::forward(token)); + + if constexpr (sizeof...(TokTs)) { + addTokens(std::forward(tokens)...); + } + + return *this; + } + + template + AdcTokenMessage& setTokens(TokT&& token, TokTs&&... tokens) + { + if (std::ranges::size(_byteSequence)) { + if constexpr (traits::adc_has_clear_c) { + _byteSequence.clear(); + } else { + _byteSequence = R(); + } + } + + return addTokens(std::forward(token), std::forward(tokens)...); + } + +protected: + R& _byteSequence; +}; + + +template +class AdcKeyValueMessage +{ +public: + AdcKeyValueMessage(R& byte_seq) : _byteSequence(byte_seq) {} + +protected: + R& _byteSequence; +}; + + namespace traits { - template concept adc_netmessage_c = requires { typename T::byte_storage_t; diff --git a/net/asio/adc_netservice_asio.h b/net/asio/adc_netservice_asio.h index 9d6054d..344edb9 100644 --- a/net/asio/adc_netservice_asio.h +++ b/net/asio/adc_netservice_asio.h @@ -303,24 +303,24 @@ public: AdcNetServiceASIOBase& operator=(const AdcNetServiceASIOBase&) = delete; - AdcNetServiceASIOBase& operator=(AdcNetServiceASIOBase&& other) - { - if (this != &other) { - close(); - _streamBuffer.consume(_streamBuffer.size()); + AdcNetServiceASIOBase& operator=(AdcNetServiceASIOBase&& other) = delete; + // { + // if (this != &other) { + // close(); + // _streamBuffer.consume(_streamBuffer.size()); - auto bytes = - asio::buffer_copy(_streamBuffer.prepare(other._streamBuffer.size()), other._streamBuffer.data()); - _streamBuffer.commit(bytes); + // auto bytes = + // asio::buffer_copy(_streamBuffer.prepare(other._streamBuffer.size()), other._streamBuffer.data()); + // _streamBuffer.commit(bytes); - _ioContext = other._ioContext; - _receiveStrand = std::move(other._receiveStrand), _socket = std::move(other._socket); + // _ioContext = other._ioContext; + // _receiveStrand = std::move(other._receiveStrand), _socket = std::move(other._socket); - _receiveQueue = other._receiveQueue; - } + // _receiveQueue = other._receiveQueue; + // } - return *this; - } + // return *this; + // } constexpr netservice_ident_t ident() const