1*c33452fbSAndroid Build Coastguard Worker //
2*c33452fbSAndroid Build Coastguard Worker // buffer.hpp
3*c33452fbSAndroid Build Coastguard Worker // ~~~~~~~~~~
4*c33452fbSAndroid Build Coastguard Worker //
5*c33452fbSAndroid Build Coastguard Worker // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6*c33452fbSAndroid Build Coastguard Worker //
7*c33452fbSAndroid Build Coastguard Worker // Distributed under the Boost Software License, Version 1.0. (See accompanying
8*c33452fbSAndroid Build Coastguard Worker // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9*c33452fbSAndroid Build Coastguard Worker //
10*c33452fbSAndroid Build Coastguard Worker
11*c33452fbSAndroid Build Coastguard Worker #ifndef ASIO_BUFFER_HPP
12*c33452fbSAndroid Build Coastguard Worker #define ASIO_BUFFER_HPP
13*c33452fbSAndroid Build Coastguard Worker
14*c33452fbSAndroid Build Coastguard Worker
15*c33452fbSAndroid Build Coastguard Worker #include "asio/detail/config.hpp"
16*c33452fbSAndroid Build Coastguard Worker #include <cstddef>
17*c33452fbSAndroid Build Coastguard Worker #include <cstring>
18*c33452fbSAndroid Build Coastguard Worker #include <string>
19*c33452fbSAndroid Build Coastguard Worker #include <vector>
20*c33452fbSAndroid Build Coastguard Worker #include "asio/detail/array_fwd.hpp"
21*c33452fbSAndroid Build Coastguard Worker
22*c33452fbSAndroid Build Coastguard Worker
23*c33452fbSAndroid Build Coastguard Worker #if defined(__GNUC__)
24*c33452fbSAndroid Build Coastguard Worker # if defined(_GLIBCXX_DEBUG)
25*c33452fbSAndroid Build Coastguard Worker # endif // defined(_GLIBCXX_DEBUG)
26*c33452fbSAndroid Build Coastguard Worker #endif // defined(__GNUC__)
27*c33452fbSAndroid Build Coastguard Worker
28*c33452fbSAndroid Build Coastguard Worker
29*c33452fbSAndroid Build Coastguard Worker
30*c33452fbSAndroid Build Coastguard Worker #if defined(ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND)
31*c33452fbSAndroid Build Coastguard Worker # include "asio/detail/type_traits.hpp"
32*c33452fbSAndroid Build Coastguard Worker #endif // defined(ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND)
33*c33452fbSAndroid Build Coastguard Worker
34*c33452fbSAndroid Build Coastguard Worker #include "asio/detail/push_options.hpp"
35*c33452fbSAndroid Build Coastguard Worker
36*c33452fbSAndroid Build Coastguard Worker namespace asio {
37*c33452fbSAndroid Build Coastguard Worker
38*c33452fbSAndroid Build Coastguard Worker class mutable_buffer;
39*c33452fbSAndroid Build Coastguard Worker class const_buffer;
40*c33452fbSAndroid Build Coastguard Worker
41*c33452fbSAndroid Build Coastguard Worker namespace detail {
42*c33452fbSAndroid Build Coastguard Worker void* buffer_cast_helper(const mutable_buffer&);
43*c33452fbSAndroid Build Coastguard Worker const void* buffer_cast_helper(const const_buffer&);
44*c33452fbSAndroid Build Coastguard Worker std::size_t buffer_size_helper(const mutable_buffer&);
45*c33452fbSAndroid Build Coastguard Worker std::size_t buffer_size_helper(const const_buffer&);
46*c33452fbSAndroid Build Coastguard Worker } // namespace detail
47*c33452fbSAndroid Build Coastguard Worker
48*c33452fbSAndroid Build Coastguard Worker /// Holds a buffer that can be modified.
49*c33452fbSAndroid Build Coastguard Worker /**
50*c33452fbSAndroid Build Coastguard Worker * The mutable_buffer class provides a safe representation of a buffer that can
51*c33452fbSAndroid Build Coastguard Worker * be modified. It does not own the underlying data, and so is cheap to copy or
52*c33452fbSAndroid Build Coastguard Worker * assign.
53*c33452fbSAndroid Build Coastguard Worker *
54*c33452fbSAndroid Build Coastguard Worker * @par Accessing Buffer Contents
55*c33452fbSAndroid Build Coastguard Worker *
56*c33452fbSAndroid Build Coastguard Worker * The contents of a buffer may be accessed using the @ref buffer_size
57*c33452fbSAndroid Build Coastguard Worker * and @ref buffer_cast functions:
58*c33452fbSAndroid Build Coastguard Worker *
59*c33452fbSAndroid Build Coastguard Worker * @code asio::mutable_buffer b1 = ...;
60*c33452fbSAndroid Build Coastguard Worker * std::size_t s1 = asio::buffer_size(b1);
61*c33452fbSAndroid Build Coastguard Worker * unsigned char* p1 = asio::buffer_cast<unsigned char*>(b1);
62*c33452fbSAndroid Build Coastguard Worker * @endcode
63*c33452fbSAndroid Build Coastguard Worker *
64*c33452fbSAndroid Build Coastguard Worker * The asio::buffer_cast function permits violations of type safety, so
65*c33452fbSAndroid Build Coastguard Worker * uses of it in application code should be carefully considered.
66*c33452fbSAndroid Build Coastguard Worker */
67*c33452fbSAndroid Build Coastguard Worker class mutable_buffer
68*c33452fbSAndroid Build Coastguard Worker {
69*c33452fbSAndroid Build Coastguard Worker public:
70*c33452fbSAndroid Build Coastguard Worker /// Construct an empty buffer.
mutable_buffer()71*c33452fbSAndroid Build Coastguard Worker mutable_buffer()
72*c33452fbSAndroid Build Coastguard Worker : data_(0),
73*c33452fbSAndroid Build Coastguard Worker size_(0)
74*c33452fbSAndroid Build Coastguard Worker {
75*c33452fbSAndroid Build Coastguard Worker }
76*c33452fbSAndroid Build Coastguard Worker
77*c33452fbSAndroid Build Coastguard Worker /// Construct a buffer to represent a given memory range.
mutable_buffer(void * data,std::size_t size)78*c33452fbSAndroid Build Coastguard Worker mutable_buffer(void* data, std::size_t size)
79*c33452fbSAndroid Build Coastguard Worker : data_(data),
80*c33452fbSAndroid Build Coastguard Worker size_(size)
81*c33452fbSAndroid Build Coastguard Worker {
82*c33452fbSAndroid Build Coastguard Worker }
83*c33452fbSAndroid Build Coastguard Worker
84*c33452fbSAndroid Build Coastguard Worker
85*c33452fbSAndroid Build Coastguard Worker private:
86*c33452fbSAndroid Build Coastguard Worker friend void* asio::detail::buffer_cast_helper(
87*c33452fbSAndroid Build Coastguard Worker const mutable_buffer& b);
88*c33452fbSAndroid Build Coastguard Worker friend std::size_t asio::detail::buffer_size_helper(
89*c33452fbSAndroid Build Coastguard Worker const mutable_buffer& b);
90*c33452fbSAndroid Build Coastguard Worker
91*c33452fbSAndroid Build Coastguard Worker void* data_;
92*c33452fbSAndroid Build Coastguard Worker std::size_t size_;
93*c33452fbSAndroid Build Coastguard Worker
94*c33452fbSAndroid Build Coastguard Worker };
95*c33452fbSAndroid Build Coastguard Worker
96*c33452fbSAndroid Build Coastguard Worker namespace detail {
97*c33452fbSAndroid Build Coastguard Worker
buffer_cast_helper(const mutable_buffer & b)98*c33452fbSAndroid Build Coastguard Worker inline void* buffer_cast_helper(const mutable_buffer& b)
99*c33452fbSAndroid Build Coastguard Worker {
100*c33452fbSAndroid Build Coastguard Worker return b.data_;
101*c33452fbSAndroid Build Coastguard Worker }
102*c33452fbSAndroid Build Coastguard Worker
buffer_size_helper(const mutable_buffer & b)103*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_size_helper(const mutable_buffer& b)
104*c33452fbSAndroid Build Coastguard Worker {
105*c33452fbSAndroid Build Coastguard Worker return b.size_;
106*c33452fbSAndroid Build Coastguard Worker }
107*c33452fbSAndroid Build Coastguard Worker
108*c33452fbSAndroid Build Coastguard Worker } // namespace detail
109*c33452fbSAndroid Build Coastguard Worker
110*c33452fbSAndroid Build Coastguard Worker /// Adapts a single modifiable buffer so that it meets the requirements of the
111*c33452fbSAndroid Build Coastguard Worker /// MutableBufferSequence concept.
112*c33452fbSAndroid Build Coastguard Worker class mutable_buffers_1
113*c33452fbSAndroid Build Coastguard Worker : public mutable_buffer
114*c33452fbSAndroid Build Coastguard Worker {
115*c33452fbSAndroid Build Coastguard Worker public:
116*c33452fbSAndroid Build Coastguard Worker /// The type for each element in the list of buffers.
117*c33452fbSAndroid Build Coastguard Worker typedef mutable_buffer value_type;
118*c33452fbSAndroid Build Coastguard Worker
119*c33452fbSAndroid Build Coastguard Worker /// A random-access iterator type that may be used to read elements.
120*c33452fbSAndroid Build Coastguard Worker typedef const mutable_buffer* const_iterator;
121*c33452fbSAndroid Build Coastguard Worker
122*c33452fbSAndroid Build Coastguard Worker /// Construct to represent a given memory range.
mutable_buffers_1(void * data,std::size_t size)123*c33452fbSAndroid Build Coastguard Worker mutable_buffers_1(void* data, std::size_t size)
124*c33452fbSAndroid Build Coastguard Worker : mutable_buffer(data, size)
125*c33452fbSAndroid Build Coastguard Worker {
126*c33452fbSAndroid Build Coastguard Worker }
127*c33452fbSAndroid Build Coastguard Worker
128*c33452fbSAndroid Build Coastguard Worker /// Construct to represent a single modifiable buffer.
mutable_buffers_1(const mutable_buffer & b)129*c33452fbSAndroid Build Coastguard Worker explicit mutable_buffers_1(const mutable_buffer& b)
130*c33452fbSAndroid Build Coastguard Worker : mutable_buffer(b)
131*c33452fbSAndroid Build Coastguard Worker {
132*c33452fbSAndroid Build Coastguard Worker }
133*c33452fbSAndroid Build Coastguard Worker
134*c33452fbSAndroid Build Coastguard Worker /// Get a random-access iterator to the first element.
begin() const135*c33452fbSAndroid Build Coastguard Worker const_iterator begin() const
136*c33452fbSAndroid Build Coastguard Worker {
137*c33452fbSAndroid Build Coastguard Worker return this;
138*c33452fbSAndroid Build Coastguard Worker }
139*c33452fbSAndroid Build Coastguard Worker
140*c33452fbSAndroid Build Coastguard Worker /// Get a random-access iterator for one past the last element.
end() const141*c33452fbSAndroid Build Coastguard Worker const_iterator end() const
142*c33452fbSAndroid Build Coastguard Worker {
143*c33452fbSAndroid Build Coastguard Worker return begin() + 1;
144*c33452fbSAndroid Build Coastguard Worker }
145*c33452fbSAndroid Build Coastguard Worker };
146*c33452fbSAndroid Build Coastguard Worker
147*c33452fbSAndroid Build Coastguard Worker /// Holds a buffer that cannot be modified.
148*c33452fbSAndroid Build Coastguard Worker /**
149*c33452fbSAndroid Build Coastguard Worker * The const_buffer class provides a safe representation of a buffer that cannot
150*c33452fbSAndroid Build Coastguard Worker * be modified. It does not own the underlying data, and so is cheap to copy or
151*c33452fbSAndroid Build Coastguard Worker * assign.
152*c33452fbSAndroid Build Coastguard Worker *
153*c33452fbSAndroid Build Coastguard Worker * @par Accessing Buffer Contents
154*c33452fbSAndroid Build Coastguard Worker *
155*c33452fbSAndroid Build Coastguard Worker * The contents of a buffer may be accessed using the @ref buffer_size
156*c33452fbSAndroid Build Coastguard Worker * and @ref buffer_cast functions:
157*c33452fbSAndroid Build Coastguard Worker *
158*c33452fbSAndroid Build Coastguard Worker * @code asio::const_buffer b1 = ...;
159*c33452fbSAndroid Build Coastguard Worker * std::size_t s1 = asio::buffer_size(b1);
160*c33452fbSAndroid Build Coastguard Worker * const unsigned char* p1 = asio::buffer_cast<const unsigned char*>(b1);
161*c33452fbSAndroid Build Coastguard Worker * @endcode
162*c33452fbSAndroid Build Coastguard Worker *
163*c33452fbSAndroid Build Coastguard Worker * The asio::buffer_cast function permits violations of type safety, so
164*c33452fbSAndroid Build Coastguard Worker * uses of it in application code should be carefully considered.
165*c33452fbSAndroid Build Coastguard Worker */
166*c33452fbSAndroid Build Coastguard Worker class const_buffer
167*c33452fbSAndroid Build Coastguard Worker {
168*c33452fbSAndroid Build Coastguard Worker public:
169*c33452fbSAndroid Build Coastguard Worker /// Construct an empty buffer.
const_buffer()170*c33452fbSAndroid Build Coastguard Worker const_buffer()
171*c33452fbSAndroid Build Coastguard Worker : data_(0),
172*c33452fbSAndroid Build Coastguard Worker size_(0)
173*c33452fbSAndroid Build Coastguard Worker {
174*c33452fbSAndroid Build Coastguard Worker }
175*c33452fbSAndroid Build Coastguard Worker
176*c33452fbSAndroid Build Coastguard Worker /// Construct a buffer to represent a given memory range.
const_buffer(const void * data,std::size_t size)177*c33452fbSAndroid Build Coastguard Worker const_buffer(const void* data, std::size_t size)
178*c33452fbSAndroid Build Coastguard Worker : data_(data),
179*c33452fbSAndroid Build Coastguard Worker size_(size)
180*c33452fbSAndroid Build Coastguard Worker {
181*c33452fbSAndroid Build Coastguard Worker }
182*c33452fbSAndroid Build Coastguard Worker
183*c33452fbSAndroid Build Coastguard Worker /// Construct a non-modifiable buffer from a modifiable one.
const_buffer(const mutable_buffer & b)184*c33452fbSAndroid Build Coastguard Worker const_buffer(const mutable_buffer& b)
185*c33452fbSAndroid Build Coastguard Worker : data_(asio::detail::buffer_cast_helper(b)),
186*c33452fbSAndroid Build Coastguard Worker size_(asio::detail::buffer_size_helper(b))
187*c33452fbSAndroid Build Coastguard Worker {
188*c33452fbSAndroid Build Coastguard Worker }
189*c33452fbSAndroid Build Coastguard Worker
190*c33452fbSAndroid Build Coastguard Worker
191*c33452fbSAndroid Build Coastguard Worker private:
192*c33452fbSAndroid Build Coastguard Worker friend const void* asio::detail::buffer_cast_helper(
193*c33452fbSAndroid Build Coastguard Worker const const_buffer& b);
194*c33452fbSAndroid Build Coastguard Worker friend std::size_t asio::detail::buffer_size_helper(
195*c33452fbSAndroid Build Coastguard Worker const const_buffer& b);
196*c33452fbSAndroid Build Coastguard Worker
197*c33452fbSAndroid Build Coastguard Worker const void* data_;
198*c33452fbSAndroid Build Coastguard Worker std::size_t size_;
199*c33452fbSAndroid Build Coastguard Worker
200*c33452fbSAndroid Build Coastguard Worker };
201*c33452fbSAndroid Build Coastguard Worker
202*c33452fbSAndroid Build Coastguard Worker namespace detail {
203*c33452fbSAndroid Build Coastguard Worker
buffer_cast_helper(const const_buffer & b)204*c33452fbSAndroid Build Coastguard Worker inline const void* buffer_cast_helper(const const_buffer& b)
205*c33452fbSAndroid Build Coastguard Worker {
206*c33452fbSAndroid Build Coastguard Worker return b.data_;
207*c33452fbSAndroid Build Coastguard Worker }
208*c33452fbSAndroid Build Coastguard Worker
buffer_size_helper(const const_buffer & b)209*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_size_helper(const const_buffer& b)
210*c33452fbSAndroid Build Coastguard Worker {
211*c33452fbSAndroid Build Coastguard Worker return b.size_;
212*c33452fbSAndroid Build Coastguard Worker }
213*c33452fbSAndroid Build Coastguard Worker
214*c33452fbSAndroid Build Coastguard Worker } // namespace detail
215*c33452fbSAndroid Build Coastguard Worker
216*c33452fbSAndroid Build Coastguard Worker /// Adapts a single non-modifiable buffer so that it meets the requirements of
217*c33452fbSAndroid Build Coastguard Worker /// the ConstBufferSequence concept.
218*c33452fbSAndroid Build Coastguard Worker class const_buffers_1
219*c33452fbSAndroid Build Coastguard Worker : public const_buffer
220*c33452fbSAndroid Build Coastguard Worker {
221*c33452fbSAndroid Build Coastguard Worker public:
222*c33452fbSAndroid Build Coastguard Worker /// The type for each element in the list of buffers.
223*c33452fbSAndroid Build Coastguard Worker typedef const_buffer value_type;
224*c33452fbSAndroid Build Coastguard Worker
225*c33452fbSAndroid Build Coastguard Worker /// A random-access iterator type that may be used to read elements.
226*c33452fbSAndroid Build Coastguard Worker typedef const const_buffer* const_iterator;
227*c33452fbSAndroid Build Coastguard Worker
228*c33452fbSAndroid Build Coastguard Worker /// Construct to represent a given memory range.
const_buffers_1(const void * data,std::size_t size)229*c33452fbSAndroid Build Coastguard Worker const_buffers_1(const void* data, std::size_t size)
230*c33452fbSAndroid Build Coastguard Worker : const_buffer(data, size)
231*c33452fbSAndroid Build Coastguard Worker {
232*c33452fbSAndroid Build Coastguard Worker }
233*c33452fbSAndroid Build Coastguard Worker
234*c33452fbSAndroid Build Coastguard Worker /// Construct to represent a single non-modifiable buffer.
const_buffers_1(const const_buffer & b)235*c33452fbSAndroid Build Coastguard Worker explicit const_buffers_1(const const_buffer& b)
236*c33452fbSAndroid Build Coastguard Worker : const_buffer(b)
237*c33452fbSAndroid Build Coastguard Worker {
238*c33452fbSAndroid Build Coastguard Worker }
239*c33452fbSAndroid Build Coastguard Worker
240*c33452fbSAndroid Build Coastguard Worker /// Get a random-access iterator to the first element.
begin() const241*c33452fbSAndroid Build Coastguard Worker const_iterator begin() const
242*c33452fbSAndroid Build Coastguard Worker {
243*c33452fbSAndroid Build Coastguard Worker return this;
244*c33452fbSAndroid Build Coastguard Worker }
245*c33452fbSAndroid Build Coastguard Worker
246*c33452fbSAndroid Build Coastguard Worker /// Get a random-access iterator for one past the last element.
end() const247*c33452fbSAndroid Build Coastguard Worker const_iterator end() const
248*c33452fbSAndroid Build Coastguard Worker {
249*c33452fbSAndroid Build Coastguard Worker return begin() + 1;
250*c33452fbSAndroid Build Coastguard Worker }
251*c33452fbSAndroid Build Coastguard Worker };
252*c33452fbSAndroid Build Coastguard Worker
253*c33452fbSAndroid Build Coastguard Worker /// An implementation of both the ConstBufferSequence and MutableBufferSequence
254*c33452fbSAndroid Build Coastguard Worker /// concepts to represent a null buffer sequence.
255*c33452fbSAndroid Build Coastguard Worker class null_buffers
256*c33452fbSAndroid Build Coastguard Worker {
257*c33452fbSAndroid Build Coastguard Worker public:
258*c33452fbSAndroid Build Coastguard Worker /// The type for each element in the list of buffers.
259*c33452fbSAndroid Build Coastguard Worker typedef mutable_buffer value_type;
260*c33452fbSAndroid Build Coastguard Worker
261*c33452fbSAndroid Build Coastguard Worker /// A random-access iterator type that may be used to read elements.
262*c33452fbSAndroid Build Coastguard Worker typedef const mutable_buffer* const_iterator;
263*c33452fbSAndroid Build Coastguard Worker
264*c33452fbSAndroid Build Coastguard Worker /// Get a random-access iterator to the first element.
begin() const265*c33452fbSAndroid Build Coastguard Worker const_iterator begin() const
266*c33452fbSAndroid Build Coastguard Worker {
267*c33452fbSAndroid Build Coastguard Worker return &buf_;
268*c33452fbSAndroid Build Coastguard Worker }
269*c33452fbSAndroid Build Coastguard Worker
270*c33452fbSAndroid Build Coastguard Worker /// Get a random-access iterator for one past the last element.
end() const271*c33452fbSAndroid Build Coastguard Worker const_iterator end() const
272*c33452fbSAndroid Build Coastguard Worker {
273*c33452fbSAndroid Build Coastguard Worker return &buf_;
274*c33452fbSAndroid Build Coastguard Worker }
275*c33452fbSAndroid Build Coastguard Worker
276*c33452fbSAndroid Build Coastguard Worker private:
277*c33452fbSAndroid Build Coastguard Worker mutable_buffer buf_;
278*c33452fbSAndroid Build Coastguard Worker };
279*c33452fbSAndroid Build Coastguard Worker
280*c33452fbSAndroid Build Coastguard Worker /** @defgroup buffer_size asio::buffer_size
281*c33452fbSAndroid Build Coastguard Worker *
282*c33452fbSAndroid Build Coastguard Worker * @brief The asio::buffer_size function determines the total number of
283*c33452fbSAndroid Build Coastguard Worker * bytes in a buffer or buffer sequence.
284*c33452fbSAndroid Build Coastguard Worker */
285*c33452fbSAndroid Build Coastguard Worker /*@{*/
286*c33452fbSAndroid Build Coastguard Worker
287*c33452fbSAndroid Build Coastguard Worker /// Get the number of bytes in a modifiable buffer.
buffer_size(const mutable_buffer & b)288*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_size(const mutable_buffer& b)
289*c33452fbSAndroid Build Coastguard Worker {
290*c33452fbSAndroid Build Coastguard Worker return detail::buffer_size_helper(b);
291*c33452fbSAndroid Build Coastguard Worker }
292*c33452fbSAndroid Build Coastguard Worker
293*c33452fbSAndroid Build Coastguard Worker /// Get the number of bytes in a modifiable buffer.
buffer_size(const mutable_buffers_1 & b)294*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_size(const mutable_buffers_1& b)
295*c33452fbSAndroid Build Coastguard Worker {
296*c33452fbSAndroid Build Coastguard Worker return detail::buffer_size_helper(b);
297*c33452fbSAndroid Build Coastguard Worker }
298*c33452fbSAndroid Build Coastguard Worker
299*c33452fbSAndroid Build Coastguard Worker /// Get the number of bytes in a non-modifiable buffer.
buffer_size(const const_buffer & b)300*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_size(const const_buffer& b)
301*c33452fbSAndroid Build Coastguard Worker {
302*c33452fbSAndroid Build Coastguard Worker return detail::buffer_size_helper(b);
303*c33452fbSAndroid Build Coastguard Worker }
304*c33452fbSAndroid Build Coastguard Worker
305*c33452fbSAndroid Build Coastguard Worker /// Get the number of bytes in a non-modifiable buffer.
buffer_size(const const_buffers_1 & b)306*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_size(const const_buffers_1& b)
307*c33452fbSAndroid Build Coastguard Worker {
308*c33452fbSAndroid Build Coastguard Worker return detail::buffer_size_helper(b);
309*c33452fbSAndroid Build Coastguard Worker }
310*c33452fbSAndroid Build Coastguard Worker
311*c33452fbSAndroid Build Coastguard Worker /// Get the total number of bytes in a buffer sequence.
312*c33452fbSAndroid Build Coastguard Worker /**
313*c33452fbSAndroid Build Coastguard Worker * The @c BufferSequence template parameter may meet either of the @c
314*c33452fbSAndroid Build Coastguard Worker * ConstBufferSequence or @c MutableBufferSequence type requirements.
315*c33452fbSAndroid Build Coastguard Worker */
316*c33452fbSAndroid Build Coastguard Worker template <typename BufferSequence>
buffer_size(const BufferSequence & b)317*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_size(const BufferSequence& b)
318*c33452fbSAndroid Build Coastguard Worker {
319*c33452fbSAndroid Build Coastguard Worker std::size_t total_buffer_size = 0;
320*c33452fbSAndroid Build Coastguard Worker
321*c33452fbSAndroid Build Coastguard Worker typename BufferSequence::const_iterator iter = b.begin();
322*c33452fbSAndroid Build Coastguard Worker typename BufferSequence::const_iterator end = b.end();
323*c33452fbSAndroid Build Coastguard Worker for (; iter != end; ++iter)
324*c33452fbSAndroid Build Coastguard Worker total_buffer_size += detail::buffer_size_helper(*iter);
325*c33452fbSAndroid Build Coastguard Worker
326*c33452fbSAndroid Build Coastguard Worker return total_buffer_size;
327*c33452fbSAndroid Build Coastguard Worker }
328*c33452fbSAndroid Build Coastguard Worker
329*c33452fbSAndroid Build Coastguard Worker /*@}*/
330*c33452fbSAndroid Build Coastguard Worker
331*c33452fbSAndroid Build Coastguard Worker /** @defgroup buffer_cast asio::buffer_cast
332*c33452fbSAndroid Build Coastguard Worker *
333*c33452fbSAndroid Build Coastguard Worker * @brief The asio::buffer_cast function is used to obtain a pointer to
334*c33452fbSAndroid Build Coastguard Worker * the underlying memory region associated with a buffer.
335*c33452fbSAndroid Build Coastguard Worker *
336*c33452fbSAndroid Build Coastguard Worker * @par Examples:
337*c33452fbSAndroid Build Coastguard Worker *
338*c33452fbSAndroid Build Coastguard Worker * To access the memory of a non-modifiable buffer, use:
339*c33452fbSAndroid Build Coastguard Worker * @code asio::const_buffer b1 = ...;
340*c33452fbSAndroid Build Coastguard Worker * const unsigned char* p1 = asio::buffer_cast<const unsigned char*>(b1);
341*c33452fbSAndroid Build Coastguard Worker * @endcode
342*c33452fbSAndroid Build Coastguard Worker *
343*c33452fbSAndroid Build Coastguard Worker * To access the memory of a modifiable buffer, use:
344*c33452fbSAndroid Build Coastguard Worker * @code asio::mutable_buffer b2 = ...;
345*c33452fbSAndroid Build Coastguard Worker * unsigned char* p2 = asio::buffer_cast<unsigned char*>(b2);
346*c33452fbSAndroid Build Coastguard Worker * @endcode
347*c33452fbSAndroid Build Coastguard Worker *
348*c33452fbSAndroid Build Coastguard Worker * The asio::buffer_cast function permits violations of type safety, so
349*c33452fbSAndroid Build Coastguard Worker * uses of it in application code should be carefully considered.
350*c33452fbSAndroid Build Coastguard Worker */
351*c33452fbSAndroid Build Coastguard Worker /*@{*/
352*c33452fbSAndroid Build Coastguard Worker
353*c33452fbSAndroid Build Coastguard Worker /// Cast a non-modifiable buffer to a specified pointer to POD type.
354*c33452fbSAndroid Build Coastguard Worker template <typename PointerToPodType>
buffer_cast(const mutable_buffer & b)355*c33452fbSAndroid Build Coastguard Worker inline PointerToPodType buffer_cast(const mutable_buffer& b)
356*c33452fbSAndroid Build Coastguard Worker {
357*c33452fbSAndroid Build Coastguard Worker return static_cast<PointerToPodType>(detail::buffer_cast_helper(b));
358*c33452fbSAndroid Build Coastguard Worker }
359*c33452fbSAndroid Build Coastguard Worker
360*c33452fbSAndroid Build Coastguard Worker /// Cast a non-modifiable buffer to a specified pointer to POD type.
361*c33452fbSAndroid Build Coastguard Worker template <typename PointerToPodType>
buffer_cast(const const_buffer & b)362*c33452fbSAndroid Build Coastguard Worker inline PointerToPodType buffer_cast(const const_buffer& b)
363*c33452fbSAndroid Build Coastguard Worker {
364*c33452fbSAndroid Build Coastguard Worker return static_cast<PointerToPodType>(detail::buffer_cast_helper(b));
365*c33452fbSAndroid Build Coastguard Worker }
366*c33452fbSAndroid Build Coastguard Worker
367*c33452fbSAndroid Build Coastguard Worker /*@}*/
368*c33452fbSAndroid Build Coastguard Worker
369*c33452fbSAndroid Build Coastguard Worker /// Create a new modifiable buffer that is offset from the start of another.
370*c33452fbSAndroid Build Coastguard Worker /**
371*c33452fbSAndroid Build Coastguard Worker * @relates mutable_buffer
372*c33452fbSAndroid Build Coastguard Worker */
operator +(const mutable_buffer & b,std::size_t start)373*c33452fbSAndroid Build Coastguard Worker inline mutable_buffer operator+(const mutable_buffer& b, std::size_t start)
374*c33452fbSAndroid Build Coastguard Worker {
375*c33452fbSAndroid Build Coastguard Worker if (start > buffer_size(b))
376*c33452fbSAndroid Build Coastguard Worker return mutable_buffer();
377*c33452fbSAndroid Build Coastguard Worker char* new_data = buffer_cast<char*>(b) + start;
378*c33452fbSAndroid Build Coastguard Worker std::size_t new_size = buffer_size(b) - start;
379*c33452fbSAndroid Build Coastguard Worker return mutable_buffer(new_data, new_size
380*c33452fbSAndroid Build Coastguard Worker );
381*c33452fbSAndroid Build Coastguard Worker }
382*c33452fbSAndroid Build Coastguard Worker
383*c33452fbSAndroid Build Coastguard Worker /// Create a new modifiable buffer that is offset from the start of another.
384*c33452fbSAndroid Build Coastguard Worker /**
385*c33452fbSAndroid Build Coastguard Worker * @relates mutable_buffer
386*c33452fbSAndroid Build Coastguard Worker */
operator +(std::size_t start,const mutable_buffer & b)387*c33452fbSAndroid Build Coastguard Worker inline mutable_buffer operator+(std::size_t start, const mutable_buffer& b)
388*c33452fbSAndroid Build Coastguard Worker {
389*c33452fbSAndroid Build Coastguard Worker if (start > buffer_size(b))
390*c33452fbSAndroid Build Coastguard Worker return mutable_buffer();
391*c33452fbSAndroid Build Coastguard Worker char* new_data = buffer_cast<char*>(b) + start;
392*c33452fbSAndroid Build Coastguard Worker std::size_t new_size = buffer_size(b) - start;
393*c33452fbSAndroid Build Coastguard Worker return mutable_buffer(new_data, new_size
394*c33452fbSAndroid Build Coastguard Worker );
395*c33452fbSAndroid Build Coastguard Worker }
396*c33452fbSAndroid Build Coastguard Worker
397*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer that is offset from the start of another.
398*c33452fbSAndroid Build Coastguard Worker /**
399*c33452fbSAndroid Build Coastguard Worker * @relates const_buffer
400*c33452fbSAndroid Build Coastguard Worker */
operator +(const const_buffer & b,std::size_t start)401*c33452fbSAndroid Build Coastguard Worker inline const_buffer operator+(const const_buffer& b, std::size_t start)
402*c33452fbSAndroid Build Coastguard Worker {
403*c33452fbSAndroid Build Coastguard Worker if (start > buffer_size(b))
404*c33452fbSAndroid Build Coastguard Worker return const_buffer();
405*c33452fbSAndroid Build Coastguard Worker const char* new_data = buffer_cast<const char*>(b) + start;
406*c33452fbSAndroid Build Coastguard Worker std::size_t new_size = buffer_size(b) - start;
407*c33452fbSAndroid Build Coastguard Worker return const_buffer(new_data, new_size
408*c33452fbSAndroid Build Coastguard Worker );
409*c33452fbSAndroid Build Coastguard Worker }
410*c33452fbSAndroid Build Coastguard Worker
411*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer that is offset from the start of another.
412*c33452fbSAndroid Build Coastguard Worker /**
413*c33452fbSAndroid Build Coastguard Worker * @relates const_buffer
414*c33452fbSAndroid Build Coastguard Worker */
operator +(std::size_t start,const const_buffer & b)415*c33452fbSAndroid Build Coastguard Worker inline const_buffer operator+(std::size_t start, const const_buffer& b)
416*c33452fbSAndroid Build Coastguard Worker {
417*c33452fbSAndroid Build Coastguard Worker if (start > buffer_size(b))
418*c33452fbSAndroid Build Coastguard Worker return const_buffer();
419*c33452fbSAndroid Build Coastguard Worker const char* new_data = buffer_cast<const char*>(b) + start;
420*c33452fbSAndroid Build Coastguard Worker std::size_t new_size = buffer_size(b) - start;
421*c33452fbSAndroid Build Coastguard Worker return const_buffer(new_data, new_size
422*c33452fbSAndroid Build Coastguard Worker );
423*c33452fbSAndroid Build Coastguard Worker }
424*c33452fbSAndroid Build Coastguard Worker
425*c33452fbSAndroid Build Coastguard Worker
426*c33452fbSAndroid Build Coastguard Worker /** @defgroup buffer asio::buffer
427*c33452fbSAndroid Build Coastguard Worker *
428*c33452fbSAndroid Build Coastguard Worker * @brief The asio::buffer function is used to create a buffer object to
429*c33452fbSAndroid Build Coastguard Worker * represent raw memory, an array of POD elements, a vector of POD elements,
430*c33452fbSAndroid Build Coastguard Worker * or a std::string.
431*c33452fbSAndroid Build Coastguard Worker *
432*c33452fbSAndroid Build Coastguard Worker * A buffer object represents a contiguous region of memory as a 2-tuple
433*c33452fbSAndroid Build Coastguard Worker * consisting of a pointer and size in bytes. A tuple of the form <tt>{void*,
434*c33452fbSAndroid Build Coastguard Worker * size_t}</tt> specifies a mutable (modifiable) region of memory. Similarly, a
435*c33452fbSAndroid Build Coastguard Worker * tuple of the form <tt>{const void*, size_t}</tt> specifies a const
436*c33452fbSAndroid Build Coastguard Worker * (non-modifiable) region of memory. These two forms correspond to the classes
437*c33452fbSAndroid Build Coastguard Worker * mutable_buffer and const_buffer, respectively. To mirror C++'s conversion
438*c33452fbSAndroid Build Coastguard Worker * rules, a mutable_buffer is implicitly convertible to a const_buffer, and the
439*c33452fbSAndroid Build Coastguard Worker * opposite conversion is not permitted.
440*c33452fbSAndroid Build Coastguard Worker *
441*c33452fbSAndroid Build Coastguard Worker * The simplest use case involves reading or writing a single buffer of a
442*c33452fbSAndroid Build Coastguard Worker * specified size:
443*c33452fbSAndroid Build Coastguard Worker *
444*c33452fbSAndroid Build Coastguard Worker * @code sock.send(asio::buffer(data, size)); @endcode
445*c33452fbSAndroid Build Coastguard Worker *
446*c33452fbSAndroid Build Coastguard Worker * In the above example, the return value of asio::buffer meets the
447*c33452fbSAndroid Build Coastguard Worker * requirements of the ConstBufferSequence concept so that it may be directly
448*c33452fbSAndroid Build Coastguard Worker * passed to the socket's write function. A buffer created for modifiable
449*c33452fbSAndroid Build Coastguard Worker * memory also meets the requirements of the MutableBufferSequence concept.
450*c33452fbSAndroid Build Coastguard Worker *
451*c33452fbSAndroid Build Coastguard Worker * An individual buffer may be created from a builtin array, std::vector,
452*c33452fbSAndroid Build Coastguard Worker * std::array or boost::array of POD elements. This helps prevent buffer
453*c33452fbSAndroid Build Coastguard Worker * overruns by automatically determining the size of the buffer:
454*c33452fbSAndroid Build Coastguard Worker *
455*c33452fbSAndroid Build Coastguard Worker * @code char d1[128];
456*c33452fbSAndroid Build Coastguard Worker * size_t bytes_transferred = sock.receive(asio::buffer(d1));
457*c33452fbSAndroid Build Coastguard Worker *
458*c33452fbSAndroid Build Coastguard Worker * std::vector<char> d2(128);
459*c33452fbSAndroid Build Coastguard Worker * bytes_transferred = sock.receive(asio::buffer(d2));
460*c33452fbSAndroid Build Coastguard Worker *
461*c33452fbSAndroid Build Coastguard Worker * std::array<char, 128> d3;
462*c33452fbSAndroid Build Coastguard Worker * bytes_transferred = sock.receive(asio::buffer(d3));
463*c33452fbSAndroid Build Coastguard Worker *
464*c33452fbSAndroid Build Coastguard Worker * boost::array<char, 128> d4;
465*c33452fbSAndroid Build Coastguard Worker * bytes_transferred = sock.receive(asio::buffer(d4)); @endcode
466*c33452fbSAndroid Build Coastguard Worker *
467*c33452fbSAndroid Build Coastguard Worker * In all three cases above, the buffers created are exactly 128 bytes long.
468*c33452fbSAndroid Build Coastguard Worker * Note that a vector is @e never automatically resized when creating or using
469*c33452fbSAndroid Build Coastguard Worker * a buffer. The buffer size is determined using the vector's <tt>size()</tt>
470*c33452fbSAndroid Build Coastguard Worker * member function, and not its capacity.
471*c33452fbSAndroid Build Coastguard Worker *
472*c33452fbSAndroid Build Coastguard Worker * @par Accessing Buffer Contents
473*c33452fbSAndroid Build Coastguard Worker *
474*c33452fbSAndroid Build Coastguard Worker * The contents of a buffer may be accessed using the @ref buffer_size and
475*c33452fbSAndroid Build Coastguard Worker * @ref buffer_cast functions:
476*c33452fbSAndroid Build Coastguard Worker *
477*c33452fbSAndroid Build Coastguard Worker * @code asio::mutable_buffer b1 = ...;
478*c33452fbSAndroid Build Coastguard Worker * std::size_t s1 = asio::buffer_size(b1);
479*c33452fbSAndroid Build Coastguard Worker * unsigned char* p1 = asio::buffer_cast<unsigned char*>(b1);
480*c33452fbSAndroid Build Coastguard Worker *
481*c33452fbSAndroid Build Coastguard Worker * asio::const_buffer b2 = ...;
482*c33452fbSAndroid Build Coastguard Worker * std::size_t s2 = asio::buffer_size(b2);
483*c33452fbSAndroid Build Coastguard Worker * const void* p2 = asio::buffer_cast<const void*>(b2); @endcode
484*c33452fbSAndroid Build Coastguard Worker *
485*c33452fbSAndroid Build Coastguard Worker * The asio::buffer_cast function permits violations of type safety, so
486*c33452fbSAndroid Build Coastguard Worker * uses of it in application code should be carefully considered.
487*c33452fbSAndroid Build Coastguard Worker *
488*c33452fbSAndroid Build Coastguard Worker * For convenience, the @ref buffer_size function also works on buffer
489*c33452fbSAndroid Build Coastguard Worker * sequences (that is, types meeting the ConstBufferSequence or
490*c33452fbSAndroid Build Coastguard Worker * MutableBufferSequence type requirements). In this case, the function returns
491*c33452fbSAndroid Build Coastguard Worker * the total size of all buffers in the sequence.
492*c33452fbSAndroid Build Coastguard Worker *
493*c33452fbSAndroid Build Coastguard Worker * @par Buffer Copying
494*c33452fbSAndroid Build Coastguard Worker *
495*c33452fbSAndroid Build Coastguard Worker * The @ref buffer_copy function may be used to copy raw bytes between
496*c33452fbSAndroid Build Coastguard Worker * individual buffers and buffer sequences.
497*c33452fbSAndroid Build Coastguard Worker *
498*c33452fbSAndroid Build Coastguard Worker * In particular, when used with the @ref buffer_size, the @ref buffer_copy
499*c33452fbSAndroid Build Coastguard Worker * function can be used to linearise a sequence of buffers. For example:
500*c33452fbSAndroid Build Coastguard Worker *
501*c33452fbSAndroid Build Coastguard Worker * @code vector<const_buffer> buffers = ...;
502*c33452fbSAndroid Build Coastguard Worker *
503*c33452fbSAndroid Build Coastguard Worker * vector<unsigned char> data(asio::buffer_size(buffers));
504*c33452fbSAndroid Build Coastguard Worker * asio::buffer_copy(asio::buffer(data), buffers); @endcode
505*c33452fbSAndroid Build Coastguard Worker *
506*c33452fbSAndroid Build Coastguard Worker * Note that @ref buffer_copy is implemented in terms of @c memcpy, and
507*c33452fbSAndroid Build Coastguard Worker * consequently it cannot be used to copy between overlapping memory regions.
508*c33452fbSAndroid Build Coastguard Worker *
509*c33452fbSAndroid Build Coastguard Worker * @par Buffer Invalidation
510*c33452fbSAndroid Build Coastguard Worker *
511*c33452fbSAndroid Build Coastguard Worker * A buffer object does not have any ownership of the memory it refers to. It
512*c33452fbSAndroid Build Coastguard Worker * is the responsibility of the application to ensure the memory region remains
513*c33452fbSAndroid Build Coastguard Worker * valid until it is no longer required for an I/O operation. When the memory
514*c33452fbSAndroid Build Coastguard Worker * is no longer available, the buffer is said to have been invalidated.
515*c33452fbSAndroid Build Coastguard Worker *
516*c33452fbSAndroid Build Coastguard Worker * For the asio::buffer overloads that accept an argument of type
517*c33452fbSAndroid Build Coastguard Worker * std::vector, the buffer objects returned are invalidated by any vector
518*c33452fbSAndroid Build Coastguard Worker * operation that also invalidates all references, pointers and iterators
519*c33452fbSAndroid Build Coastguard Worker * referring to the elements in the sequence (C++ Std, 23.2.4)
520*c33452fbSAndroid Build Coastguard Worker *
521*c33452fbSAndroid Build Coastguard Worker * For the asio::buffer overloads that accept an argument of type
522*c33452fbSAndroid Build Coastguard Worker * std::basic_string, the buffer objects returned are invalidated according to
523*c33452fbSAndroid Build Coastguard Worker * the rules defined for invalidation of references, pointers and iterators
524*c33452fbSAndroid Build Coastguard Worker * referring to elements of the sequence (C++ Std, 21.3).
525*c33452fbSAndroid Build Coastguard Worker *
526*c33452fbSAndroid Build Coastguard Worker * @par Buffer Arithmetic
527*c33452fbSAndroid Build Coastguard Worker *
528*c33452fbSAndroid Build Coastguard Worker * Buffer objects may be manipulated using simple arithmetic in a safe way
529*c33452fbSAndroid Build Coastguard Worker * which helps prevent buffer overruns. Consider an array initialised as
530*c33452fbSAndroid Build Coastguard Worker * follows:
531*c33452fbSAndroid Build Coastguard Worker *
532*c33452fbSAndroid Build Coastguard Worker * @code boost::array<char, 6> a = { 'a', 'b', 'c', 'd', 'e' }; @endcode
533*c33452fbSAndroid Build Coastguard Worker *
534*c33452fbSAndroid Build Coastguard Worker * A buffer object @c b1 created using:
535*c33452fbSAndroid Build Coastguard Worker *
536*c33452fbSAndroid Build Coastguard Worker * @code b1 = asio::buffer(a); @endcode
537*c33452fbSAndroid Build Coastguard Worker *
538*c33452fbSAndroid Build Coastguard Worker * represents the entire array, <tt>{ 'a', 'b', 'c', 'd', 'e' }</tt>. An
539*c33452fbSAndroid Build Coastguard Worker * optional second argument to the asio::buffer function may be used to
540*c33452fbSAndroid Build Coastguard Worker * limit the size, in bytes, of the buffer:
541*c33452fbSAndroid Build Coastguard Worker *
542*c33452fbSAndroid Build Coastguard Worker * @code b2 = asio::buffer(a, 3); @endcode
543*c33452fbSAndroid Build Coastguard Worker *
544*c33452fbSAndroid Build Coastguard Worker * such that @c b2 represents the data <tt>{ 'a', 'b', 'c' }</tt>. Even if the
545*c33452fbSAndroid Build Coastguard Worker * size argument exceeds the actual size of the array, the size of the buffer
546*c33452fbSAndroid Build Coastguard Worker * object created will be limited to the array size.
547*c33452fbSAndroid Build Coastguard Worker *
548*c33452fbSAndroid Build Coastguard Worker * An offset may be applied to an existing buffer to create a new one:
549*c33452fbSAndroid Build Coastguard Worker *
550*c33452fbSAndroid Build Coastguard Worker * @code b3 = b1 + 2; @endcode
551*c33452fbSAndroid Build Coastguard Worker *
552*c33452fbSAndroid Build Coastguard Worker * where @c b3 will set to represent <tt>{ 'c', 'd', 'e' }</tt>. If the offset
553*c33452fbSAndroid Build Coastguard Worker * exceeds the size of the existing buffer, the newly created buffer will be
554*c33452fbSAndroid Build Coastguard Worker * empty.
555*c33452fbSAndroid Build Coastguard Worker *
556*c33452fbSAndroid Build Coastguard Worker * Both an offset and size may be specified to create a buffer that corresponds
557*c33452fbSAndroid Build Coastguard Worker * to a specific range of bytes within an existing buffer:
558*c33452fbSAndroid Build Coastguard Worker *
559*c33452fbSAndroid Build Coastguard Worker * @code b4 = asio::buffer(b1 + 1, 3); @endcode
560*c33452fbSAndroid Build Coastguard Worker *
561*c33452fbSAndroid Build Coastguard Worker * so that @c b4 will refer to the bytes <tt>{ 'b', 'c', 'd' }</tt>.
562*c33452fbSAndroid Build Coastguard Worker *
563*c33452fbSAndroid Build Coastguard Worker * @par Buffers and Scatter-Gather I/O
564*c33452fbSAndroid Build Coastguard Worker *
565*c33452fbSAndroid Build Coastguard Worker * To read or write using multiple buffers (i.e. scatter-gather I/O), multiple
566*c33452fbSAndroid Build Coastguard Worker * buffer objects may be assigned into a container that supports the
567*c33452fbSAndroid Build Coastguard Worker * MutableBufferSequence (for read) or ConstBufferSequence (for write) concepts:
568*c33452fbSAndroid Build Coastguard Worker *
569*c33452fbSAndroid Build Coastguard Worker * @code
570*c33452fbSAndroid Build Coastguard Worker * char d1[128];
571*c33452fbSAndroid Build Coastguard Worker * std::vector<char> d2(128);
572*c33452fbSAndroid Build Coastguard Worker * boost::array<char, 128> d3;
573*c33452fbSAndroid Build Coastguard Worker *
574*c33452fbSAndroid Build Coastguard Worker * boost::array<mutable_buffer, 3> bufs1 = {
575*c33452fbSAndroid Build Coastguard Worker * asio::buffer(d1),
576*c33452fbSAndroid Build Coastguard Worker * asio::buffer(d2),
577*c33452fbSAndroid Build Coastguard Worker * asio::buffer(d3) };
578*c33452fbSAndroid Build Coastguard Worker * bytes_transferred = sock.receive(bufs1);
579*c33452fbSAndroid Build Coastguard Worker *
580*c33452fbSAndroid Build Coastguard Worker * std::vector<const_buffer> bufs2;
581*c33452fbSAndroid Build Coastguard Worker * bufs2.push_back(asio::buffer(d1));
582*c33452fbSAndroid Build Coastguard Worker * bufs2.push_back(asio::buffer(d2));
583*c33452fbSAndroid Build Coastguard Worker * bufs2.push_back(asio::buffer(d3));
584*c33452fbSAndroid Build Coastguard Worker * bytes_transferred = sock.send(bufs2); @endcode
585*c33452fbSAndroid Build Coastguard Worker */
586*c33452fbSAndroid Build Coastguard Worker /*@{*/
587*c33452fbSAndroid Build Coastguard Worker
588*c33452fbSAndroid Build Coastguard Worker /// Create a new modifiable buffer from an existing buffer.
589*c33452fbSAndroid Build Coastguard Worker /**
590*c33452fbSAndroid Build Coastguard Worker * @returns <tt>mutable_buffers_1(b)</tt>.
591*c33452fbSAndroid Build Coastguard Worker */
buffer(const mutable_buffer & b)592*c33452fbSAndroid Build Coastguard Worker inline mutable_buffers_1 buffer(const mutable_buffer& b)
593*c33452fbSAndroid Build Coastguard Worker {
594*c33452fbSAndroid Build Coastguard Worker return mutable_buffers_1(b);
595*c33452fbSAndroid Build Coastguard Worker }
596*c33452fbSAndroid Build Coastguard Worker
597*c33452fbSAndroid Build Coastguard Worker /// Create a new modifiable buffer from an existing buffer.
598*c33452fbSAndroid Build Coastguard Worker /**
599*c33452fbSAndroid Build Coastguard Worker * @returns A mutable_buffers_1 value equivalent to:
600*c33452fbSAndroid Build Coastguard Worker * @code mutable_buffers_1(
601*c33452fbSAndroid Build Coastguard Worker * buffer_cast<void*>(b),
602*c33452fbSAndroid Build Coastguard Worker * min(buffer_size(b), max_size_in_bytes)); @endcode
603*c33452fbSAndroid Build Coastguard Worker */
buffer(const mutable_buffer & b,std::size_t max_size_in_bytes)604*c33452fbSAndroid Build Coastguard Worker inline mutable_buffers_1 buffer(const mutable_buffer& b,
605*c33452fbSAndroid Build Coastguard Worker std::size_t max_size_in_bytes)
606*c33452fbSAndroid Build Coastguard Worker {
607*c33452fbSAndroid Build Coastguard Worker return mutable_buffers_1(
608*c33452fbSAndroid Build Coastguard Worker mutable_buffer(buffer_cast<void*>(b),
609*c33452fbSAndroid Build Coastguard Worker buffer_size(b) < max_size_in_bytes
610*c33452fbSAndroid Build Coastguard Worker ? buffer_size(b) : max_size_in_bytes
611*c33452fbSAndroid Build Coastguard Worker ));
612*c33452fbSAndroid Build Coastguard Worker }
613*c33452fbSAndroid Build Coastguard Worker
614*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer from an existing buffer.
615*c33452fbSAndroid Build Coastguard Worker /**
616*c33452fbSAndroid Build Coastguard Worker * @returns <tt>const_buffers_1(b)</tt>.
617*c33452fbSAndroid Build Coastguard Worker */
buffer(const const_buffer & b)618*c33452fbSAndroid Build Coastguard Worker inline const_buffers_1 buffer(const const_buffer& b)
619*c33452fbSAndroid Build Coastguard Worker {
620*c33452fbSAndroid Build Coastguard Worker return const_buffers_1(b);
621*c33452fbSAndroid Build Coastguard Worker }
622*c33452fbSAndroid Build Coastguard Worker
623*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer from an existing buffer.
624*c33452fbSAndroid Build Coastguard Worker /**
625*c33452fbSAndroid Build Coastguard Worker * @returns A const_buffers_1 value equivalent to:
626*c33452fbSAndroid Build Coastguard Worker * @code const_buffers_1(
627*c33452fbSAndroid Build Coastguard Worker * buffer_cast<const void*>(b),
628*c33452fbSAndroid Build Coastguard Worker * min(buffer_size(b), max_size_in_bytes)); @endcode
629*c33452fbSAndroid Build Coastguard Worker */
buffer(const const_buffer & b,std::size_t max_size_in_bytes)630*c33452fbSAndroid Build Coastguard Worker inline const_buffers_1 buffer(const const_buffer& b,
631*c33452fbSAndroid Build Coastguard Worker std::size_t max_size_in_bytes)
632*c33452fbSAndroid Build Coastguard Worker {
633*c33452fbSAndroid Build Coastguard Worker return const_buffers_1(
634*c33452fbSAndroid Build Coastguard Worker const_buffer(buffer_cast<const void*>(b),
635*c33452fbSAndroid Build Coastguard Worker buffer_size(b) < max_size_in_bytes
636*c33452fbSAndroid Build Coastguard Worker ? buffer_size(b) : max_size_in_bytes
637*c33452fbSAndroid Build Coastguard Worker ));
638*c33452fbSAndroid Build Coastguard Worker }
639*c33452fbSAndroid Build Coastguard Worker
640*c33452fbSAndroid Build Coastguard Worker /// Create a new modifiable buffer that represents the given memory range.
641*c33452fbSAndroid Build Coastguard Worker /**
642*c33452fbSAndroid Build Coastguard Worker * @returns <tt>mutable_buffers_1(data, size_in_bytes)</tt>.
643*c33452fbSAndroid Build Coastguard Worker */
buffer(void * data,std::size_t size_in_bytes)644*c33452fbSAndroid Build Coastguard Worker inline mutable_buffers_1 buffer(void* data, std::size_t size_in_bytes)
645*c33452fbSAndroid Build Coastguard Worker {
646*c33452fbSAndroid Build Coastguard Worker return mutable_buffers_1(mutable_buffer(data, size_in_bytes));
647*c33452fbSAndroid Build Coastguard Worker }
648*c33452fbSAndroid Build Coastguard Worker
649*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer that represents the given memory range.
650*c33452fbSAndroid Build Coastguard Worker /**
651*c33452fbSAndroid Build Coastguard Worker * @returns <tt>const_buffers_1(data, size_in_bytes)</tt>.
652*c33452fbSAndroid Build Coastguard Worker */
buffer(const void * data,std::size_t size_in_bytes)653*c33452fbSAndroid Build Coastguard Worker inline const_buffers_1 buffer(const void* data,
654*c33452fbSAndroid Build Coastguard Worker std::size_t size_in_bytes)
655*c33452fbSAndroid Build Coastguard Worker {
656*c33452fbSAndroid Build Coastguard Worker return const_buffers_1(const_buffer(data, size_in_bytes));
657*c33452fbSAndroid Build Coastguard Worker }
658*c33452fbSAndroid Build Coastguard Worker
659*c33452fbSAndroid Build Coastguard Worker /// Create a new modifiable buffer that represents the given POD array.
660*c33452fbSAndroid Build Coastguard Worker /**
661*c33452fbSAndroid Build Coastguard Worker * @returns A mutable_buffers_1 value equivalent to:
662*c33452fbSAndroid Build Coastguard Worker * @code mutable_buffers_1(
663*c33452fbSAndroid Build Coastguard Worker * static_cast<void*>(data),
664*c33452fbSAndroid Build Coastguard Worker * N * sizeof(PodType)); @endcode
665*c33452fbSAndroid Build Coastguard Worker */
666*c33452fbSAndroid Build Coastguard Worker template <typename PodType, std::size_t N>
buffer(PodType (& data)[N])667*c33452fbSAndroid Build Coastguard Worker inline mutable_buffers_1 buffer(PodType (&data)[N])
668*c33452fbSAndroid Build Coastguard Worker {
669*c33452fbSAndroid Build Coastguard Worker return mutable_buffers_1(mutable_buffer(data, N * sizeof(PodType)));
670*c33452fbSAndroid Build Coastguard Worker }
671*c33452fbSAndroid Build Coastguard Worker
672*c33452fbSAndroid Build Coastguard Worker /// Create a new modifiable buffer that represents the given POD array.
673*c33452fbSAndroid Build Coastguard Worker /**
674*c33452fbSAndroid Build Coastguard Worker * @returns A mutable_buffers_1 value equivalent to:
675*c33452fbSAndroid Build Coastguard Worker * @code mutable_buffers_1(
676*c33452fbSAndroid Build Coastguard Worker * static_cast<void*>(data),
677*c33452fbSAndroid Build Coastguard Worker * min(N * sizeof(PodType), max_size_in_bytes)); @endcode
678*c33452fbSAndroid Build Coastguard Worker */
679*c33452fbSAndroid Build Coastguard Worker template <typename PodType, std::size_t N>
buffer(PodType (& data)[N],std::size_t max_size_in_bytes)680*c33452fbSAndroid Build Coastguard Worker inline mutable_buffers_1 buffer(PodType (&data)[N],
681*c33452fbSAndroid Build Coastguard Worker std::size_t max_size_in_bytes)
682*c33452fbSAndroid Build Coastguard Worker {
683*c33452fbSAndroid Build Coastguard Worker return mutable_buffers_1(
684*c33452fbSAndroid Build Coastguard Worker mutable_buffer(data,
685*c33452fbSAndroid Build Coastguard Worker N * sizeof(PodType) < max_size_in_bytes
686*c33452fbSAndroid Build Coastguard Worker ? N * sizeof(PodType) : max_size_in_bytes));
687*c33452fbSAndroid Build Coastguard Worker }
688*c33452fbSAndroid Build Coastguard Worker
689*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer that represents the given POD array.
690*c33452fbSAndroid Build Coastguard Worker /**
691*c33452fbSAndroid Build Coastguard Worker * @returns A const_buffers_1 value equivalent to:
692*c33452fbSAndroid Build Coastguard Worker * @code const_buffers_1(
693*c33452fbSAndroid Build Coastguard Worker * static_cast<const void*>(data),
694*c33452fbSAndroid Build Coastguard Worker * N * sizeof(PodType)); @endcode
695*c33452fbSAndroid Build Coastguard Worker */
696*c33452fbSAndroid Build Coastguard Worker template <typename PodType, std::size_t N>
buffer(const PodType (& data)[N])697*c33452fbSAndroid Build Coastguard Worker inline const_buffers_1 buffer(const PodType (&data)[N])
698*c33452fbSAndroid Build Coastguard Worker {
699*c33452fbSAndroid Build Coastguard Worker return const_buffers_1(const_buffer(data, N * sizeof(PodType)));
700*c33452fbSAndroid Build Coastguard Worker }
701*c33452fbSAndroid Build Coastguard Worker
702*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer that represents the given POD array.
703*c33452fbSAndroid Build Coastguard Worker /**
704*c33452fbSAndroid Build Coastguard Worker * @returns A const_buffers_1 value equivalent to:
705*c33452fbSAndroid Build Coastguard Worker * @code const_buffers_1(
706*c33452fbSAndroid Build Coastguard Worker * static_cast<const void*>(data),
707*c33452fbSAndroid Build Coastguard Worker * min(N * sizeof(PodType), max_size_in_bytes)); @endcode
708*c33452fbSAndroid Build Coastguard Worker */
709*c33452fbSAndroid Build Coastguard Worker template <typename PodType, std::size_t N>
buffer(const PodType (& data)[N],std::size_t max_size_in_bytes)710*c33452fbSAndroid Build Coastguard Worker inline const_buffers_1 buffer(const PodType (&data)[N],
711*c33452fbSAndroid Build Coastguard Worker std::size_t max_size_in_bytes)
712*c33452fbSAndroid Build Coastguard Worker {
713*c33452fbSAndroid Build Coastguard Worker return const_buffers_1(
714*c33452fbSAndroid Build Coastguard Worker const_buffer(data,
715*c33452fbSAndroid Build Coastguard Worker N * sizeof(PodType) < max_size_in_bytes
716*c33452fbSAndroid Build Coastguard Worker ? N * sizeof(PodType) : max_size_in_bytes));
717*c33452fbSAndroid Build Coastguard Worker }
718*c33452fbSAndroid Build Coastguard Worker
719*c33452fbSAndroid Build Coastguard Worker #if defined(ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND)
720*c33452fbSAndroid Build Coastguard Worker
721*c33452fbSAndroid Build Coastguard Worker // Borland C++ and Sun Studio think the overloads:
722*c33452fbSAndroid Build Coastguard Worker //
723*c33452fbSAndroid Build Coastguard Worker // unspecified buffer(boost::array<PodType, N>& array ...);
724*c33452fbSAndroid Build Coastguard Worker //
725*c33452fbSAndroid Build Coastguard Worker // and
726*c33452fbSAndroid Build Coastguard Worker //
727*c33452fbSAndroid Build Coastguard Worker // unspecified buffer(boost::array<const PodType, N>& array ...);
728*c33452fbSAndroid Build Coastguard Worker //
729*c33452fbSAndroid Build Coastguard Worker // are ambiguous. This will be worked around by using a buffer_types traits
730*c33452fbSAndroid Build Coastguard Worker // class that contains typedefs for the appropriate buffer and container
731*c33452fbSAndroid Build Coastguard Worker // classes, based on whether PodType is const or non-const.
732*c33452fbSAndroid Build Coastguard Worker
733*c33452fbSAndroid Build Coastguard Worker namespace detail {
734*c33452fbSAndroid Build Coastguard Worker
735*c33452fbSAndroid Build Coastguard Worker template <bool IsConst>
736*c33452fbSAndroid Build Coastguard Worker struct buffer_types_base;
737*c33452fbSAndroid Build Coastguard Worker
738*c33452fbSAndroid Build Coastguard Worker template <>
739*c33452fbSAndroid Build Coastguard Worker struct buffer_types_base<false>
740*c33452fbSAndroid Build Coastguard Worker {
741*c33452fbSAndroid Build Coastguard Worker typedef mutable_buffer buffer_type;
742*c33452fbSAndroid Build Coastguard Worker typedef mutable_buffers_1 container_type;
743*c33452fbSAndroid Build Coastguard Worker };
744*c33452fbSAndroid Build Coastguard Worker
745*c33452fbSAndroid Build Coastguard Worker template <>
746*c33452fbSAndroid Build Coastguard Worker struct buffer_types_base<true>
747*c33452fbSAndroid Build Coastguard Worker {
748*c33452fbSAndroid Build Coastguard Worker typedef const_buffer buffer_type;
749*c33452fbSAndroid Build Coastguard Worker typedef const_buffers_1 container_type;
750*c33452fbSAndroid Build Coastguard Worker };
751*c33452fbSAndroid Build Coastguard Worker
752*c33452fbSAndroid Build Coastguard Worker template <typename PodType>
753*c33452fbSAndroid Build Coastguard Worker struct buffer_types
754*c33452fbSAndroid Build Coastguard Worker : public buffer_types_base<is_const<PodType>::value>
755*c33452fbSAndroid Build Coastguard Worker {
756*c33452fbSAndroid Build Coastguard Worker };
757*c33452fbSAndroid Build Coastguard Worker
758*c33452fbSAndroid Build Coastguard Worker } // namespace detail
759*c33452fbSAndroid Build Coastguard Worker
760*c33452fbSAndroid Build Coastguard Worker template <typename PodType, std::size_t N>
761*c33452fbSAndroid Build Coastguard Worker inline typename detail::buffer_types<PodType>::container_type
buffer(boost::array<PodType,N> & data)762*c33452fbSAndroid Build Coastguard Worker buffer(boost::array<PodType, N>& data)
763*c33452fbSAndroid Build Coastguard Worker {
764*c33452fbSAndroid Build Coastguard Worker typedef typename asio::detail::buffer_types<PodType>::buffer_type
765*c33452fbSAndroid Build Coastguard Worker buffer_type;
766*c33452fbSAndroid Build Coastguard Worker typedef typename asio::detail::buffer_types<PodType>::container_type
767*c33452fbSAndroid Build Coastguard Worker container_type;
768*c33452fbSAndroid Build Coastguard Worker return container_type(
769*c33452fbSAndroid Build Coastguard Worker buffer_type(data.c_array(), data.size() * sizeof(PodType)));
770*c33452fbSAndroid Build Coastguard Worker }
771*c33452fbSAndroid Build Coastguard Worker
772*c33452fbSAndroid Build Coastguard Worker template <typename PodType, std::size_t N>
773*c33452fbSAndroid Build Coastguard Worker inline typename detail::buffer_types<PodType>::container_type
buffer(boost::array<PodType,N> & data,std::size_t max_size_in_bytes)774*c33452fbSAndroid Build Coastguard Worker buffer(boost::array<PodType, N>& data, std::size_t max_size_in_bytes)
775*c33452fbSAndroid Build Coastguard Worker {
776*c33452fbSAndroid Build Coastguard Worker typedef typename asio::detail::buffer_types<PodType>::buffer_type
777*c33452fbSAndroid Build Coastguard Worker buffer_type;
778*c33452fbSAndroid Build Coastguard Worker typedef typename asio::detail::buffer_types<PodType>::container_type
779*c33452fbSAndroid Build Coastguard Worker container_type;
780*c33452fbSAndroid Build Coastguard Worker return container_type(
781*c33452fbSAndroid Build Coastguard Worker buffer_type(data.c_array(),
782*c33452fbSAndroid Build Coastguard Worker data.size() * sizeof(PodType) < max_size_in_bytes
783*c33452fbSAndroid Build Coastguard Worker ? data.size() * sizeof(PodType) : max_size_in_bytes));
784*c33452fbSAndroid Build Coastguard Worker }
785*c33452fbSAndroid Build Coastguard Worker
786*c33452fbSAndroid Build Coastguard Worker #else // defined(ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND)
787*c33452fbSAndroid Build Coastguard Worker
788*c33452fbSAndroid Build Coastguard Worker /// Create a new modifiable buffer that represents the given POD array.
789*c33452fbSAndroid Build Coastguard Worker /**
790*c33452fbSAndroid Build Coastguard Worker * @returns A mutable_buffers_1 value equivalent to:
791*c33452fbSAndroid Build Coastguard Worker * @code mutable_buffers_1(
792*c33452fbSAndroid Build Coastguard Worker * data.data(),
793*c33452fbSAndroid Build Coastguard Worker * data.size() * sizeof(PodType)); @endcode
794*c33452fbSAndroid Build Coastguard Worker */
795*c33452fbSAndroid Build Coastguard Worker template <typename PodType, std::size_t N>
buffer(boost::array<PodType,N> & data)796*c33452fbSAndroid Build Coastguard Worker inline mutable_buffers_1 buffer(boost::array<PodType, N>& data)
797*c33452fbSAndroid Build Coastguard Worker {
798*c33452fbSAndroid Build Coastguard Worker return mutable_buffers_1(
799*c33452fbSAndroid Build Coastguard Worker mutable_buffer(data.c_array(), data.size() * sizeof(PodType)));
800*c33452fbSAndroid Build Coastguard Worker }
801*c33452fbSAndroid Build Coastguard Worker
802*c33452fbSAndroid Build Coastguard Worker /// Create a new modifiable buffer that represents the given POD array.
803*c33452fbSAndroid Build Coastguard Worker /**
804*c33452fbSAndroid Build Coastguard Worker * @returns A mutable_buffers_1 value equivalent to:
805*c33452fbSAndroid Build Coastguard Worker * @code mutable_buffers_1(
806*c33452fbSAndroid Build Coastguard Worker * data.data(),
807*c33452fbSAndroid Build Coastguard Worker * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode
808*c33452fbSAndroid Build Coastguard Worker */
809*c33452fbSAndroid Build Coastguard Worker template <typename PodType, std::size_t N>
buffer(boost::array<PodType,N> & data,std::size_t max_size_in_bytes)810*c33452fbSAndroid Build Coastguard Worker inline mutable_buffers_1 buffer(boost::array<PodType, N>& data,
811*c33452fbSAndroid Build Coastguard Worker std::size_t max_size_in_bytes)
812*c33452fbSAndroid Build Coastguard Worker {
813*c33452fbSAndroid Build Coastguard Worker return mutable_buffers_1(
814*c33452fbSAndroid Build Coastguard Worker mutable_buffer(data.c_array(),
815*c33452fbSAndroid Build Coastguard Worker data.size() * sizeof(PodType) < max_size_in_bytes
816*c33452fbSAndroid Build Coastguard Worker ? data.size() * sizeof(PodType) : max_size_in_bytes));
817*c33452fbSAndroid Build Coastguard Worker }
818*c33452fbSAndroid Build Coastguard Worker
819*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer that represents the given POD array.
820*c33452fbSAndroid Build Coastguard Worker /**
821*c33452fbSAndroid Build Coastguard Worker * @returns A const_buffers_1 value equivalent to:
822*c33452fbSAndroid Build Coastguard Worker * @code const_buffers_1(
823*c33452fbSAndroid Build Coastguard Worker * data.data(),
824*c33452fbSAndroid Build Coastguard Worker * data.size() * sizeof(PodType)); @endcode
825*c33452fbSAndroid Build Coastguard Worker */
826*c33452fbSAndroid Build Coastguard Worker template <typename PodType, std::size_t N>
buffer(boost::array<const PodType,N> & data)827*c33452fbSAndroid Build Coastguard Worker inline const_buffers_1 buffer(boost::array<const PodType, N>& data)
828*c33452fbSAndroid Build Coastguard Worker {
829*c33452fbSAndroid Build Coastguard Worker return const_buffers_1(
830*c33452fbSAndroid Build Coastguard Worker const_buffer(data.data(), data.size() * sizeof(PodType)));
831*c33452fbSAndroid Build Coastguard Worker }
832*c33452fbSAndroid Build Coastguard Worker
833*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer that represents the given POD array.
834*c33452fbSAndroid Build Coastguard Worker /**
835*c33452fbSAndroid Build Coastguard Worker * @returns A const_buffers_1 value equivalent to:
836*c33452fbSAndroid Build Coastguard Worker * @code const_buffers_1(
837*c33452fbSAndroid Build Coastguard Worker * data.data(),
838*c33452fbSAndroid Build Coastguard Worker * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode
839*c33452fbSAndroid Build Coastguard Worker */
840*c33452fbSAndroid Build Coastguard Worker template <typename PodType, std::size_t N>
buffer(boost::array<const PodType,N> & data,std::size_t max_size_in_bytes)841*c33452fbSAndroid Build Coastguard Worker inline const_buffers_1 buffer(boost::array<const PodType, N>& data,
842*c33452fbSAndroid Build Coastguard Worker std::size_t max_size_in_bytes)
843*c33452fbSAndroid Build Coastguard Worker {
844*c33452fbSAndroid Build Coastguard Worker return const_buffers_1(
845*c33452fbSAndroid Build Coastguard Worker const_buffer(data.data(),
846*c33452fbSAndroid Build Coastguard Worker data.size() * sizeof(PodType) < max_size_in_bytes
847*c33452fbSAndroid Build Coastguard Worker ? data.size() * sizeof(PodType) : max_size_in_bytes));
848*c33452fbSAndroid Build Coastguard Worker }
849*c33452fbSAndroid Build Coastguard Worker
850*c33452fbSAndroid Build Coastguard Worker #endif // defined(ASIO_ENABLE_ARRAY_BUFFER_WORKAROUND)
851*c33452fbSAndroid Build Coastguard Worker
852*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer that represents the given POD array.
853*c33452fbSAndroid Build Coastguard Worker /**
854*c33452fbSAndroid Build Coastguard Worker * @returns A const_buffers_1 value equivalent to:
855*c33452fbSAndroid Build Coastguard Worker * @code const_buffers_1(
856*c33452fbSAndroid Build Coastguard Worker * data.data(),
857*c33452fbSAndroid Build Coastguard Worker * data.size() * sizeof(PodType)); @endcode
858*c33452fbSAndroid Build Coastguard Worker */
859*c33452fbSAndroid Build Coastguard Worker template <typename PodType, std::size_t N>
buffer(const boost::array<PodType,N> & data)860*c33452fbSAndroid Build Coastguard Worker inline const_buffers_1 buffer(const boost::array<PodType, N>& data)
861*c33452fbSAndroid Build Coastguard Worker {
862*c33452fbSAndroid Build Coastguard Worker return const_buffers_1(
863*c33452fbSAndroid Build Coastguard Worker const_buffer(data.data(), data.size() * sizeof(PodType)));
864*c33452fbSAndroid Build Coastguard Worker }
865*c33452fbSAndroid Build Coastguard Worker
866*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer that represents the given POD array.
867*c33452fbSAndroid Build Coastguard Worker /**
868*c33452fbSAndroid Build Coastguard Worker * @returns A const_buffers_1 value equivalent to:
869*c33452fbSAndroid Build Coastguard Worker * @code const_buffers_1(
870*c33452fbSAndroid Build Coastguard Worker * data.data(),
871*c33452fbSAndroid Build Coastguard Worker * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode
872*c33452fbSAndroid Build Coastguard Worker */
873*c33452fbSAndroid Build Coastguard Worker template <typename PodType, std::size_t N>
buffer(const boost::array<PodType,N> & data,std::size_t max_size_in_bytes)874*c33452fbSAndroid Build Coastguard Worker inline const_buffers_1 buffer(const boost::array<PodType, N>& data,
875*c33452fbSAndroid Build Coastguard Worker std::size_t max_size_in_bytes)
876*c33452fbSAndroid Build Coastguard Worker {
877*c33452fbSAndroid Build Coastguard Worker return const_buffers_1(
878*c33452fbSAndroid Build Coastguard Worker const_buffer(data.data(),
879*c33452fbSAndroid Build Coastguard Worker data.size() * sizeof(PodType) < max_size_in_bytes
880*c33452fbSAndroid Build Coastguard Worker ? data.size() * sizeof(PodType) : max_size_in_bytes));
881*c33452fbSAndroid Build Coastguard Worker }
882*c33452fbSAndroid Build Coastguard Worker
883*c33452fbSAndroid Build Coastguard Worker
884*c33452fbSAndroid Build Coastguard Worker /// Create a new modifiable buffer that represents the given POD array.
885*c33452fbSAndroid Build Coastguard Worker /**
886*c33452fbSAndroid Build Coastguard Worker * @returns A mutable_buffers_1 value equivalent to:
887*c33452fbSAndroid Build Coastguard Worker * @code mutable_buffers_1(
888*c33452fbSAndroid Build Coastguard Worker * data.data(),
889*c33452fbSAndroid Build Coastguard Worker * data.size() * sizeof(PodType)); @endcode
890*c33452fbSAndroid Build Coastguard Worker */
891*c33452fbSAndroid Build Coastguard Worker template <typename PodType, std::size_t N>
buffer(std::array<PodType,N> & data)892*c33452fbSAndroid Build Coastguard Worker inline mutable_buffers_1 buffer(std::array<PodType, N>& data)
893*c33452fbSAndroid Build Coastguard Worker {
894*c33452fbSAndroid Build Coastguard Worker return mutable_buffers_1(
895*c33452fbSAndroid Build Coastguard Worker mutable_buffer(data.data(), data.size() * sizeof(PodType)));
896*c33452fbSAndroid Build Coastguard Worker }
897*c33452fbSAndroid Build Coastguard Worker
898*c33452fbSAndroid Build Coastguard Worker /// Create a new modifiable buffer that represents the given POD array.
899*c33452fbSAndroid Build Coastguard Worker /**
900*c33452fbSAndroid Build Coastguard Worker * @returns A mutable_buffers_1 value equivalent to:
901*c33452fbSAndroid Build Coastguard Worker * @code mutable_buffers_1(
902*c33452fbSAndroid Build Coastguard Worker * data.data(),
903*c33452fbSAndroid Build Coastguard Worker * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode
904*c33452fbSAndroid Build Coastguard Worker */
905*c33452fbSAndroid Build Coastguard Worker template <typename PodType, std::size_t N>
buffer(std::array<PodType,N> & data,std::size_t max_size_in_bytes)906*c33452fbSAndroid Build Coastguard Worker inline mutable_buffers_1 buffer(std::array<PodType, N>& data,
907*c33452fbSAndroid Build Coastguard Worker std::size_t max_size_in_bytes)
908*c33452fbSAndroid Build Coastguard Worker {
909*c33452fbSAndroid Build Coastguard Worker return mutable_buffers_1(
910*c33452fbSAndroid Build Coastguard Worker mutable_buffer(data.data(),
911*c33452fbSAndroid Build Coastguard Worker data.size() * sizeof(PodType) < max_size_in_bytes
912*c33452fbSAndroid Build Coastguard Worker ? data.size() * sizeof(PodType) : max_size_in_bytes));
913*c33452fbSAndroid Build Coastguard Worker }
914*c33452fbSAndroid Build Coastguard Worker
915*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer that represents the given POD array.
916*c33452fbSAndroid Build Coastguard Worker /**
917*c33452fbSAndroid Build Coastguard Worker * @returns A const_buffers_1 value equivalent to:
918*c33452fbSAndroid Build Coastguard Worker * @code const_buffers_1(
919*c33452fbSAndroid Build Coastguard Worker * data.data(),
920*c33452fbSAndroid Build Coastguard Worker * data.size() * sizeof(PodType)); @endcode
921*c33452fbSAndroid Build Coastguard Worker */
922*c33452fbSAndroid Build Coastguard Worker template <typename PodType, std::size_t N>
buffer(std::array<const PodType,N> & data)923*c33452fbSAndroid Build Coastguard Worker inline const_buffers_1 buffer(std::array<const PodType, N>& data)
924*c33452fbSAndroid Build Coastguard Worker {
925*c33452fbSAndroid Build Coastguard Worker return const_buffers_1(
926*c33452fbSAndroid Build Coastguard Worker const_buffer(data.data(), data.size() * sizeof(PodType)));
927*c33452fbSAndroid Build Coastguard Worker }
928*c33452fbSAndroid Build Coastguard Worker
929*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer that represents the given POD array.
930*c33452fbSAndroid Build Coastguard Worker /**
931*c33452fbSAndroid Build Coastguard Worker * @returns A const_buffers_1 value equivalent to:
932*c33452fbSAndroid Build Coastguard Worker * @code const_buffers_1(
933*c33452fbSAndroid Build Coastguard Worker * data.data(),
934*c33452fbSAndroid Build Coastguard Worker * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode
935*c33452fbSAndroid Build Coastguard Worker */
936*c33452fbSAndroid Build Coastguard Worker template <typename PodType, std::size_t N>
buffer(std::array<const PodType,N> & data,std::size_t max_size_in_bytes)937*c33452fbSAndroid Build Coastguard Worker inline const_buffers_1 buffer(std::array<const PodType, N>& data,
938*c33452fbSAndroid Build Coastguard Worker std::size_t max_size_in_bytes)
939*c33452fbSAndroid Build Coastguard Worker {
940*c33452fbSAndroid Build Coastguard Worker return const_buffers_1(
941*c33452fbSAndroid Build Coastguard Worker const_buffer(data.data(),
942*c33452fbSAndroid Build Coastguard Worker data.size() * sizeof(PodType) < max_size_in_bytes
943*c33452fbSAndroid Build Coastguard Worker ? data.size() * sizeof(PodType) : max_size_in_bytes));
944*c33452fbSAndroid Build Coastguard Worker }
945*c33452fbSAndroid Build Coastguard Worker
946*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer that represents the given POD array.
947*c33452fbSAndroid Build Coastguard Worker /**
948*c33452fbSAndroid Build Coastguard Worker * @returns A const_buffers_1 value equivalent to:
949*c33452fbSAndroid Build Coastguard Worker * @code const_buffers_1(
950*c33452fbSAndroid Build Coastguard Worker * data.data(),
951*c33452fbSAndroid Build Coastguard Worker * data.size() * sizeof(PodType)); @endcode
952*c33452fbSAndroid Build Coastguard Worker */
953*c33452fbSAndroid Build Coastguard Worker template <typename PodType, std::size_t N>
buffer(const std::array<PodType,N> & data)954*c33452fbSAndroid Build Coastguard Worker inline const_buffers_1 buffer(const std::array<PodType, N>& data)
955*c33452fbSAndroid Build Coastguard Worker {
956*c33452fbSAndroid Build Coastguard Worker return const_buffers_1(
957*c33452fbSAndroid Build Coastguard Worker const_buffer(data.data(), data.size() * sizeof(PodType)));
958*c33452fbSAndroid Build Coastguard Worker }
959*c33452fbSAndroid Build Coastguard Worker
960*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer that represents the given POD array.
961*c33452fbSAndroid Build Coastguard Worker /**
962*c33452fbSAndroid Build Coastguard Worker * @returns A const_buffers_1 value equivalent to:
963*c33452fbSAndroid Build Coastguard Worker * @code const_buffers_1(
964*c33452fbSAndroid Build Coastguard Worker * data.data(),
965*c33452fbSAndroid Build Coastguard Worker * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode
966*c33452fbSAndroid Build Coastguard Worker */
967*c33452fbSAndroid Build Coastguard Worker template <typename PodType, std::size_t N>
buffer(const std::array<PodType,N> & data,std::size_t max_size_in_bytes)968*c33452fbSAndroid Build Coastguard Worker inline const_buffers_1 buffer(const std::array<PodType, N>& data,
969*c33452fbSAndroid Build Coastguard Worker std::size_t max_size_in_bytes)
970*c33452fbSAndroid Build Coastguard Worker {
971*c33452fbSAndroid Build Coastguard Worker return const_buffers_1(
972*c33452fbSAndroid Build Coastguard Worker const_buffer(data.data(),
973*c33452fbSAndroid Build Coastguard Worker data.size() * sizeof(PodType) < max_size_in_bytes
974*c33452fbSAndroid Build Coastguard Worker ? data.size() * sizeof(PodType) : max_size_in_bytes));
975*c33452fbSAndroid Build Coastguard Worker }
976*c33452fbSAndroid Build Coastguard Worker
977*c33452fbSAndroid Build Coastguard Worker
978*c33452fbSAndroid Build Coastguard Worker /// Create a new modifiable buffer that represents the given POD vector.
979*c33452fbSAndroid Build Coastguard Worker /**
980*c33452fbSAndroid Build Coastguard Worker * @returns A mutable_buffers_1 value equivalent to:
981*c33452fbSAndroid Build Coastguard Worker * @code mutable_buffers_1(
982*c33452fbSAndroid Build Coastguard Worker * data.size() ? &data[0] : 0,
983*c33452fbSAndroid Build Coastguard Worker * data.size() * sizeof(PodType)); @endcode
984*c33452fbSAndroid Build Coastguard Worker *
985*c33452fbSAndroid Build Coastguard Worker * @note The buffer is invalidated by any vector operation that would also
986*c33452fbSAndroid Build Coastguard Worker * invalidate iterators.
987*c33452fbSAndroid Build Coastguard Worker */
988*c33452fbSAndroid Build Coastguard Worker template <typename PodType, typename Allocator>
buffer(std::vector<PodType,Allocator> & data)989*c33452fbSAndroid Build Coastguard Worker inline mutable_buffers_1 buffer(std::vector<PodType, Allocator>& data)
990*c33452fbSAndroid Build Coastguard Worker {
991*c33452fbSAndroid Build Coastguard Worker return mutable_buffers_1(
992*c33452fbSAndroid Build Coastguard Worker mutable_buffer(data.size() ? &data[0] : 0, data.size() * sizeof(PodType)
993*c33452fbSAndroid Build Coastguard Worker ));
994*c33452fbSAndroid Build Coastguard Worker }
995*c33452fbSAndroid Build Coastguard Worker
996*c33452fbSAndroid Build Coastguard Worker /// Create a new modifiable buffer that represents the given POD vector.
997*c33452fbSAndroid Build Coastguard Worker /**
998*c33452fbSAndroid Build Coastguard Worker * @returns A mutable_buffers_1 value equivalent to:
999*c33452fbSAndroid Build Coastguard Worker * @code mutable_buffers_1(
1000*c33452fbSAndroid Build Coastguard Worker * data.size() ? &data[0] : 0,
1001*c33452fbSAndroid Build Coastguard Worker * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode
1002*c33452fbSAndroid Build Coastguard Worker *
1003*c33452fbSAndroid Build Coastguard Worker * @note The buffer is invalidated by any vector operation that would also
1004*c33452fbSAndroid Build Coastguard Worker * invalidate iterators.
1005*c33452fbSAndroid Build Coastguard Worker */
1006*c33452fbSAndroid Build Coastguard Worker template <typename PodType, typename Allocator>
buffer(std::vector<PodType,Allocator> & data,std::size_t max_size_in_bytes)1007*c33452fbSAndroid Build Coastguard Worker inline mutable_buffers_1 buffer(std::vector<PodType, Allocator>& data,
1008*c33452fbSAndroid Build Coastguard Worker std::size_t max_size_in_bytes)
1009*c33452fbSAndroid Build Coastguard Worker {
1010*c33452fbSAndroid Build Coastguard Worker return mutable_buffers_1(
1011*c33452fbSAndroid Build Coastguard Worker mutable_buffer(data.size() ? &data[0] : 0,
1012*c33452fbSAndroid Build Coastguard Worker data.size() * sizeof(PodType) < max_size_in_bytes
1013*c33452fbSAndroid Build Coastguard Worker ? data.size() * sizeof(PodType) : max_size_in_bytes
1014*c33452fbSAndroid Build Coastguard Worker ));
1015*c33452fbSAndroid Build Coastguard Worker }
1016*c33452fbSAndroid Build Coastguard Worker
1017*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer that represents the given POD vector.
1018*c33452fbSAndroid Build Coastguard Worker /**
1019*c33452fbSAndroid Build Coastguard Worker * @returns A const_buffers_1 value equivalent to:
1020*c33452fbSAndroid Build Coastguard Worker * @code const_buffers_1(
1021*c33452fbSAndroid Build Coastguard Worker * data.size() ? &data[0] : 0,
1022*c33452fbSAndroid Build Coastguard Worker * data.size() * sizeof(PodType)); @endcode
1023*c33452fbSAndroid Build Coastguard Worker *
1024*c33452fbSAndroid Build Coastguard Worker * @note The buffer is invalidated by any vector operation that would also
1025*c33452fbSAndroid Build Coastguard Worker * invalidate iterators.
1026*c33452fbSAndroid Build Coastguard Worker */
1027*c33452fbSAndroid Build Coastguard Worker template <typename PodType, typename Allocator>
buffer(const std::vector<PodType,Allocator> & data)1028*c33452fbSAndroid Build Coastguard Worker inline const_buffers_1 buffer(
1029*c33452fbSAndroid Build Coastguard Worker const std::vector<PodType, Allocator>& data)
1030*c33452fbSAndroid Build Coastguard Worker {
1031*c33452fbSAndroid Build Coastguard Worker return const_buffers_1(
1032*c33452fbSAndroid Build Coastguard Worker const_buffer(data.size() ? &data[0] : 0, data.size() * sizeof(PodType)
1033*c33452fbSAndroid Build Coastguard Worker ));
1034*c33452fbSAndroid Build Coastguard Worker }
1035*c33452fbSAndroid Build Coastguard Worker
1036*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer that represents the given POD vector.
1037*c33452fbSAndroid Build Coastguard Worker /**
1038*c33452fbSAndroid Build Coastguard Worker * @returns A const_buffers_1 value equivalent to:
1039*c33452fbSAndroid Build Coastguard Worker * @code const_buffers_1(
1040*c33452fbSAndroid Build Coastguard Worker * data.size() ? &data[0] : 0,
1041*c33452fbSAndroid Build Coastguard Worker * min(data.size() * sizeof(PodType), max_size_in_bytes)); @endcode
1042*c33452fbSAndroid Build Coastguard Worker *
1043*c33452fbSAndroid Build Coastguard Worker * @note The buffer is invalidated by any vector operation that would also
1044*c33452fbSAndroid Build Coastguard Worker * invalidate iterators.
1045*c33452fbSAndroid Build Coastguard Worker */
1046*c33452fbSAndroid Build Coastguard Worker template <typename PodType, typename Allocator>
buffer(const std::vector<PodType,Allocator> & data,std::size_t max_size_in_bytes)1047*c33452fbSAndroid Build Coastguard Worker inline const_buffers_1 buffer(
1048*c33452fbSAndroid Build Coastguard Worker const std::vector<PodType, Allocator>& data, std::size_t max_size_in_bytes)
1049*c33452fbSAndroid Build Coastguard Worker {
1050*c33452fbSAndroid Build Coastguard Worker return const_buffers_1(
1051*c33452fbSAndroid Build Coastguard Worker const_buffer(data.size() ? &data[0] : 0,
1052*c33452fbSAndroid Build Coastguard Worker data.size() * sizeof(PodType) < max_size_in_bytes
1053*c33452fbSAndroid Build Coastguard Worker ? data.size() * sizeof(PodType) : max_size_in_bytes
1054*c33452fbSAndroid Build Coastguard Worker ));
1055*c33452fbSAndroid Build Coastguard Worker }
1056*c33452fbSAndroid Build Coastguard Worker
1057*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer that represents the given string.
1058*c33452fbSAndroid Build Coastguard Worker /**
1059*c33452fbSAndroid Build Coastguard Worker * @returns <tt>const_buffers_1(data.data(), data.size() * sizeof(Elem))</tt>.
1060*c33452fbSAndroid Build Coastguard Worker *
1061*c33452fbSAndroid Build Coastguard Worker * @note The buffer is invalidated by any non-const operation called on the
1062*c33452fbSAndroid Build Coastguard Worker * given string object.
1063*c33452fbSAndroid Build Coastguard Worker */
1064*c33452fbSAndroid Build Coastguard Worker template <typename Elem, typename Traits, typename Allocator>
buffer(const std::basic_string<Elem,Traits,Allocator> & data)1065*c33452fbSAndroid Build Coastguard Worker inline const_buffers_1 buffer(
1066*c33452fbSAndroid Build Coastguard Worker const std::basic_string<Elem, Traits, Allocator>& data)
1067*c33452fbSAndroid Build Coastguard Worker {
1068*c33452fbSAndroid Build Coastguard Worker return const_buffers_1(const_buffer(data.data(), data.size() * sizeof(Elem)
1069*c33452fbSAndroid Build Coastguard Worker ));
1070*c33452fbSAndroid Build Coastguard Worker }
1071*c33452fbSAndroid Build Coastguard Worker
1072*c33452fbSAndroid Build Coastguard Worker /// Create a new non-modifiable buffer that represents the given string.
1073*c33452fbSAndroid Build Coastguard Worker /**
1074*c33452fbSAndroid Build Coastguard Worker * @returns A const_buffers_1 value equivalent to:
1075*c33452fbSAndroid Build Coastguard Worker * @code const_buffers_1(
1076*c33452fbSAndroid Build Coastguard Worker * data.data(),
1077*c33452fbSAndroid Build Coastguard Worker * min(data.size() * sizeof(Elem), max_size_in_bytes)); @endcode
1078*c33452fbSAndroid Build Coastguard Worker *
1079*c33452fbSAndroid Build Coastguard Worker * @note The buffer is invalidated by any non-const operation called on the
1080*c33452fbSAndroid Build Coastguard Worker * given string object.
1081*c33452fbSAndroid Build Coastguard Worker */
1082*c33452fbSAndroid Build Coastguard Worker template <typename Elem, typename Traits, typename Allocator>
buffer(const std::basic_string<Elem,Traits,Allocator> & data,std::size_t max_size_in_bytes)1083*c33452fbSAndroid Build Coastguard Worker inline const_buffers_1 buffer(
1084*c33452fbSAndroid Build Coastguard Worker const std::basic_string<Elem, Traits, Allocator>& data,
1085*c33452fbSAndroid Build Coastguard Worker std::size_t max_size_in_bytes)
1086*c33452fbSAndroid Build Coastguard Worker {
1087*c33452fbSAndroid Build Coastguard Worker return const_buffers_1(
1088*c33452fbSAndroid Build Coastguard Worker const_buffer(data.data(),
1089*c33452fbSAndroid Build Coastguard Worker data.size() * sizeof(Elem) < max_size_in_bytes
1090*c33452fbSAndroid Build Coastguard Worker ? data.size() * sizeof(Elem) : max_size_in_bytes
1091*c33452fbSAndroid Build Coastguard Worker ));
1092*c33452fbSAndroid Build Coastguard Worker }
1093*c33452fbSAndroid Build Coastguard Worker
1094*c33452fbSAndroid Build Coastguard Worker /*@}*/
1095*c33452fbSAndroid Build Coastguard Worker
1096*c33452fbSAndroid Build Coastguard Worker /** @defgroup buffer_copy asio::buffer_copy
1097*c33452fbSAndroid Build Coastguard Worker *
1098*c33452fbSAndroid Build Coastguard Worker * @brief The asio::buffer_copy function is used to copy bytes from a
1099*c33452fbSAndroid Build Coastguard Worker * source buffer (or buffer sequence) to a target buffer (or buffer sequence).
1100*c33452fbSAndroid Build Coastguard Worker *
1101*c33452fbSAndroid Build Coastguard Worker * The @c buffer_copy function is available in two forms:
1102*c33452fbSAndroid Build Coastguard Worker *
1103*c33452fbSAndroid Build Coastguard Worker * @li A 2-argument form: @c buffer_copy(target, source)
1104*c33452fbSAndroid Build Coastguard Worker *
1105*c33452fbSAndroid Build Coastguard Worker * @li A 3-argument form: @c buffer_copy(target, source, max_bytes_to_copy)
1106*c33452fbSAndroid Build Coastguard Worker
1107*c33452fbSAndroid Build Coastguard Worker * Both forms return the number of bytes actually copied. The number of bytes
1108*c33452fbSAndroid Build Coastguard Worker * copied is the lesser of:
1109*c33452fbSAndroid Build Coastguard Worker *
1110*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1111*c33452fbSAndroid Build Coastguard Worker *
1112*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1113*c33452fbSAndroid Build Coastguard Worker *
1114*c33452fbSAndroid Build Coastguard Worker * @li @c If specified, @c max_bytes_to_copy.
1115*c33452fbSAndroid Build Coastguard Worker *
1116*c33452fbSAndroid Build Coastguard Worker * This prevents buffer overflow, regardless of the buffer sizes used in the
1117*c33452fbSAndroid Build Coastguard Worker * copy operation.
1118*c33452fbSAndroid Build Coastguard Worker *
1119*c33452fbSAndroid Build Coastguard Worker * Note that @ref buffer_copy is implemented in terms of @c memcpy, and
1120*c33452fbSAndroid Build Coastguard Worker * consequently it cannot be used to copy between overlapping memory regions.
1121*c33452fbSAndroid Build Coastguard Worker */
1122*c33452fbSAndroid Build Coastguard Worker /*@{*/
1123*c33452fbSAndroid Build Coastguard Worker
1124*c33452fbSAndroid Build Coastguard Worker /// Copies bytes from a source buffer to a target buffer.
1125*c33452fbSAndroid Build Coastguard Worker /**
1126*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1127*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1128*c33452fbSAndroid Build Coastguard Worker *
1129*c33452fbSAndroid Build Coastguard Worker * @param source A non-modifiable buffer representing the memory region from
1130*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1131*c33452fbSAndroid Build Coastguard Worker *
1132*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1133*c33452fbSAndroid Build Coastguard Worker *
1134*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1135*c33452fbSAndroid Build Coastguard Worker *
1136*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1137*c33452fbSAndroid Build Coastguard Worker *
1138*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1139*c33452fbSAndroid Build Coastguard Worker *
1140*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1141*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1142*c33452fbSAndroid Build Coastguard Worker */
buffer_copy(const mutable_buffer & target,const const_buffer & source)1143*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffer& target,
1144*c33452fbSAndroid Build Coastguard Worker const const_buffer& source)
1145*c33452fbSAndroid Build Coastguard Worker {
1146*c33452fbSAndroid Build Coastguard Worker using namespace std; // For memcpy.
1147*c33452fbSAndroid Build Coastguard Worker std::size_t target_size = buffer_size(target);
1148*c33452fbSAndroid Build Coastguard Worker std::size_t source_size = buffer_size(source);
1149*c33452fbSAndroid Build Coastguard Worker std::size_t n = target_size < source_size ? target_size : source_size;
1150*c33452fbSAndroid Build Coastguard Worker memcpy(buffer_cast<void*>(target), buffer_cast<const void*>(source), n);
1151*c33452fbSAndroid Build Coastguard Worker return n;
1152*c33452fbSAndroid Build Coastguard Worker }
1153*c33452fbSAndroid Build Coastguard Worker
1154*c33452fbSAndroid Build Coastguard Worker /// Copies bytes from a source buffer to a target buffer.
1155*c33452fbSAndroid Build Coastguard Worker /**
1156*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1157*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1158*c33452fbSAndroid Build Coastguard Worker *
1159*c33452fbSAndroid Build Coastguard Worker * @param source A non-modifiable buffer representing the memory region from
1160*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1161*c33452fbSAndroid Build Coastguard Worker *
1162*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1163*c33452fbSAndroid Build Coastguard Worker *
1164*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1165*c33452fbSAndroid Build Coastguard Worker *
1166*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1167*c33452fbSAndroid Build Coastguard Worker *
1168*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1169*c33452fbSAndroid Build Coastguard Worker *
1170*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1171*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1172*c33452fbSAndroid Build Coastguard Worker */
buffer_copy(const mutable_buffer & target,const const_buffers_1 & source)1173*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffer& target,
1174*c33452fbSAndroid Build Coastguard Worker const const_buffers_1& source)
1175*c33452fbSAndroid Build Coastguard Worker {
1176*c33452fbSAndroid Build Coastguard Worker return buffer_copy(target, static_cast<const const_buffer&>(source));
1177*c33452fbSAndroid Build Coastguard Worker }
1178*c33452fbSAndroid Build Coastguard Worker
1179*c33452fbSAndroid Build Coastguard Worker /// Copies bytes from a source buffer to a target buffer.
1180*c33452fbSAndroid Build Coastguard Worker /**
1181*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1182*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1183*c33452fbSAndroid Build Coastguard Worker *
1184*c33452fbSAndroid Build Coastguard Worker * @param source A modifiable buffer representing the memory region from which
1185*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied. The contents of the source buffer will not be
1186*c33452fbSAndroid Build Coastguard Worker * modified.
1187*c33452fbSAndroid Build Coastguard Worker *
1188*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1189*c33452fbSAndroid Build Coastguard Worker *
1190*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1191*c33452fbSAndroid Build Coastguard Worker *
1192*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1193*c33452fbSAndroid Build Coastguard Worker *
1194*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1195*c33452fbSAndroid Build Coastguard Worker *
1196*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1197*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1198*c33452fbSAndroid Build Coastguard Worker */
buffer_copy(const mutable_buffer & target,const mutable_buffer & source)1199*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffer& target,
1200*c33452fbSAndroid Build Coastguard Worker const mutable_buffer& source)
1201*c33452fbSAndroid Build Coastguard Worker {
1202*c33452fbSAndroid Build Coastguard Worker return buffer_copy(target, const_buffer(source));
1203*c33452fbSAndroid Build Coastguard Worker }
1204*c33452fbSAndroid Build Coastguard Worker
1205*c33452fbSAndroid Build Coastguard Worker /// Copies bytes from a source buffer to a target buffer.
1206*c33452fbSAndroid Build Coastguard Worker /**
1207*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1208*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1209*c33452fbSAndroid Build Coastguard Worker *
1210*c33452fbSAndroid Build Coastguard Worker * @param source A modifiable buffer representing the memory region from which
1211*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied. The contents of the source buffer will not be
1212*c33452fbSAndroid Build Coastguard Worker * modified.
1213*c33452fbSAndroid Build Coastguard Worker *
1214*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1215*c33452fbSAndroid Build Coastguard Worker *
1216*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1217*c33452fbSAndroid Build Coastguard Worker *
1218*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1219*c33452fbSAndroid Build Coastguard Worker *
1220*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1221*c33452fbSAndroid Build Coastguard Worker *
1222*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1223*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1224*c33452fbSAndroid Build Coastguard Worker */
buffer_copy(const mutable_buffer & target,const mutable_buffers_1 & source)1225*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffer& target,
1226*c33452fbSAndroid Build Coastguard Worker const mutable_buffers_1& source)
1227*c33452fbSAndroid Build Coastguard Worker {
1228*c33452fbSAndroid Build Coastguard Worker return buffer_copy(target, const_buffer(source));
1229*c33452fbSAndroid Build Coastguard Worker }
1230*c33452fbSAndroid Build Coastguard Worker
1231*c33452fbSAndroid Build Coastguard Worker /// Copies bytes from a source buffer sequence to a target buffer.
1232*c33452fbSAndroid Build Coastguard Worker /**
1233*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1234*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1235*c33452fbSAndroid Build Coastguard Worker *
1236*c33452fbSAndroid Build Coastguard Worker * @param source A non-modifiable buffer sequence representing the memory
1237*c33452fbSAndroid Build Coastguard Worker * regions from which the bytes will be copied.
1238*c33452fbSAndroid Build Coastguard Worker *
1239*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1240*c33452fbSAndroid Build Coastguard Worker *
1241*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1242*c33452fbSAndroid Build Coastguard Worker *
1243*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1244*c33452fbSAndroid Build Coastguard Worker *
1245*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1246*c33452fbSAndroid Build Coastguard Worker *
1247*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1248*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1249*c33452fbSAndroid Build Coastguard Worker */
1250*c33452fbSAndroid Build Coastguard Worker template <typename ConstBufferSequence>
buffer_copy(const mutable_buffer & target,const ConstBufferSequence & source)1251*c33452fbSAndroid Build Coastguard Worker std::size_t buffer_copy(const mutable_buffer& target,
1252*c33452fbSAndroid Build Coastguard Worker const ConstBufferSequence& source)
1253*c33452fbSAndroid Build Coastguard Worker {
1254*c33452fbSAndroid Build Coastguard Worker std::size_t total_bytes_copied = 0;
1255*c33452fbSAndroid Build Coastguard Worker
1256*c33452fbSAndroid Build Coastguard Worker typename ConstBufferSequence::const_iterator source_iter = source.begin();
1257*c33452fbSAndroid Build Coastguard Worker typename ConstBufferSequence::const_iterator source_end = source.end();
1258*c33452fbSAndroid Build Coastguard Worker
1259*c33452fbSAndroid Build Coastguard Worker for (mutable_buffer target_buffer(target);
1260*c33452fbSAndroid Build Coastguard Worker buffer_size(target_buffer) && source_iter != source_end; ++source_iter)
1261*c33452fbSAndroid Build Coastguard Worker {
1262*c33452fbSAndroid Build Coastguard Worker const_buffer source_buffer(*source_iter);
1263*c33452fbSAndroid Build Coastguard Worker std::size_t bytes_copied = buffer_copy(target_buffer, source_buffer);
1264*c33452fbSAndroid Build Coastguard Worker total_bytes_copied += bytes_copied;
1265*c33452fbSAndroid Build Coastguard Worker target_buffer = target_buffer + bytes_copied;
1266*c33452fbSAndroid Build Coastguard Worker }
1267*c33452fbSAndroid Build Coastguard Worker
1268*c33452fbSAndroid Build Coastguard Worker return total_bytes_copied;
1269*c33452fbSAndroid Build Coastguard Worker }
1270*c33452fbSAndroid Build Coastguard Worker
1271*c33452fbSAndroid Build Coastguard Worker /// Copies bytes from a source buffer to a target buffer.
1272*c33452fbSAndroid Build Coastguard Worker /**
1273*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1274*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1275*c33452fbSAndroid Build Coastguard Worker *
1276*c33452fbSAndroid Build Coastguard Worker * @param source A non-modifiable buffer representing the memory region from
1277*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1278*c33452fbSAndroid Build Coastguard Worker *
1279*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1280*c33452fbSAndroid Build Coastguard Worker *
1281*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1282*c33452fbSAndroid Build Coastguard Worker *
1283*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1284*c33452fbSAndroid Build Coastguard Worker *
1285*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1286*c33452fbSAndroid Build Coastguard Worker *
1287*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1288*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1289*c33452fbSAndroid Build Coastguard Worker */
buffer_copy(const mutable_buffers_1 & target,const const_buffer & source)1290*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffers_1& target,
1291*c33452fbSAndroid Build Coastguard Worker const const_buffer& source)
1292*c33452fbSAndroid Build Coastguard Worker {
1293*c33452fbSAndroid Build Coastguard Worker return buffer_copy(static_cast<const mutable_buffer&>(target), source);
1294*c33452fbSAndroid Build Coastguard Worker }
1295*c33452fbSAndroid Build Coastguard Worker
1296*c33452fbSAndroid Build Coastguard Worker /// Copies bytes from a source buffer to a target buffer.
1297*c33452fbSAndroid Build Coastguard Worker /**
1298*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1299*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1300*c33452fbSAndroid Build Coastguard Worker *
1301*c33452fbSAndroid Build Coastguard Worker * @param source A non-modifiable buffer representing the memory region from
1302*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1303*c33452fbSAndroid Build Coastguard Worker *
1304*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1305*c33452fbSAndroid Build Coastguard Worker *
1306*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1307*c33452fbSAndroid Build Coastguard Worker *
1308*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1309*c33452fbSAndroid Build Coastguard Worker *
1310*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1311*c33452fbSAndroid Build Coastguard Worker *
1312*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1313*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1314*c33452fbSAndroid Build Coastguard Worker */
buffer_copy(const mutable_buffers_1 & target,const const_buffers_1 & source)1315*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffers_1& target,
1316*c33452fbSAndroid Build Coastguard Worker const const_buffers_1& source)
1317*c33452fbSAndroid Build Coastguard Worker {
1318*c33452fbSAndroid Build Coastguard Worker return buffer_copy(static_cast<const mutable_buffer&>(target),
1319*c33452fbSAndroid Build Coastguard Worker static_cast<const const_buffer&>(source));
1320*c33452fbSAndroid Build Coastguard Worker }
1321*c33452fbSAndroid Build Coastguard Worker
1322*c33452fbSAndroid Build Coastguard Worker /// Copies bytes from a source buffer to a target buffer.
1323*c33452fbSAndroid Build Coastguard Worker /**
1324*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1325*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1326*c33452fbSAndroid Build Coastguard Worker *
1327*c33452fbSAndroid Build Coastguard Worker * @param source A modifiable buffer representing the memory region from which
1328*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied. The contents of the source buffer will not be
1329*c33452fbSAndroid Build Coastguard Worker * modified.
1330*c33452fbSAndroid Build Coastguard Worker *
1331*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1332*c33452fbSAndroid Build Coastguard Worker *
1333*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1334*c33452fbSAndroid Build Coastguard Worker *
1335*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1336*c33452fbSAndroid Build Coastguard Worker *
1337*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1338*c33452fbSAndroid Build Coastguard Worker *
1339*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1340*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1341*c33452fbSAndroid Build Coastguard Worker */
buffer_copy(const mutable_buffers_1 & target,const mutable_buffer & source)1342*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffers_1& target,
1343*c33452fbSAndroid Build Coastguard Worker const mutable_buffer& source)
1344*c33452fbSAndroid Build Coastguard Worker {
1345*c33452fbSAndroid Build Coastguard Worker return buffer_copy(static_cast<const mutable_buffer&>(target),
1346*c33452fbSAndroid Build Coastguard Worker const_buffer(source));
1347*c33452fbSAndroid Build Coastguard Worker }
1348*c33452fbSAndroid Build Coastguard Worker
1349*c33452fbSAndroid Build Coastguard Worker /// Copies bytes from a source buffer to a target buffer.
1350*c33452fbSAndroid Build Coastguard Worker /**
1351*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1352*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1353*c33452fbSAndroid Build Coastguard Worker *
1354*c33452fbSAndroid Build Coastguard Worker * @param source A modifiable buffer representing the memory region from which
1355*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied. The contents of the source buffer will not be
1356*c33452fbSAndroid Build Coastguard Worker * modified.
1357*c33452fbSAndroid Build Coastguard Worker *
1358*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1359*c33452fbSAndroid Build Coastguard Worker *
1360*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1361*c33452fbSAndroid Build Coastguard Worker *
1362*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1363*c33452fbSAndroid Build Coastguard Worker *
1364*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1365*c33452fbSAndroid Build Coastguard Worker *
1366*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1367*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1368*c33452fbSAndroid Build Coastguard Worker */
buffer_copy(const mutable_buffers_1 & target,const mutable_buffers_1 & source)1369*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffers_1& target,
1370*c33452fbSAndroid Build Coastguard Worker const mutable_buffers_1& source)
1371*c33452fbSAndroid Build Coastguard Worker {
1372*c33452fbSAndroid Build Coastguard Worker return buffer_copy(static_cast<const mutable_buffer&>(target),
1373*c33452fbSAndroid Build Coastguard Worker const_buffer(source));
1374*c33452fbSAndroid Build Coastguard Worker }
1375*c33452fbSAndroid Build Coastguard Worker
1376*c33452fbSAndroid Build Coastguard Worker /// Copies bytes from a source buffer sequence to a target buffer.
1377*c33452fbSAndroid Build Coastguard Worker /**
1378*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1379*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1380*c33452fbSAndroid Build Coastguard Worker *
1381*c33452fbSAndroid Build Coastguard Worker * @param source A non-modifiable buffer sequence representing the memory
1382*c33452fbSAndroid Build Coastguard Worker * regions from which the bytes will be copied.
1383*c33452fbSAndroid Build Coastguard Worker *
1384*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1385*c33452fbSAndroid Build Coastguard Worker *
1386*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1387*c33452fbSAndroid Build Coastguard Worker *
1388*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1389*c33452fbSAndroid Build Coastguard Worker *
1390*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1391*c33452fbSAndroid Build Coastguard Worker *
1392*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1393*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1394*c33452fbSAndroid Build Coastguard Worker */
1395*c33452fbSAndroid Build Coastguard Worker template <typename ConstBufferSequence>
buffer_copy(const mutable_buffers_1 & target,const ConstBufferSequence & source)1396*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffers_1& target,
1397*c33452fbSAndroid Build Coastguard Worker const ConstBufferSequence& source)
1398*c33452fbSAndroid Build Coastguard Worker {
1399*c33452fbSAndroid Build Coastguard Worker return buffer_copy(static_cast<const mutable_buffer&>(target), source);
1400*c33452fbSAndroid Build Coastguard Worker }
1401*c33452fbSAndroid Build Coastguard Worker
1402*c33452fbSAndroid Build Coastguard Worker /// Copies bytes from a source buffer to a target buffer sequence.
1403*c33452fbSAndroid Build Coastguard Worker /**
1404*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer sequence representing the memory regions to
1405*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1406*c33452fbSAndroid Build Coastguard Worker *
1407*c33452fbSAndroid Build Coastguard Worker * @param source A non-modifiable buffer representing the memory region from
1408*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1409*c33452fbSAndroid Build Coastguard Worker *
1410*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1411*c33452fbSAndroid Build Coastguard Worker *
1412*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1413*c33452fbSAndroid Build Coastguard Worker *
1414*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1415*c33452fbSAndroid Build Coastguard Worker *
1416*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1417*c33452fbSAndroid Build Coastguard Worker *
1418*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1419*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1420*c33452fbSAndroid Build Coastguard Worker */
1421*c33452fbSAndroid Build Coastguard Worker template <typename MutableBufferSequence>
buffer_copy(const MutableBufferSequence & target,const const_buffer & source)1422*c33452fbSAndroid Build Coastguard Worker std::size_t buffer_copy(const MutableBufferSequence& target,
1423*c33452fbSAndroid Build Coastguard Worker const const_buffer& source)
1424*c33452fbSAndroid Build Coastguard Worker {
1425*c33452fbSAndroid Build Coastguard Worker std::size_t total_bytes_copied = 0;
1426*c33452fbSAndroid Build Coastguard Worker
1427*c33452fbSAndroid Build Coastguard Worker typename MutableBufferSequence::const_iterator target_iter = target.begin();
1428*c33452fbSAndroid Build Coastguard Worker typename MutableBufferSequence::const_iterator target_end = target.end();
1429*c33452fbSAndroid Build Coastguard Worker
1430*c33452fbSAndroid Build Coastguard Worker for (const_buffer source_buffer(source);
1431*c33452fbSAndroid Build Coastguard Worker buffer_size(source_buffer) && target_iter != target_end; ++target_iter)
1432*c33452fbSAndroid Build Coastguard Worker {
1433*c33452fbSAndroid Build Coastguard Worker mutable_buffer target_buffer(*target_iter);
1434*c33452fbSAndroid Build Coastguard Worker std::size_t bytes_copied = buffer_copy(target_buffer, source_buffer);
1435*c33452fbSAndroid Build Coastguard Worker total_bytes_copied += bytes_copied;
1436*c33452fbSAndroid Build Coastguard Worker source_buffer = source_buffer + bytes_copied;
1437*c33452fbSAndroid Build Coastguard Worker }
1438*c33452fbSAndroid Build Coastguard Worker
1439*c33452fbSAndroid Build Coastguard Worker return total_bytes_copied;
1440*c33452fbSAndroid Build Coastguard Worker }
1441*c33452fbSAndroid Build Coastguard Worker
1442*c33452fbSAndroid Build Coastguard Worker /// Copies bytes from a source buffer to a target buffer sequence.
1443*c33452fbSAndroid Build Coastguard Worker /**
1444*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer sequence representing the memory regions to
1445*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1446*c33452fbSAndroid Build Coastguard Worker *
1447*c33452fbSAndroid Build Coastguard Worker * @param source A non-modifiable buffer representing the memory region from
1448*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1449*c33452fbSAndroid Build Coastguard Worker *
1450*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1451*c33452fbSAndroid Build Coastguard Worker *
1452*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1453*c33452fbSAndroid Build Coastguard Worker *
1454*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1455*c33452fbSAndroid Build Coastguard Worker *
1456*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1457*c33452fbSAndroid Build Coastguard Worker *
1458*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1459*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1460*c33452fbSAndroid Build Coastguard Worker */
1461*c33452fbSAndroid Build Coastguard Worker template <typename MutableBufferSequence>
buffer_copy(const MutableBufferSequence & target,const const_buffers_1 & source)1462*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const MutableBufferSequence& target,
1463*c33452fbSAndroid Build Coastguard Worker const const_buffers_1& source)
1464*c33452fbSAndroid Build Coastguard Worker {
1465*c33452fbSAndroid Build Coastguard Worker return buffer_copy(target, static_cast<const const_buffer&>(source));
1466*c33452fbSAndroid Build Coastguard Worker }
1467*c33452fbSAndroid Build Coastguard Worker
1468*c33452fbSAndroid Build Coastguard Worker /// Copies bytes from a source buffer to a target buffer sequence.
1469*c33452fbSAndroid Build Coastguard Worker /**
1470*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer sequence representing the memory regions to
1471*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1472*c33452fbSAndroid Build Coastguard Worker *
1473*c33452fbSAndroid Build Coastguard Worker * @param source A modifiable buffer representing the memory region from which
1474*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied. The contents of the source buffer will not be
1475*c33452fbSAndroid Build Coastguard Worker * modified.
1476*c33452fbSAndroid Build Coastguard Worker *
1477*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1478*c33452fbSAndroid Build Coastguard Worker *
1479*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1480*c33452fbSAndroid Build Coastguard Worker *
1481*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1482*c33452fbSAndroid Build Coastguard Worker *
1483*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1484*c33452fbSAndroid Build Coastguard Worker *
1485*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1486*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1487*c33452fbSAndroid Build Coastguard Worker */
1488*c33452fbSAndroid Build Coastguard Worker template <typename MutableBufferSequence>
buffer_copy(const MutableBufferSequence & target,const mutable_buffer & source)1489*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const MutableBufferSequence& target,
1490*c33452fbSAndroid Build Coastguard Worker const mutable_buffer& source)
1491*c33452fbSAndroid Build Coastguard Worker {
1492*c33452fbSAndroid Build Coastguard Worker return buffer_copy(target, const_buffer(source));
1493*c33452fbSAndroid Build Coastguard Worker }
1494*c33452fbSAndroid Build Coastguard Worker
1495*c33452fbSAndroid Build Coastguard Worker /// Copies bytes from a source buffer to a target buffer sequence.
1496*c33452fbSAndroid Build Coastguard Worker /**
1497*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer sequence representing the memory regions to
1498*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1499*c33452fbSAndroid Build Coastguard Worker *
1500*c33452fbSAndroid Build Coastguard Worker * @param source A modifiable buffer representing the memory region from which
1501*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied. The contents of the source buffer will not be
1502*c33452fbSAndroid Build Coastguard Worker * modified.
1503*c33452fbSAndroid Build Coastguard Worker *
1504*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1505*c33452fbSAndroid Build Coastguard Worker *
1506*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1507*c33452fbSAndroid Build Coastguard Worker *
1508*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1509*c33452fbSAndroid Build Coastguard Worker *
1510*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1511*c33452fbSAndroid Build Coastguard Worker *
1512*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1513*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1514*c33452fbSAndroid Build Coastguard Worker */
1515*c33452fbSAndroid Build Coastguard Worker template <typename MutableBufferSequence>
buffer_copy(const MutableBufferSequence & target,const mutable_buffers_1 & source)1516*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const MutableBufferSequence& target,
1517*c33452fbSAndroid Build Coastguard Worker const mutable_buffers_1& source)
1518*c33452fbSAndroid Build Coastguard Worker {
1519*c33452fbSAndroid Build Coastguard Worker return buffer_copy(target, const_buffer(source));
1520*c33452fbSAndroid Build Coastguard Worker }
1521*c33452fbSAndroid Build Coastguard Worker
1522*c33452fbSAndroid Build Coastguard Worker /// Copies bytes from a source buffer sequence to a target buffer sequence.
1523*c33452fbSAndroid Build Coastguard Worker /**
1524*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer sequence representing the memory regions to
1525*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1526*c33452fbSAndroid Build Coastguard Worker *
1527*c33452fbSAndroid Build Coastguard Worker * @param source A non-modifiable buffer sequence representing the memory
1528*c33452fbSAndroid Build Coastguard Worker * regions from which the bytes will be copied.
1529*c33452fbSAndroid Build Coastguard Worker *
1530*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1531*c33452fbSAndroid Build Coastguard Worker *
1532*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1533*c33452fbSAndroid Build Coastguard Worker *
1534*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1535*c33452fbSAndroid Build Coastguard Worker *
1536*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1537*c33452fbSAndroid Build Coastguard Worker *
1538*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1539*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1540*c33452fbSAndroid Build Coastguard Worker */
1541*c33452fbSAndroid Build Coastguard Worker template <typename MutableBufferSequence, typename ConstBufferSequence>
buffer_copy(const MutableBufferSequence & target,const ConstBufferSequence & source)1542*c33452fbSAndroid Build Coastguard Worker std::size_t buffer_copy(const MutableBufferSequence& target,
1543*c33452fbSAndroid Build Coastguard Worker const ConstBufferSequence& source)
1544*c33452fbSAndroid Build Coastguard Worker {
1545*c33452fbSAndroid Build Coastguard Worker std::size_t total_bytes_copied = 0;
1546*c33452fbSAndroid Build Coastguard Worker
1547*c33452fbSAndroid Build Coastguard Worker typename MutableBufferSequence::const_iterator target_iter = target.begin();
1548*c33452fbSAndroid Build Coastguard Worker typename MutableBufferSequence::const_iterator target_end = target.end();
1549*c33452fbSAndroid Build Coastguard Worker std::size_t target_buffer_offset = 0;
1550*c33452fbSAndroid Build Coastguard Worker
1551*c33452fbSAndroid Build Coastguard Worker typename ConstBufferSequence::const_iterator source_iter = source.begin();
1552*c33452fbSAndroid Build Coastguard Worker typename ConstBufferSequence::const_iterator source_end = source.end();
1553*c33452fbSAndroid Build Coastguard Worker std::size_t source_buffer_offset = 0;
1554*c33452fbSAndroid Build Coastguard Worker
1555*c33452fbSAndroid Build Coastguard Worker while (target_iter != target_end && source_iter != source_end)
1556*c33452fbSAndroid Build Coastguard Worker {
1557*c33452fbSAndroid Build Coastguard Worker mutable_buffer target_buffer =
1558*c33452fbSAndroid Build Coastguard Worker mutable_buffer(*target_iter) + target_buffer_offset;
1559*c33452fbSAndroid Build Coastguard Worker
1560*c33452fbSAndroid Build Coastguard Worker const_buffer source_buffer =
1561*c33452fbSAndroid Build Coastguard Worker const_buffer(*source_iter) + source_buffer_offset;
1562*c33452fbSAndroid Build Coastguard Worker
1563*c33452fbSAndroid Build Coastguard Worker std::size_t bytes_copied = buffer_copy(target_buffer, source_buffer);
1564*c33452fbSAndroid Build Coastguard Worker total_bytes_copied += bytes_copied;
1565*c33452fbSAndroid Build Coastguard Worker
1566*c33452fbSAndroid Build Coastguard Worker if (bytes_copied == buffer_size(target_buffer))
1567*c33452fbSAndroid Build Coastguard Worker {
1568*c33452fbSAndroid Build Coastguard Worker ++target_iter;
1569*c33452fbSAndroid Build Coastguard Worker target_buffer_offset = 0;
1570*c33452fbSAndroid Build Coastguard Worker }
1571*c33452fbSAndroid Build Coastguard Worker else
1572*c33452fbSAndroid Build Coastguard Worker target_buffer_offset += bytes_copied;
1573*c33452fbSAndroid Build Coastguard Worker
1574*c33452fbSAndroid Build Coastguard Worker if (bytes_copied == buffer_size(source_buffer))
1575*c33452fbSAndroid Build Coastguard Worker {
1576*c33452fbSAndroid Build Coastguard Worker ++source_iter;
1577*c33452fbSAndroid Build Coastguard Worker source_buffer_offset = 0;
1578*c33452fbSAndroid Build Coastguard Worker }
1579*c33452fbSAndroid Build Coastguard Worker else
1580*c33452fbSAndroid Build Coastguard Worker source_buffer_offset += bytes_copied;
1581*c33452fbSAndroid Build Coastguard Worker }
1582*c33452fbSAndroid Build Coastguard Worker
1583*c33452fbSAndroid Build Coastguard Worker return total_bytes_copied;
1584*c33452fbSAndroid Build Coastguard Worker }
1585*c33452fbSAndroid Build Coastguard Worker
1586*c33452fbSAndroid Build Coastguard Worker /// Copies a limited number of bytes from a source buffer to a target buffer.
1587*c33452fbSAndroid Build Coastguard Worker /**
1588*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1589*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1590*c33452fbSAndroid Build Coastguard Worker *
1591*c33452fbSAndroid Build Coastguard Worker * @param source A non-modifiable buffer representing the memory region from
1592*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1593*c33452fbSAndroid Build Coastguard Worker *
1594*c33452fbSAndroid Build Coastguard Worker * @param max_bytes_to_copy The maximum number of bytes to be copied.
1595*c33452fbSAndroid Build Coastguard Worker *
1596*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1597*c33452fbSAndroid Build Coastguard Worker *
1598*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1599*c33452fbSAndroid Build Coastguard Worker *
1600*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1601*c33452fbSAndroid Build Coastguard Worker *
1602*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1603*c33452fbSAndroid Build Coastguard Worker *
1604*c33452fbSAndroid Build Coastguard Worker * @li @c max_bytes_to_copy
1605*c33452fbSAndroid Build Coastguard Worker *
1606*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1607*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1608*c33452fbSAndroid Build Coastguard Worker */
buffer_copy(const mutable_buffer & target,const const_buffer & source,std::size_t max_bytes_to_copy)1609*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffer& target,
1610*c33452fbSAndroid Build Coastguard Worker const const_buffer& source, std::size_t max_bytes_to_copy)
1611*c33452fbSAndroid Build Coastguard Worker {
1612*c33452fbSAndroid Build Coastguard Worker return buffer_copy(buffer(target, max_bytes_to_copy), source);
1613*c33452fbSAndroid Build Coastguard Worker }
1614*c33452fbSAndroid Build Coastguard Worker
1615*c33452fbSAndroid Build Coastguard Worker /// Copies a limited number of bytes from a source buffer to a target buffer.
1616*c33452fbSAndroid Build Coastguard Worker /**
1617*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1618*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1619*c33452fbSAndroid Build Coastguard Worker *
1620*c33452fbSAndroid Build Coastguard Worker * @param source A non-modifiable buffer representing the memory region from
1621*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1622*c33452fbSAndroid Build Coastguard Worker *
1623*c33452fbSAndroid Build Coastguard Worker * @param max_bytes_to_copy The maximum number of bytes to be copied.
1624*c33452fbSAndroid Build Coastguard Worker *
1625*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1626*c33452fbSAndroid Build Coastguard Worker *
1627*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1628*c33452fbSAndroid Build Coastguard Worker *
1629*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1630*c33452fbSAndroid Build Coastguard Worker *
1631*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1632*c33452fbSAndroid Build Coastguard Worker *
1633*c33452fbSAndroid Build Coastguard Worker * @li @c max_bytes_to_copy
1634*c33452fbSAndroid Build Coastguard Worker *
1635*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1636*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1637*c33452fbSAndroid Build Coastguard Worker */
buffer_copy(const mutable_buffer & target,const const_buffers_1 & source,std::size_t max_bytes_to_copy)1638*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffer& target,
1639*c33452fbSAndroid Build Coastguard Worker const const_buffers_1& source, std::size_t max_bytes_to_copy)
1640*c33452fbSAndroid Build Coastguard Worker {
1641*c33452fbSAndroid Build Coastguard Worker return buffer_copy(buffer(target, max_bytes_to_copy), source);
1642*c33452fbSAndroid Build Coastguard Worker }
1643*c33452fbSAndroid Build Coastguard Worker
1644*c33452fbSAndroid Build Coastguard Worker /// Copies a limited number of bytes from a source buffer to a target buffer.
1645*c33452fbSAndroid Build Coastguard Worker /**
1646*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1647*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1648*c33452fbSAndroid Build Coastguard Worker *
1649*c33452fbSAndroid Build Coastguard Worker * @param source A modifiable buffer representing the memory region from which
1650*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied. The contents of the source buffer will not be
1651*c33452fbSAndroid Build Coastguard Worker * modified.
1652*c33452fbSAndroid Build Coastguard Worker *
1653*c33452fbSAndroid Build Coastguard Worker * @param max_bytes_to_copy The maximum number of bytes to be copied.
1654*c33452fbSAndroid Build Coastguard Worker *
1655*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1656*c33452fbSAndroid Build Coastguard Worker *
1657*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1658*c33452fbSAndroid Build Coastguard Worker *
1659*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1660*c33452fbSAndroid Build Coastguard Worker *
1661*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1662*c33452fbSAndroid Build Coastguard Worker *
1663*c33452fbSAndroid Build Coastguard Worker * @li @c max_bytes_to_copy
1664*c33452fbSAndroid Build Coastguard Worker *
1665*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1666*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1667*c33452fbSAndroid Build Coastguard Worker */
buffer_copy(const mutable_buffer & target,const mutable_buffer & source,std::size_t max_bytes_to_copy)1668*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffer& target,
1669*c33452fbSAndroid Build Coastguard Worker const mutable_buffer& source, std::size_t max_bytes_to_copy)
1670*c33452fbSAndroid Build Coastguard Worker {
1671*c33452fbSAndroid Build Coastguard Worker return buffer_copy(buffer(target, max_bytes_to_copy), source);
1672*c33452fbSAndroid Build Coastguard Worker }
1673*c33452fbSAndroid Build Coastguard Worker
1674*c33452fbSAndroid Build Coastguard Worker /// Copies a limited number of bytes from a source buffer to a target buffer.
1675*c33452fbSAndroid Build Coastguard Worker /**
1676*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1677*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1678*c33452fbSAndroid Build Coastguard Worker *
1679*c33452fbSAndroid Build Coastguard Worker * @param source A modifiable buffer representing the memory region from which
1680*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied. The contents of the source buffer will not be
1681*c33452fbSAndroid Build Coastguard Worker * modified.
1682*c33452fbSAndroid Build Coastguard Worker *
1683*c33452fbSAndroid Build Coastguard Worker * @param max_bytes_to_copy The maximum number of bytes to be copied.
1684*c33452fbSAndroid Build Coastguard Worker *
1685*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1686*c33452fbSAndroid Build Coastguard Worker *
1687*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1688*c33452fbSAndroid Build Coastguard Worker *
1689*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1690*c33452fbSAndroid Build Coastguard Worker *
1691*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1692*c33452fbSAndroid Build Coastguard Worker *
1693*c33452fbSAndroid Build Coastguard Worker * @li @c max_bytes_to_copy
1694*c33452fbSAndroid Build Coastguard Worker *
1695*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1696*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1697*c33452fbSAndroid Build Coastguard Worker */
buffer_copy(const mutable_buffer & target,const mutable_buffers_1 & source,std::size_t max_bytes_to_copy)1698*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffer& target,
1699*c33452fbSAndroid Build Coastguard Worker const mutable_buffers_1& source, std::size_t max_bytes_to_copy)
1700*c33452fbSAndroid Build Coastguard Worker {
1701*c33452fbSAndroid Build Coastguard Worker return buffer_copy(buffer(target, max_bytes_to_copy), source);
1702*c33452fbSAndroid Build Coastguard Worker }
1703*c33452fbSAndroid Build Coastguard Worker
1704*c33452fbSAndroid Build Coastguard Worker /// Copies a limited number of bytes from a source buffer sequence to a target
1705*c33452fbSAndroid Build Coastguard Worker /// buffer.
1706*c33452fbSAndroid Build Coastguard Worker /**
1707*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1708*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1709*c33452fbSAndroid Build Coastguard Worker *
1710*c33452fbSAndroid Build Coastguard Worker * @param source A non-modifiable buffer sequence representing the memory
1711*c33452fbSAndroid Build Coastguard Worker * regions from which the bytes will be copied.
1712*c33452fbSAndroid Build Coastguard Worker *
1713*c33452fbSAndroid Build Coastguard Worker * @param max_bytes_to_copy The maximum number of bytes to be copied.
1714*c33452fbSAndroid Build Coastguard Worker *
1715*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1716*c33452fbSAndroid Build Coastguard Worker *
1717*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1718*c33452fbSAndroid Build Coastguard Worker *
1719*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1720*c33452fbSAndroid Build Coastguard Worker *
1721*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1722*c33452fbSAndroid Build Coastguard Worker *
1723*c33452fbSAndroid Build Coastguard Worker * @li @c max_bytes_to_copy
1724*c33452fbSAndroid Build Coastguard Worker *
1725*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1726*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1727*c33452fbSAndroid Build Coastguard Worker */
1728*c33452fbSAndroid Build Coastguard Worker template <typename ConstBufferSequence>
buffer_copy(const mutable_buffer & target,const ConstBufferSequence & source,std::size_t max_bytes_to_copy)1729*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffer& target,
1730*c33452fbSAndroid Build Coastguard Worker const ConstBufferSequence& source, std::size_t max_bytes_to_copy)
1731*c33452fbSAndroid Build Coastguard Worker {
1732*c33452fbSAndroid Build Coastguard Worker return buffer_copy(buffer(target, max_bytes_to_copy), source);
1733*c33452fbSAndroid Build Coastguard Worker }
1734*c33452fbSAndroid Build Coastguard Worker
1735*c33452fbSAndroid Build Coastguard Worker /// Copies a limited number of bytes from a source buffer to a target buffer.
1736*c33452fbSAndroid Build Coastguard Worker /**
1737*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1738*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1739*c33452fbSAndroid Build Coastguard Worker *
1740*c33452fbSAndroid Build Coastguard Worker * @param source A non-modifiable buffer representing the memory region from
1741*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1742*c33452fbSAndroid Build Coastguard Worker *
1743*c33452fbSAndroid Build Coastguard Worker * @param max_bytes_to_copy The maximum number of bytes to be copied.
1744*c33452fbSAndroid Build Coastguard Worker *
1745*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1746*c33452fbSAndroid Build Coastguard Worker *
1747*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1748*c33452fbSAndroid Build Coastguard Worker *
1749*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1750*c33452fbSAndroid Build Coastguard Worker *
1751*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1752*c33452fbSAndroid Build Coastguard Worker *
1753*c33452fbSAndroid Build Coastguard Worker * @li @c max_bytes_to_copy
1754*c33452fbSAndroid Build Coastguard Worker *
1755*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1756*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1757*c33452fbSAndroid Build Coastguard Worker */
buffer_copy(const mutable_buffers_1 & target,const const_buffer & source,std::size_t max_bytes_to_copy)1758*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffers_1& target,
1759*c33452fbSAndroid Build Coastguard Worker const const_buffer& source, std::size_t max_bytes_to_copy)
1760*c33452fbSAndroid Build Coastguard Worker {
1761*c33452fbSAndroid Build Coastguard Worker return buffer_copy(buffer(target, max_bytes_to_copy), source);
1762*c33452fbSAndroid Build Coastguard Worker }
1763*c33452fbSAndroid Build Coastguard Worker
1764*c33452fbSAndroid Build Coastguard Worker /// Copies a limited number of bytes from a source buffer to a target buffer.
1765*c33452fbSAndroid Build Coastguard Worker /**
1766*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1767*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1768*c33452fbSAndroid Build Coastguard Worker *
1769*c33452fbSAndroid Build Coastguard Worker * @param source A non-modifiable buffer representing the memory region from
1770*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1771*c33452fbSAndroid Build Coastguard Worker *
1772*c33452fbSAndroid Build Coastguard Worker * @param max_bytes_to_copy The maximum number of bytes to be copied.
1773*c33452fbSAndroid Build Coastguard Worker *
1774*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1775*c33452fbSAndroid Build Coastguard Worker *
1776*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1777*c33452fbSAndroid Build Coastguard Worker *
1778*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1779*c33452fbSAndroid Build Coastguard Worker *
1780*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1781*c33452fbSAndroid Build Coastguard Worker *
1782*c33452fbSAndroid Build Coastguard Worker * @li @c max_bytes_to_copy
1783*c33452fbSAndroid Build Coastguard Worker *
1784*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1785*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1786*c33452fbSAndroid Build Coastguard Worker */
buffer_copy(const mutable_buffers_1 & target,const const_buffers_1 & source,std::size_t max_bytes_to_copy)1787*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffers_1& target,
1788*c33452fbSAndroid Build Coastguard Worker const const_buffers_1& source, std::size_t max_bytes_to_copy)
1789*c33452fbSAndroid Build Coastguard Worker {
1790*c33452fbSAndroid Build Coastguard Worker return buffer_copy(buffer(target, max_bytes_to_copy), source);
1791*c33452fbSAndroid Build Coastguard Worker }
1792*c33452fbSAndroid Build Coastguard Worker
1793*c33452fbSAndroid Build Coastguard Worker /// Copies a limited number of bytes from a source buffer to a target buffer.
1794*c33452fbSAndroid Build Coastguard Worker /**
1795*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1796*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1797*c33452fbSAndroid Build Coastguard Worker *
1798*c33452fbSAndroid Build Coastguard Worker * @param source A modifiable buffer representing the memory region from which
1799*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied. The contents of the source buffer will not be
1800*c33452fbSAndroid Build Coastguard Worker * modified.
1801*c33452fbSAndroid Build Coastguard Worker *
1802*c33452fbSAndroid Build Coastguard Worker * @param max_bytes_to_copy The maximum number of bytes to be copied.
1803*c33452fbSAndroid Build Coastguard Worker *
1804*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1805*c33452fbSAndroid Build Coastguard Worker *
1806*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1807*c33452fbSAndroid Build Coastguard Worker *
1808*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1809*c33452fbSAndroid Build Coastguard Worker *
1810*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1811*c33452fbSAndroid Build Coastguard Worker *
1812*c33452fbSAndroid Build Coastguard Worker * @li @c max_bytes_to_copy
1813*c33452fbSAndroid Build Coastguard Worker *
1814*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1815*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1816*c33452fbSAndroid Build Coastguard Worker */
buffer_copy(const mutable_buffers_1 & target,const mutable_buffer & source,std::size_t max_bytes_to_copy)1817*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffers_1& target,
1818*c33452fbSAndroid Build Coastguard Worker const mutable_buffer& source, std::size_t max_bytes_to_copy)
1819*c33452fbSAndroid Build Coastguard Worker {
1820*c33452fbSAndroid Build Coastguard Worker return buffer_copy(buffer(target, max_bytes_to_copy), source);
1821*c33452fbSAndroid Build Coastguard Worker }
1822*c33452fbSAndroid Build Coastguard Worker
1823*c33452fbSAndroid Build Coastguard Worker /// Copies a limited number of bytes from a source buffer to a target buffer.
1824*c33452fbSAndroid Build Coastguard Worker /**
1825*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1826*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1827*c33452fbSAndroid Build Coastguard Worker *
1828*c33452fbSAndroid Build Coastguard Worker * @param source A modifiable buffer representing the memory region from which
1829*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied. The contents of the source buffer will not be
1830*c33452fbSAndroid Build Coastguard Worker * modified.
1831*c33452fbSAndroid Build Coastguard Worker *
1832*c33452fbSAndroid Build Coastguard Worker * @param max_bytes_to_copy The maximum number of bytes to be copied.
1833*c33452fbSAndroid Build Coastguard Worker *
1834*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1835*c33452fbSAndroid Build Coastguard Worker *
1836*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1837*c33452fbSAndroid Build Coastguard Worker *
1838*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1839*c33452fbSAndroid Build Coastguard Worker *
1840*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1841*c33452fbSAndroid Build Coastguard Worker *
1842*c33452fbSAndroid Build Coastguard Worker * @li @c max_bytes_to_copy
1843*c33452fbSAndroid Build Coastguard Worker *
1844*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1845*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1846*c33452fbSAndroid Build Coastguard Worker */
buffer_copy(const mutable_buffers_1 & target,const mutable_buffers_1 & source,std::size_t max_bytes_to_copy)1847*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffers_1& target,
1848*c33452fbSAndroid Build Coastguard Worker const mutable_buffers_1& source, std::size_t max_bytes_to_copy)
1849*c33452fbSAndroid Build Coastguard Worker {
1850*c33452fbSAndroid Build Coastguard Worker return buffer_copy(buffer(target, max_bytes_to_copy), source);
1851*c33452fbSAndroid Build Coastguard Worker }
1852*c33452fbSAndroid Build Coastguard Worker
1853*c33452fbSAndroid Build Coastguard Worker /// Copies a limited number of bytes from a source buffer sequence to a target
1854*c33452fbSAndroid Build Coastguard Worker /// buffer.
1855*c33452fbSAndroid Build Coastguard Worker /**
1856*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer representing the memory region to which
1857*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied.
1858*c33452fbSAndroid Build Coastguard Worker *
1859*c33452fbSAndroid Build Coastguard Worker * @param source A non-modifiable buffer sequence representing the memory
1860*c33452fbSAndroid Build Coastguard Worker * regions from which the bytes will be copied.
1861*c33452fbSAndroid Build Coastguard Worker *
1862*c33452fbSAndroid Build Coastguard Worker * @param max_bytes_to_copy The maximum number of bytes to be copied.
1863*c33452fbSAndroid Build Coastguard Worker *
1864*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1865*c33452fbSAndroid Build Coastguard Worker *
1866*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1867*c33452fbSAndroid Build Coastguard Worker *
1868*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1869*c33452fbSAndroid Build Coastguard Worker *
1870*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1871*c33452fbSAndroid Build Coastguard Worker *
1872*c33452fbSAndroid Build Coastguard Worker * @li @c max_bytes_to_copy
1873*c33452fbSAndroid Build Coastguard Worker *
1874*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1875*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1876*c33452fbSAndroid Build Coastguard Worker */
1877*c33452fbSAndroid Build Coastguard Worker template <typename ConstBufferSequence>
buffer_copy(const mutable_buffers_1 & target,const ConstBufferSequence & source,std::size_t max_bytes_to_copy)1878*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const mutable_buffers_1& target,
1879*c33452fbSAndroid Build Coastguard Worker const ConstBufferSequence& source, std::size_t max_bytes_to_copy)
1880*c33452fbSAndroid Build Coastguard Worker {
1881*c33452fbSAndroid Build Coastguard Worker return buffer_copy(buffer(target, max_bytes_to_copy), source);
1882*c33452fbSAndroid Build Coastguard Worker }
1883*c33452fbSAndroid Build Coastguard Worker
1884*c33452fbSAndroid Build Coastguard Worker /// Copies a limited number of bytes from a source buffer to a target buffer
1885*c33452fbSAndroid Build Coastguard Worker /// sequence.
1886*c33452fbSAndroid Build Coastguard Worker /**
1887*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer sequence representing the memory regions to
1888*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1889*c33452fbSAndroid Build Coastguard Worker *
1890*c33452fbSAndroid Build Coastguard Worker * @param source A non-modifiable buffer representing the memory region from
1891*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1892*c33452fbSAndroid Build Coastguard Worker *
1893*c33452fbSAndroid Build Coastguard Worker * @param max_bytes_to_copy The maximum number of bytes to be copied.
1894*c33452fbSAndroid Build Coastguard Worker *
1895*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1896*c33452fbSAndroid Build Coastguard Worker *
1897*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1898*c33452fbSAndroid Build Coastguard Worker *
1899*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1900*c33452fbSAndroid Build Coastguard Worker *
1901*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1902*c33452fbSAndroid Build Coastguard Worker *
1903*c33452fbSAndroid Build Coastguard Worker * @li @c max_bytes_to_copy
1904*c33452fbSAndroid Build Coastguard Worker *
1905*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1906*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1907*c33452fbSAndroid Build Coastguard Worker */
1908*c33452fbSAndroid Build Coastguard Worker template <typename MutableBufferSequence>
buffer_copy(const MutableBufferSequence & target,const const_buffer & source,std::size_t max_bytes_to_copy)1909*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const MutableBufferSequence& target,
1910*c33452fbSAndroid Build Coastguard Worker const const_buffer& source, std::size_t max_bytes_to_copy)
1911*c33452fbSAndroid Build Coastguard Worker {
1912*c33452fbSAndroid Build Coastguard Worker return buffer_copy(target, buffer(source, max_bytes_to_copy));
1913*c33452fbSAndroid Build Coastguard Worker }
1914*c33452fbSAndroid Build Coastguard Worker
1915*c33452fbSAndroid Build Coastguard Worker /// Copies a limited number of bytes from a source buffer to a target buffer
1916*c33452fbSAndroid Build Coastguard Worker /// sequence.
1917*c33452fbSAndroid Build Coastguard Worker /**
1918*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer sequence representing the memory regions to
1919*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1920*c33452fbSAndroid Build Coastguard Worker *
1921*c33452fbSAndroid Build Coastguard Worker * @param source A non-modifiable buffer representing the memory region from
1922*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1923*c33452fbSAndroid Build Coastguard Worker *
1924*c33452fbSAndroid Build Coastguard Worker * @param max_bytes_to_copy The maximum number of bytes to be copied.
1925*c33452fbSAndroid Build Coastguard Worker *
1926*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1927*c33452fbSAndroid Build Coastguard Worker *
1928*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1929*c33452fbSAndroid Build Coastguard Worker *
1930*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1931*c33452fbSAndroid Build Coastguard Worker *
1932*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1933*c33452fbSAndroid Build Coastguard Worker *
1934*c33452fbSAndroid Build Coastguard Worker * @li @c max_bytes_to_copy
1935*c33452fbSAndroid Build Coastguard Worker *
1936*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1937*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1938*c33452fbSAndroid Build Coastguard Worker */
1939*c33452fbSAndroid Build Coastguard Worker template <typename MutableBufferSequence>
buffer_copy(const MutableBufferSequence & target,const const_buffers_1 & source,std::size_t max_bytes_to_copy)1940*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const MutableBufferSequence& target,
1941*c33452fbSAndroid Build Coastguard Worker const const_buffers_1& source, std::size_t max_bytes_to_copy)
1942*c33452fbSAndroid Build Coastguard Worker {
1943*c33452fbSAndroid Build Coastguard Worker return buffer_copy(target, buffer(source, max_bytes_to_copy));
1944*c33452fbSAndroid Build Coastguard Worker }
1945*c33452fbSAndroid Build Coastguard Worker
1946*c33452fbSAndroid Build Coastguard Worker /// Copies a limited number of bytes from a source buffer to a target buffer
1947*c33452fbSAndroid Build Coastguard Worker /// sequence.
1948*c33452fbSAndroid Build Coastguard Worker /**
1949*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer sequence representing the memory regions to
1950*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1951*c33452fbSAndroid Build Coastguard Worker *
1952*c33452fbSAndroid Build Coastguard Worker * @param source A modifiable buffer representing the memory region from which
1953*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied. The contents of the source buffer will not be
1954*c33452fbSAndroid Build Coastguard Worker * modified.
1955*c33452fbSAndroid Build Coastguard Worker *
1956*c33452fbSAndroid Build Coastguard Worker * @param max_bytes_to_copy The maximum number of bytes to be copied.
1957*c33452fbSAndroid Build Coastguard Worker *
1958*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1959*c33452fbSAndroid Build Coastguard Worker *
1960*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1961*c33452fbSAndroid Build Coastguard Worker *
1962*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1963*c33452fbSAndroid Build Coastguard Worker *
1964*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1965*c33452fbSAndroid Build Coastguard Worker *
1966*c33452fbSAndroid Build Coastguard Worker * @li @c max_bytes_to_copy
1967*c33452fbSAndroid Build Coastguard Worker *
1968*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
1969*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
1970*c33452fbSAndroid Build Coastguard Worker */
1971*c33452fbSAndroid Build Coastguard Worker template <typename MutableBufferSequence>
buffer_copy(const MutableBufferSequence & target,const mutable_buffer & source,std::size_t max_bytes_to_copy)1972*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const MutableBufferSequence& target,
1973*c33452fbSAndroid Build Coastguard Worker const mutable_buffer& source, std::size_t max_bytes_to_copy)
1974*c33452fbSAndroid Build Coastguard Worker {
1975*c33452fbSAndroid Build Coastguard Worker return buffer_copy(target, buffer(source, max_bytes_to_copy));
1976*c33452fbSAndroid Build Coastguard Worker }
1977*c33452fbSAndroid Build Coastguard Worker
1978*c33452fbSAndroid Build Coastguard Worker /// Copies a limited number of bytes from a source buffer to a target buffer
1979*c33452fbSAndroid Build Coastguard Worker /// sequence.
1980*c33452fbSAndroid Build Coastguard Worker /**
1981*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer sequence representing the memory regions to
1982*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
1983*c33452fbSAndroid Build Coastguard Worker *
1984*c33452fbSAndroid Build Coastguard Worker * @param source A modifiable buffer representing the memory region from which
1985*c33452fbSAndroid Build Coastguard Worker * the bytes will be copied. The contents of the source buffer will not be
1986*c33452fbSAndroid Build Coastguard Worker * modified.
1987*c33452fbSAndroid Build Coastguard Worker *
1988*c33452fbSAndroid Build Coastguard Worker * @param max_bytes_to_copy The maximum number of bytes to be copied.
1989*c33452fbSAndroid Build Coastguard Worker *
1990*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
1991*c33452fbSAndroid Build Coastguard Worker *
1992*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
1993*c33452fbSAndroid Build Coastguard Worker *
1994*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
1995*c33452fbSAndroid Build Coastguard Worker *
1996*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
1997*c33452fbSAndroid Build Coastguard Worker *
1998*c33452fbSAndroid Build Coastguard Worker * @li @c max_bytes_to_copy
1999*c33452fbSAndroid Build Coastguard Worker *
2000*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
2001*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
2002*c33452fbSAndroid Build Coastguard Worker */
2003*c33452fbSAndroid Build Coastguard Worker template <typename MutableBufferSequence>
buffer_copy(const MutableBufferSequence & target,const mutable_buffers_1 & source,std::size_t max_bytes_to_copy)2004*c33452fbSAndroid Build Coastguard Worker inline std::size_t buffer_copy(const MutableBufferSequence& target,
2005*c33452fbSAndroid Build Coastguard Worker const mutable_buffers_1& source, std::size_t max_bytes_to_copy)
2006*c33452fbSAndroid Build Coastguard Worker {
2007*c33452fbSAndroid Build Coastguard Worker return buffer_copy(target, buffer(source, max_bytes_to_copy));
2008*c33452fbSAndroid Build Coastguard Worker }
2009*c33452fbSAndroid Build Coastguard Worker
2010*c33452fbSAndroid Build Coastguard Worker /// Copies a limited number of bytes from a source buffer sequence to a target
2011*c33452fbSAndroid Build Coastguard Worker /// buffer sequence.
2012*c33452fbSAndroid Build Coastguard Worker /**
2013*c33452fbSAndroid Build Coastguard Worker * @param target A modifiable buffer sequence representing the memory regions to
2014*c33452fbSAndroid Build Coastguard Worker * which the bytes will be copied.
2015*c33452fbSAndroid Build Coastguard Worker *
2016*c33452fbSAndroid Build Coastguard Worker * @param source A non-modifiable buffer sequence representing the memory
2017*c33452fbSAndroid Build Coastguard Worker * regions from which the bytes will be copied.
2018*c33452fbSAndroid Build Coastguard Worker *
2019*c33452fbSAndroid Build Coastguard Worker * @param max_bytes_to_copy The maximum number of bytes to be copied.
2020*c33452fbSAndroid Build Coastguard Worker *
2021*c33452fbSAndroid Build Coastguard Worker * @returns The number of bytes copied.
2022*c33452fbSAndroid Build Coastguard Worker *
2023*c33452fbSAndroid Build Coastguard Worker * @note The number of bytes copied is the lesser of:
2024*c33452fbSAndroid Build Coastguard Worker *
2025*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(target)
2026*c33452fbSAndroid Build Coastguard Worker *
2027*c33452fbSAndroid Build Coastguard Worker * @li @c buffer_size(source)
2028*c33452fbSAndroid Build Coastguard Worker *
2029*c33452fbSAndroid Build Coastguard Worker * @li @c max_bytes_to_copy
2030*c33452fbSAndroid Build Coastguard Worker *
2031*c33452fbSAndroid Build Coastguard Worker * This function is implemented in terms of @c memcpy, and consequently it
2032*c33452fbSAndroid Build Coastguard Worker * cannot be used to copy between overlapping memory regions.
2033*c33452fbSAndroid Build Coastguard Worker */
2034*c33452fbSAndroid Build Coastguard Worker template <typename MutableBufferSequence, typename ConstBufferSequence>
buffer_copy(const MutableBufferSequence & target,const ConstBufferSequence & source,std::size_t max_bytes_to_copy)2035*c33452fbSAndroid Build Coastguard Worker std::size_t buffer_copy(const MutableBufferSequence& target,
2036*c33452fbSAndroid Build Coastguard Worker const ConstBufferSequence& source, std::size_t max_bytes_to_copy)
2037*c33452fbSAndroid Build Coastguard Worker {
2038*c33452fbSAndroid Build Coastguard Worker std::size_t total_bytes_copied = 0;
2039*c33452fbSAndroid Build Coastguard Worker
2040*c33452fbSAndroid Build Coastguard Worker typename MutableBufferSequence::const_iterator target_iter = target.begin();
2041*c33452fbSAndroid Build Coastguard Worker typename MutableBufferSequence::const_iterator target_end = target.end();
2042*c33452fbSAndroid Build Coastguard Worker std::size_t target_buffer_offset = 0;
2043*c33452fbSAndroid Build Coastguard Worker
2044*c33452fbSAndroid Build Coastguard Worker typename ConstBufferSequence::const_iterator source_iter = source.begin();
2045*c33452fbSAndroid Build Coastguard Worker typename ConstBufferSequence::const_iterator source_end = source.end();
2046*c33452fbSAndroid Build Coastguard Worker std::size_t source_buffer_offset = 0;
2047*c33452fbSAndroid Build Coastguard Worker
2048*c33452fbSAndroid Build Coastguard Worker while (total_bytes_copied != max_bytes_to_copy
2049*c33452fbSAndroid Build Coastguard Worker && target_iter != target_end && source_iter != source_end)
2050*c33452fbSAndroid Build Coastguard Worker {
2051*c33452fbSAndroid Build Coastguard Worker mutable_buffer target_buffer =
2052*c33452fbSAndroid Build Coastguard Worker mutable_buffer(*target_iter) + target_buffer_offset;
2053*c33452fbSAndroid Build Coastguard Worker
2054*c33452fbSAndroid Build Coastguard Worker const_buffer source_buffer =
2055*c33452fbSAndroid Build Coastguard Worker const_buffer(*source_iter) + source_buffer_offset;
2056*c33452fbSAndroid Build Coastguard Worker
2057*c33452fbSAndroid Build Coastguard Worker std::size_t bytes_copied = buffer_copy(target_buffer,
2058*c33452fbSAndroid Build Coastguard Worker source_buffer, max_bytes_to_copy - total_bytes_copied);
2059*c33452fbSAndroid Build Coastguard Worker total_bytes_copied += bytes_copied;
2060*c33452fbSAndroid Build Coastguard Worker
2061*c33452fbSAndroid Build Coastguard Worker if (bytes_copied == buffer_size(target_buffer))
2062*c33452fbSAndroid Build Coastguard Worker {
2063*c33452fbSAndroid Build Coastguard Worker ++target_iter;
2064*c33452fbSAndroid Build Coastguard Worker target_buffer_offset = 0;
2065*c33452fbSAndroid Build Coastguard Worker }
2066*c33452fbSAndroid Build Coastguard Worker else
2067*c33452fbSAndroid Build Coastguard Worker target_buffer_offset += bytes_copied;
2068*c33452fbSAndroid Build Coastguard Worker
2069*c33452fbSAndroid Build Coastguard Worker if (bytes_copied == buffer_size(source_buffer))
2070*c33452fbSAndroid Build Coastguard Worker {
2071*c33452fbSAndroid Build Coastguard Worker ++source_iter;
2072*c33452fbSAndroid Build Coastguard Worker source_buffer_offset = 0;
2073*c33452fbSAndroid Build Coastguard Worker }
2074*c33452fbSAndroid Build Coastguard Worker else
2075*c33452fbSAndroid Build Coastguard Worker source_buffer_offset += bytes_copied;
2076*c33452fbSAndroid Build Coastguard Worker }
2077*c33452fbSAndroid Build Coastguard Worker
2078*c33452fbSAndroid Build Coastguard Worker return total_bytes_copied;
2079*c33452fbSAndroid Build Coastguard Worker }
2080*c33452fbSAndroid Build Coastguard Worker
2081*c33452fbSAndroid Build Coastguard Worker /*@}*/
2082*c33452fbSAndroid Build Coastguard Worker
2083*c33452fbSAndroid Build Coastguard Worker } // namespace asio
2084*c33452fbSAndroid Build Coastguard Worker
2085*c33452fbSAndroid Build Coastguard Worker #include "asio/detail/pop_options.hpp"
2086*c33452fbSAndroid Build Coastguard Worker
2087*c33452fbSAndroid Build Coastguard Worker #endif // ASIO_BUFFER_HPP
2088