data_persistence_cp.hpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. /*
  2. * Copyright (c) 2017-2023 zhllxt
  3. *
  4. * author : zhllxt
  5. * email : 37792738@qq.com
  6. *
  7. * Distributed under the Boost Software License, Version 1.0. (See accompanying
  8. * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. */
  10. #ifndef __ASIO2_DATA_PERSISTENCE_COMPONENT_HPP__
  11. #define __ASIO2_DATA_PERSISTENCE_COMPONENT_HPP__
  12. #if defined(_MSC_VER) && (_MSC_VER >= 1200)
  13. #pragma once
  14. #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
  15. #include <cstdint>
  16. #include <memory>
  17. #include <utility>
  18. #include <string>
  19. #include <string_view>
  20. #include <asio2/base/iopool.hpp>
  21. #include <asio2/base/detail/util.hpp>
  22. #include <asio2/base/detail/function_traits.hpp>
  23. #include <asio2/base/detail/buffer_wrap.hpp>
  24. namespace asio2::detail
  25. {
  26. template<class derived_t, class args_t>
  27. class data_persistence_cp
  28. {
  29. public:
  30. /**
  31. * @brief constructor
  32. */
  33. data_persistence_cp() = default;
  34. /**
  35. * @brief destructor
  36. */
  37. ~data_persistence_cp() = default;
  38. protected:
  39. template<class T>
  40. inline auto _data_persistence(T&& data)
  41. {
  42. using data_type = detail::remove_cvref_t<T>;
  43. derived_t& derive = static_cast<derived_t&>(*this);
  44. // std::string_view
  45. if constexpr /**/ (detail::is_string_view_v<data_type>)
  46. {
  47. using value_type = typename data_type::value_type;
  48. return detail::call_data_filter_before_send(derive,
  49. std::basic_string<value_type>(data.data(), data.size()));
  50. }
  51. // char* , const char* , const char* const
  52. else if constexpr (detail::is_char_pointer_v<data_type>)
  53. {
  54. using value_type = typename detail::remove_cvref_t<std::remove_pointer_t<data_type>>;
  55. return detail::call_data_filter_before_send(derive,
  56. std::basic_string<value_type>(std::forward<T>(data)));
  57. }
  58. // char[]
  59. else if constexpr (detail::is_char_array_v<data_type>)
  60. {
  61. using value_type = typename detail::remove_cvref_t<std::remove_all_extents_t<data_type>>;
  62. return detail::call_data_filter_before_send(derive,
  63. std::basic_string<value_type>(std::forward<T>(data)));
  64. }
  65. // object like : std::string, std::vector
  66. else if constexpr (
  67. std::is_move_constructible_v <data_type> ||
  68. std::is_trivially_move_constructible_v<data_type> ||
  69. std::is_nothrow_move_constructible_v <data_type> ||
  70. std::is_move_assignable_v <data_type> ||
  71. std::is_trivially_move_assignable_v <data_type> ||
  72. std::is_nothrow_move_assignable_v <data_type> )
  73. {
  74. return detail::call_data_filter_before_send(derive, std::forward<T>(data));
  75. }
  76. else
  77. {
  78. // PodType (&data)[N] like : int buf[5], double buf[5]
  79. auto buffer = asio::buffer(data);
  80. return detail::call_data_filter_before_send(derive,
  81. std::string(reinterpret_cast<const std::string::value_type*>(
  82. const_cast<const void*>(buffer.data())), buffer.size()));
  83. }
  84. }
  85. template<class CharT, class SizeT>
  86. inline auto _data_persistence(CharT * s, SizeT count)
  87. {
  88. using value_type = typename detail::remove_cvref_t<CharT>;
  89. derived_t& derive = static_cast<derived_t&>(*this);
  90. if (!s)
  91. {
  92. return std::basic_string<value_type>{};
  93. }
  94. return detail::call_data_filter_before_send(derive,
  95. std::basic_string<value_type>(s, std::size_t(count)));
  96. }
  97. template<typename = void>
  98. inline auto _data_persistence(asio::const_buffer& data) noexcept
  99. {
  100. derived_t& derive = static_cast<derived_t&>(*this);
  101. return detail::call_data_filter_before_send(derive,
  102. derive._data_persistence(asio::const_buffer(data)));
  103. }
  104. template<typename = void>
  105. inline auto _data_persistence(const asio::const_buffer& data) noexcept
  106. {
  107. derived_t& derive = static_cast<derived_t&>(*this);
  108. return detail::call_data_filter_before_send(derive,
  109. derive._data_persistence(asio::const_buffer(data)));
  110. }
  111. template<typename = void>
  112. inline auto _data_persistence(asio::const_buffer&& data) noexcept
  113. {
  114. derived_t& derive = static_cast<derived_t&>(*this);
  115. // "data" is rvalue reference, should use std::move()
  116. return detail::call_data_filter_before_send(derive, std::move(data));
  117. }
  118. template<typename = void>
  119. inline auto _data_persistence(asio::mutable_buffer& data) noexcept
  120. {
  121. derived_t& derive = static_cast<derived_t&>(*this);
  122. return detail::call_data_filter_before_send(derive,
  123. derive._data_persistence(asio::const_buffer(data)));
  124. }
  125. template<typename = void>
  126. inline auto _data_persistence(const asio::mutable_buffer& data) noexcept
  127. {
  128. derived_t& derive = static_cast<derived_t&>(*this);
  129. return detail::call_data_filter_before_send(derive,
  130. derive._data_persistence(asio::const_buffer(data)));
  131. }
  132. template<typename = void>
  133. inline auto _data_persistence(asio::mutable_buffer&& data) noexcept
  134. {
  135. derived_t& derive = static_cast<derived_t&>(*this);
  136. return detail::call_data_filter_before_send(derive,
  137. derive._data_persistence(asio::const_buffer(std::move(data))));
  138. }
  139. #if !defined(ASIO_NO_DEPRECATED) && !defined(BOOST_ASIO_NO_DEPRECATED)
  140. template<typename = void>
  141. inline auto _data_persistence(asio::const_buffers_1& data) noexcept
  142. {
  143. derived_t& derive = static_cast<derived_t&>(*this);
  144. return detail::call_data_filter_before_send(derive,
  145. derive._data_persistence(asio::const_buffer(data)));
  146. }
  147. template<typename = void>
  148. inline auto _data_persistence(const asio::const_buffers_1& data) noexcept
  149. {
  150. derived_t& derive = static_cast<derived_t&>(*this);
  151. return detail::call_data_filter_before_send(derive,
  152. derive._data_persistence(asio::const_buffer(data)));
  153. }
  154. template<typename = void>
  155. inline auto _data_persistence(asio::const_buffers_1&& data) noexcept
  156. {
  157. derived_t& derive = static_cast<derived_t&>(*this);
  158. return detail::call_data_filter_before_send(derive,
  159. derive._data_persistence(asio::const_buffer(std::move(data))));
  160. }
  161. template<typename = void>
  162. inline auto _data_persistence(asio::mutable_buffers_1& data) noexcept
  163. {
  164. derived_t& derive = static_cast<derived_t&>(*this);
  165. return detail::call_data_filter_before_send(derive,
  166. derive._data_persistence(asio::const_buffer(data)));
  167. }
  168. template<typename = void>
  169. inline auto _data_persistence(const asio::mutable_buffers_1& data) noexcept
  170. {
  171. derived_t& derive = static_cast<derived_t&>(*this);
  172. return detail::call_data_filter_before_send(derive,
  173. derive._data_persistence(asio::const_buffer(data)));
  174. }
  175. template<typename = void>
  176. inline auto _data_persistence(asio::mutable_buffers_1&& data) noexcept
  177. {
  178. derived_t& derive = static_cast<derived_t&>(*this);
  179. return detail::call_data_filter_before_send(derive,
  180. derive._data_persistence(asio::const_buffer(std::move(data))));
  181. }
  182. #endif
  183. protected:
  184. };
  185. }
  186. #endif // !__ASIO2_DATA_PERSISTENCE_COMPONENT_HPP__