/* * Copyright (c) 2017-2023 zhllxt * * author : zhllxt * email : 37792738@qq.com * * Distributed under the Boost Software License, Version 1.0. (See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) */ #ifndef __ASIO2_DATA_PERSISTENCE_COMPONENT_HPP__ #define __ASIO2_DATA_PERSISTENCE_COMPONENT_HPP__ #if defined(_MSC_VER) && (_MSC_VER >= 1200) #pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include #include #include #include #include #include #include #include #include namespace asio2::detail { template class data_persistence_cp { public: /** * @brief constructor */ data_persistence_cp() = default; /** * @brief destructor */ ~data_persistence_cp() = default; protected: template inline auto _data_persistence(T&& data) { using data_type = detail::remove_cvref_t; derived_t& derive = static_cast(*this); // std::string_view if constexpr /**/ (detail::is_string_view_v) { using value_type = typename data_type::value_type; return detail::call_data_filter_before_send(derive, std::basic_string(data.data(), data.size())); } // char* , const char* , const char* const else if constexpr (detail::is_char_pointer_v) { using value_type = typename detail::remove_cvref_t>; return detail::call_data_filter_before_send(derive, std::basic_string(std::forward(data))); } // char[] else if constexpr (detail::is_char_array_v) { using value_type = typename detail::remove_cvref_t>; return detail::call_data_filter_before_send(derive, std::basic_string(std::forward(data))); } // object like : std::string, std::vector else if constexpr ( std::is_move_constructible_v || std::is_trivially_move_constructible_v || std::is_nothrow_move_constructible_v || std::is_move_assignable_v || std::is_trivially_move_assignable_v || std::is_nothrow_move_assignable_v ) { return detail::call_data_filter_before_send(derive, std::forward(data)); } else { // PodType (&data)[N] like : int buf[5], double buf[5] auto buffer = asio::buffer(data); return detail::call_data_filter_before_send(derive, std::string(reinterpret_cast( const_cast(buffer.data())), buffer.size())); } } template inline auto _data_persistence(CharT * s, SizeT count) { using value_type = typename detail::remove_cvref_t; derived_t& derive = static_cast(*this); if (!s) { return std::basic_string{}; } return detail::call_data_filter_before_send(derive, std::basic_string(s, std::size_t(count))); } template inline auto _data_persistence(asio::const_buffer& data) noexcept { derived_t& derive = static_cast(*this); return detail::call_data_filter_before_send(derive, derive._data_persistence(asio::const_buffer(data))); } template inline auto _data_persistence(const asio::const_buffer& data) noexcept { derived_t& derive = static_cast(*this); return detail::call_data_filter_before_send(derive, derive._data_persistence(asio::const_buffer(data))); } template inline auto _data_persistence(asio::const_buffer&& data) noexcept { derived_t& derive = static_cast(*this); // "data" is rvalue reference, should use std::move() return detail::call_data_filter_before_send(derive, std::move(data)); } template inline auto _data_persistence(asio::mutable_buffer& data) noexcept { derived_t& derive = static_cast(*this); return detail::call_data_filter_before_send(derive, derive._data_persistence(asio::const_buffer(data))); } template inline auto _data_persistence(const asio::mutable_buffer& data) noexcept { derived_t& derive = static_cast(*this); return detail::call_data_filter_before_send(derive, derive._data_persistence(asio::const_buffer(data))); } template inline auto _data_persistence(asio::mutable_buffer&& data) noexcept { derived_t& derive = static_cast(*this); return detail::call_data_filter_before_send(derive, derive._data_persistence(asio::const_buffer(std::move(data)))); } #if !defined(ASIO_NO_DEPRECATED) && !defined(BOOST_ASIO_NO_DEPRECATED) template inline auto _data_persistence(asio::const_buffers_1& data) noexcept { derived_t& derive = static_cast(*this); return detail::call_data_filter_before_send(derive, derive._data_persistence(asio::const_buffer(data))); } template inline auto _data_persistence(const asio::const_buffers_1& data) noexcept { derived_t& derive = static_cast(*this); return detail::call_data_filter_before_send(derive, derive._data_persistence(asio::const_buffer(data))); } template inline auto _data_persistence(asio::const_buffers_1&& data) noexcept { derived_t& derive = static_cast(*this); return detail::call_data_filter_before_send(derive, derive._data_persistence(asio::const_buffer(std::move(data)))); } template inline auto _data_persistence(asio::mutable_buffers_1& data) noexcept { derived_t& derive = static_cast(*this); return detail::call_data_filter_before_send(derive, derive._data_persistence(asio::const_buffer(data))); } template inline auto _data_persistence(const asio::mutable_buffers_1& data) noexcept { derived_t& derive = static_cast(*this); return detail::call_data_filter_before_send(derive, derive._data_persistence(asio::const_buffer(data))); } template inline auto _data_persistence(asio::mutable_buffers_1&& data) noexcept { derived_t& derive = static_cast(*this); return detail::call_data_filter_before_send(derive, derive._data_persistence(asio::const_buffer(std::move(data)))); } #endif protected: }; } #endif // !__ASIO2_DATA_PERSISTENCE_COMPONENT_HPP__