This commit is contained in:
Timur A. Fatkhullin 2024-10-03 17:17:47 +03:00
parent 3d89dd3715
commit 22e20bb52f
2 changed files with 95 additions and 15 deletions

View File

@ -13,6 +13,15 @@
namespace adc
{
namespace traits
{
template <typename T>
concept adc_has_clear_c = requires(T t) { t.clear(); };
} // namespace traits
namespace utils
{
@ -535,9 +544,80 @@ public:
template <traits::adc_output_char_range R, const char* DELIM = constants::ADC_DEFAULT_TOKEN_DELIMITER>
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<size_t>::max())
{
return tokens(start_idx, N);
}
template <typename T, typename... Ts>
auto addParts(T&& part, Ts&&... parts)
{
return addToken(std::forward<T>(part), std::forward<Ts>(parts)...);
}
auto tokens(size_t start_idx = 0, size_t N = std::numeric_limits<size_t>::max())
{
return std::views::split(_byteSequence, tokenDelimiter) | std::views::drop(start_idx) | std::views::take(N);
}
template <typename TokT, typename... TokTs>
AdcTokenMessage& addTokens(TokT&& token, TokTs&&... tokens)
{
if (std::ranges::size(_byteSequence)) {
std::ranges::copy(tokenDelimiter, std::back_inserter(_byteSequence));
}
utils::convertToBytes(_byteSequence, std::forward<TokT>(token));
if constexpr (sizeof...(TokTs)) {
addTokens(std::forward<TokTs>(tokens)...);
}
return *this;
}
template <typename TokT, typename... TokTs>
AdcTokenMessage& setTokens(TokT&& token, TokTs&&... tokens)
{
if (std::ranges::size(_byteSequence)) {
if constexpr (traits::adc_has_clear_c<R>) {
_byteSequence.clear();
} else {
_byteSequence = R();
}
}
return addTokens(std::forward<TokT>(token), std::forward<TokTs>(tokens)...);
}
protected:
R& _byteSequence;
};
template <traits::adc_output_char_range R,
const char* KEY_TOKEN_DELIM = constants::ADC_DEFAULT_KEY_TOKEN_DELIMITER,
const char* TOKEN_DELIM = constants::ADC_DEFAULT_TOKEN_DELIMITER>
class AdcKeyValueMessage
{
public:
AdcKeyValueMessage(R& byte_seq) : _byteSequence(byte_seq) {}
protected:
R& _byteSequence;
};
namespace traits
{
template <typename T>
concept adc_netmessage_c = requires {
typename T::byte_storage_t;

View File

@ -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