9 #include <boost/asio/buffer.hpp> 10 #include "base/pod_array.h" 15 inline mutable_buffer buffer(base::PODArray<uint8_t>& arr) noexcept {
16 return mutable_buffer(arr.data(), arr.size());
19 inline const_buffer buffer(
const base::PODArray<uint8_t>& arr) noexcept {
20 return const_buffer(arr.data(), arr.size());
23 inline mutable_buffer* buffer_sequence_begin(mutable_buffer& b) {
28 inline const_buffer* buffer_sequence_begin(const_buffer& b) {
32 inline mutable_buffer* buffer_sequence_end(mutable_buffer& b) {
37 inline const_buffer* buffer_sequence_end(const_buffer& b) {
49 template <
typename... T>
50 constexpr
auto _MakeCommonBuf(T&&... values) ->
51 typename std::common_type<decltype(::boost::asio::buffer(values))...>::type;
53 template <
typename BufferSequence>
55 using raw_it_t = decltype(::boost::asio::buffer_sequence_begin(*static_cast<BufferSequence*>(0)));
57 std::conditional_t<std::is_pointer<raw_it_t>::value,
58 std::add_pointer_t<std::remove_const_t<std::remove_pointer_t<raw_it_t>>>,
62 static_assert(std::is_same<
typename BufferSequenceTraits<::boost::asio::mutable_buffer>::iterator,
63 ::boost::asio::mutable_buffer*>::value,
69 ::std::vector<::boost::asio::mutable_buffer>::iterator>::value,
72 template <
typename It>
77 Range() : b_(), e_() {
79 Range(It b, It e) : b_(b), e_(e) {
82 It begin()
const noexcept {
85 It end()
const noexcept {
96 template <
typename BufferSequence>
102 #pragma clang diagnostic push 103 #pragma clang diagnostic ignored "-Wmissing-braces" 106 template <
typename... T>
107 constexpr
auto make_buffer_seq(T&&... values)
108 -> std::array<decltype(detail::_MakeCommonBuf(values...)),
sizeof...(T)> {
109 return {::boost::asio::buffer(values)...};
113 constexpr std::array<::boost::asio::mutable_buffer, N + 1> make_buffer_seq(
114 const std::array<::boost::asio::mutable_buffer, N>& arr,
115 const ::boost::asio::mutable_buffer& mbuf) {
116 std::array<::boost::asio::mutable_buffer, N + 1> res;
117 std::copy(arr.begin(), arr.end(), res.begin());
122 template <
typename It>
123 std::vector<typename std::iterator_traits<It>::value_type> make_buffer_seq(
124 const detail::Range<It>& slice,
const typename std::iterator_traits<It>::value_type& mbuf) {
125 using value_type =
typename std::iterator_traits<It>::value_type;
126 static_assert(!std::is_const<value_type>::value,
"");
128 std::vector<value_type> res(slice.size() + 1);
129 std::copy(slice.begin(), slice.end(), res.begin());
134 template <
typename BufferSequence>
135 detail::BufferRange<BufferSequence> StripSequence(
size_t size, BufferSequence* arg) {
136 using Range = detail::BufferRange<BufferSequence>;
137 using namespace boost::asio;
139 auto b = buffer_sequence_begin(*arg);
140 auto e = buffer_sequence_end(*arg);
145 for (; b != e; ++b) {
146 if (b->size() > size) {
157 #pragma clang diagnostic pop