1 //
2 // read_at.cpp
3 // ~~~~~~~~~~~
4 //
5 // Copyright (c) 2003-2019 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6 //
7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 //
10 
11 // Disable autolinking for unit tests.
12 #if !defined(BOOST_ALL_NO_LIB)
13 #define BOOST_ALL_NO_LIB 1
14 #endif // !defined(BOOST_ALL_NO_LIB)
15 
16 // Test that header file is self-contained.
17 #include <boost/asio/read_at.hpp>
18 
19 #include <cstring>
20 #include "archetypes/async_result.hpp"
21 #include <boost/asio/io_context.hpp>
22 #include <boost/asio/post.hpp>
23 #include <boost/asio/streambuf.hpp>
24 #include "unit_test.hpp"
25 
26 #if defined(BOOST_ASIO_HAS_BOOST_BIND)
27 # include <boost/bind.hpp>
28 #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
29 # include <functional>
30 #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
31 
32 #if defined(BOOST_ASIO_HAS_BOOST_ARRAY)
33 #include <boost/array.hpp>
34 #endif // defined(BOOST_ASIO_HAS_BOOST_ARRAY)
35 
36 #if defined(BOOST_ASIO_HAS_STD_ARRAY)
37 # include <array>
38 #endif // defined(BOOST_ASIO_HAS_STD_ARRAY)
39 
40 using namespace std; // For memcmp, memcpy and memset.
41 
42 class test_random_access_device
43 {
44 public:
45   typedef boost::asio::io_context::executor_type executor_type;
46 
test_random_access_device(boost::asio::io_context & io_context)47   test_random_access_device(boost::asio::io_context& io_context)
48     : io_context_(io_context),
49       length_(0),
50       next_read_length_(0)
51   {
52   }
53 
get_executor()54   executor_type get_executor() BOOST_ASIO_NOEXCEPT
55   {
56     return io_context_.get_executor();
57   }
58 
reset(const void * data,size_t length)59   void reset(const void* data, size_t length)
60   {
61     BOOST_ASIO_CHECK(length <= max_length);
62 
63     length_ = 0;
64     while (length_ + length < max_length)
65     {
66       memcpy(data_ + length_, data, length);
67       length_ += length;
68     }
69 
70     next_read_length_ = length;
71   }
72 
next_read_length(size_t length)73   void next_read_length(size_t length)
74   {
75     next_read_length_ = length;
76   }
77 
78   template <typename Iterator>
check_buffers(boost::asio::uint64_t offset,Iterator begin,Iterator end,size_t length)79   bool check_buffers(boost::asio::uint64_t offset,
80       Iterator begin, Iterator end, size_t length)
81   {
82     if (offset + length > max_length)
83       return false;
84 
85     Iterator iter = begin;
86     size_t checked_length = 0;
87     for (; iter != end && checked_length < length; ++iter)
88     {
89       size_t buffer_length = boost::asio::buffer_size(*iter);
90       if (buffer_length > length - checked_length)
91         buffer_length = length - checked_length;
92       if (memcmp(data_ + offset + checked_length,
93             iter->data(), buffer_length) != 0)
94         return false;
95       checked_length += buffer_length;
96     }
97 
98     return true;
99   }
100 
101   template <typename Const_Buffers>
check_buffers(boost::asio::uint64_t offset,const Const_Buffers & buffers,size_t length)102   bool check_buffers(boost::asio::uint64_t offset,
103       const Const_Buffers& buffers, size_t length)
104   {
105     return check_buffers(offset, boost::asio::buffer_sequence_begin(buffers),
106         boost::asio::buffer_sequence_end(buffers), length);
107   }
108 
109   template <typename Mutable_Buffers>
read_some_at(boost::asio::uint64_t offset,const Mutable_Buffers & buffers)110   size_t read_some_at(boost::asio::uint64_t offset,
111       const Mutable_Buffers& buffers)
112   {
113     return boost::asio::buffer_copy(buffers,
114         boost::asio::buffer(data_, length_) + offset,
115         next_read_length_);
116   }
117 
118   template <typename Mutable_Buffers>
read_some_at(boost::asio::uint64_t offset,const Mutable_Buffers & buffers,boost::system::error_code & ec)119   size_t read_some_at(boost::asio::uint64_t offset,
120       const Mutable_Buffers& buffers, boost::system::error_code& ec)
121   {
122     ec = boost::system::error_code();
123     return read_some_at(offset, buffers);
124   }
125 
126   template <typename Mutable_Buffers, typename Handler>
async_read_some_at(boost::asio::uint64_t offset,const Mutable_Buffers & buffers,BOOST_ASIO_MOVE_ARG (Handler)handler)127   void async_read_some_at(boost::asio::uint64_t offset,
128       const Mutable_Buffers& buffers, BOOST_ASIO_MOVE_ARG(Handler) handler)
129   {
130     size_t bytes_transferred = read_some_at(offset, buffers);
131     boost::asio::post(get_executor(),
132         boost::asio::detail::bind_handler(
133           BOOST_ASIO_MOVE_CAST(Handler)(handler),
134           boost::system::error_code(), bytes_transferred));
135   }
136 
137 private:
138   boost::asio::io_context& io_context_;
139   enum { max_length = 8192 };
140   char data_[max_length];
141   size_t length_;
142   size_t next_read_length_;
143 };
144 
145 static const char read_data[]
146   = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
147 
test_3_arg_mutable_buffer_read_at()148 void test_3_arg_mutable_buffer_read_at()
149 {
150   boost::asio::io_context ioc;
151   test_random_access_device s(ioc);
152   char read_buf[sizeof(read_data)];
153   boost::asio::mutable_buffer buffers
154     = boost::asio::buffer(read_buf, sizeof(read_buf));
155 
156   s.reset(read_data, sizeof(read_data));
157   memset(read_buf, 0, sizeof(read_buf));
158   size_t bytes_transferred = boost::asio::read_at(s, 0, buffers);
159   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
160   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
161 
162   s.reset(read_data, sizeof(read_data));
163   memset(read_buf, 0, sizeof(read_buf));
164   bytes_transferred = boost::asio::read_at(s, 1234, buffers);
165   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
166   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
167 
168   s.reset(read_data, sizeof(read_data));
169   s.next_read_length(1);
170   memset(read_buf, 0, sizeof(read_buf));
171   bytes_transferred = boost::asio::read_at(s, 0, buffers);
172   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
173   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
174 
175   s.reset(read_data, sizeof(read_data));
176   s.next_read_length(1);
177   memset(read_buf, 0, sizeof(read_buf));
178   bytes_transferred = boost::asio::read_at(s, 1234, buffers);
179   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
180   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
181 
182   s.reset(read_data, sizeof(read_data));
183   s.next_read_length(10);
184   memset(read_buf, 0, sizeof(read_buf));
185   bytes_transferred = boost::asio::read_at(s, 0, buffers);
186   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
187   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
188 
189   s.reset(read_data, sizeof(read_data));
190   s.next_read_length(10);
191   memset(read_buf, 0, sizeof(read_buf));
192   bytes_transferred = boost::asio::read_at(s, 1234, buffers);
193   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
194   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
195 }
196 
test_3_arg_vector_buffers_read_at()197 void test_3_arg_vector_buffers_read_at()
198 {
199   boost::asio::io_context ioc;
200   test_random_access_device s(ioc);
201   char read_buf[sizeof(read_data)];
202   std::vector<boost::asio::mutable_buffer> buffers;
203   buffers.push_back(boost::asio::buffer(read_buf, 32));
204   buffers.push_back(boost::asio::buffer(read_buf) + 32);
205 
206   s.reset(read_data, sizeof(read_data));
207   memset(read_buf, 0, sizeof(read_buf));
208   size_t bytes_transferred = boost::asio::read_at(s, 0, buffers);
209   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
210   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
211 
212   s.reset(read_data, sizeof(read_data));
213   memset(read_buf, 0, sizeof(read_buf));
214   bytes_transferred = boost::asio::read_at(s, 1234, buffers);
215   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
216   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
217 
218   s.reset(read_data, sizeof(read_data));
219   s.next_read_length(1);
220   memset(read_buf, 0, sizeof(read_buf));
221   bytes_transferred = boost::asio::read_at(s, 0, buffers);
222   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
223   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
224 
225   s.reset(read_data, sizeof(read_data));
226   s.next_read_length(1);
227   memset(read_buf, 0, sizeof(read_buf));
228   bytes_transferred = boost::asio::read_at(s, 1234, buffers);
229   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
230   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
231 
232   s.reset(read_data, sizeof(read_data));
233   s.next_read_length(10);
234   memset(read_buf, 0, sizeof(read_buf));
235   bytes_transferred = boost::asio::read_at(s, 0, buffers);
236   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
237   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
238 
239   s.reset(read_data, sizeof(read_data));
240   s.next_read_length(10);
241   memset(read_buf, 0, sizeof(read_buf));
242   bytes_transferred = boost::asio::read_at(s, 1234, buffers);
243   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
244   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
245 }
246 
test_3_arg_streambuf_read_at()247 void test_3_arg_streambuf_read_at()
248 {
249   boost::asio::io_context ioc;
250   test_random_access_device s(ioc);
251   boost::asio::streambuf sb(sizeof(read_data));
252 
253   s.reset(read_data, sizeof(read_data));
254   sb.consume(sb.size());
255   size_t bytes_transferred = boost::asio::read_at(s, 0, sb);
256   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
257   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
258   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
259 
260   s.reset(read_data, sizeof(read_data));
261   sb.consume(sb.size());
262   bytes_transferred = boost::asio::read_at(s, 1234, sb);
263   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
264   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
265   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
266 
267   s.reset(read_data, sizeof(read_data));
268   s.next_read_length(1);
269   sb.consume(sb.size());
270   bytes_transferred = boost::asio::read_at(s, 0, sb);
271   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
272   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
273   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
274 
275   s.reset(read_data, sizeof(read_data));
276   s.next_read_length(1);
277   sb.consume(sb.size());
278   bytes_transferred = boost::asio::read_at(s, 1234, sb);
279   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
280   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
281   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
282 
283   s.reset(read_data, sizeof(read_data));
284   s.next_read_length(10);
285   sb.consume(sb.size());
286   bytes_transferred = boost::asio::read_at(s, 0, sb);
287   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
288   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
289   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
290 
291   s.reset(read_data, sizeof(read_data));
292   s.next_read_length(10);
293   sb.consume(sb.size());
294   bytes_transferred = boost::asio::read_at(s, 1234, sb);
295   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
296   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
297   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
298 }
299 
test_4_arg_nothrow_mutable_buffer_read_at()300 void test_4_arg_nothrow_mutable_buffer_read_at()
301 {
302   boost::asio::io_context ioc;
303   test_random_access_device s(ioc);
304   char read_buf[sizeof(read_data)];
305   boost::asio::mutable_buffer buffers
306     = boost::asio::buffer(read_buf, sizeof(read_buf));
307 
308   s.reset(read_data, sizeof(read_data));
309   memset(read_buf, 0, sizeof(read_buf));
310   boost::system::error_code error;
311   size_t bytes_transferred = boost::asio::read_at(s, 0, buffers, error);
312   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
313   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
314   BOOST_ASIO_CHECK(!error);
315 
316   s.reset(read_data, sizeof(read_data));
317   memset(read_buf, 0, sizeof(read_buf));
318   bytes_transferred = boost::asio::read_at(s, 1234, buffers, error);
319   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
320   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
321   BOOST_ASIO_CHECK(!error);
322 
323   s.reset(read_data, sizeof(read_data));
324   s.next_read_length(1);
325   memset(read_buf, 0, sizeof(read_buf));
326   bytes_transferred = boost::asio::read_at(s, 0, buffers, error);
327   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
328   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
329   BOOST_ASIO_CHECK(!error);
330 
331   s.reset(read_data, sizeof(read_data));
332   s.next_read_length(1);
333   memset(read_buf, 0, sizeof(read_buf));
334   bytes_transferred = boost::asio::read_at(s, 1234, buffers, error);
335   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
336   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
337   BOOST_ASIO_CHECK(!error);
338 
339   s.reset(read_data, sizeof(read_data));
340   s.next_read_length(10);
341   memset(read_buf, 0, sizeof(read_buf));
342   bytes_transferred = boost::asio::read_at(s, 0, buffers, error);
343   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
344   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
345   BOOST_ASIO_CHECK(!error);
346 
347   s.reset(read_data, sizeof(read_data));
348   s.next_read_length(10);
349   memset(read_buf, 0, sizeof(read_buf));
350   bytes_transferred = boost::asio::read_at(s, 1234, buffers, error);
351   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
352   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
353   BOOST_ASIO_CHECK(!error);
354 }
355 
test_4_arg_nothrow_vector_buffers_read_at()356 void test_4_arg_nothrow_vector_buffers_read_at()
357 {
358   boost::asio::io_context ioc;
359   test_random_access_device s(ioc);
360   char read_buf[sizeof(read_data)];
361   std::vector<boost::asio::mutable_buffer> buffers;
362   buffers.push_back(boost::asio::buffer(read_buf, 32));
363   buffers.push_back(boost::asio::buffer(read_buf) + 32);
364 
365   s.reset(read_data, sizeof(read_data));
366   memset(read_buf, 0, sizeof(read_buf));
367   boost::system::error_code error;
368   size_t bytes_transferred = boost::asio::read_at(s, 0, buffers, error);
369   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
370   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
371   BOOST_ASIO_CHECK(!error);
372 
373   s.reset(read_data, sizeof(read_data));
374   memset(read_buf, 0, sizeof(read_buf));
375   bytes_transferred = boost::asio::read_at(s, 1234, buffers, error);
376   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
377   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
378   BOOST_ASIO_CHECK(!error);
379 
380   s.reset(read_data, sizeof(read_data));
381   s.next_read_length(1);
382   memset(read_buf, 0, sizeof(read_buf));
383   bytes_transferred = boost::asio::read_at(s, 0, buffers, error);
384   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
385   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
386   BOOST_ASIO_CHECK(!error);
387 
388   s.reset(read_data, sizeof(read_data));
389   s.next_read_length(1);
390   memset(read_buf, 0, sizeof(read_buf));
391   bytes_transferred = boost::asio::read_at(s, 1234, buffers, error);
392   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
393   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
394   BOOST_ASIO_CHECK(!error);
395 
396   s.reset(read_data, sizeof(read_data));
397   s.next_read_length(10);
398   memset(read_buf, 0, sizeof(read_buf));
399   bytes_transferred = boost::asio::read_at(s, 0, buffers, error);
400   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
401   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
402   BOOST_ASIO_CHECK(!error);
403 
404   s.reset(read_data, sizeof(read_data));
405   s.next_read_length(10);
406   memset(read_buf, 0, sizeof(read_buf));
407   bytes_transferred = boost::asio::read_at(s, 1234, buffers, error);
408   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
409   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
410   BOOST_ASIO_CHECK(!error);
411 }
412 
test_4_arg_nothrow_streambuf_read_at()413 void test_4_arg_nothrow_streambuf_read_at()
414 {
415   boost::asio::io_context ioc;
416   test_random_access_device s(ioc);
417   boost::asio::streambuf sb(sizeof(read_data));
418 
419   s.reset(read_data, sizeof(read_data));
420   sb.consume(sb.size());
421   boost::system::error_code error;
422   size_t bytes_transferred = boost::asio::read_at(s, 0, sb, error);
423   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
424   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
425   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
426   BOOST_ASIO_CHECK(!error);
427 
428   s.reset(read_data, sizeof(read_data));
429   sb.consume(sb.size());
430   bytes_transferred = boost::asio::read_at(s, 1234, sb, error);
431   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
432   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
433   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
434   BOOST_ASIO_CHECK(!error);
435 
436   s.reset(read_data, sizeof(read_data));
437   s.next_read_length(1);
438   sb.consume(sb.size());
439   bytes_transferred = boost::asio::read_at(s, 0, sb, error);
440   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
441   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
442   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
443   BOOST_ASIO_CHECK(!error);
444 
445   s.reset(read_data, sizeof(read_data));
446   s.next_read_length(1);
447   sb.consume(sb.size());
448   bytes_transferred = boost::asio::read_at(s, 1234, sb, error);
449   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
450   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
451   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
452   BOOST_ASIO_CHECK(!error);
453 
454   s.reset(read_data, sizeof(read_data));
455   s.next_read_length(10);
456   sb.consume(sb.size());
457   bytes_transferred = boost::asio::read_at(s, 0, sb, error);
458   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
459   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
460   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
461   BOOST_ASIO_CHECK(!error);
462 
463   s.reset(read_data, sizeof(read_data));
464   s.next_read_length(10);
465   sb.consume(sb.size());
466   bytes_transferred = boost::asio::read_at(s, 1234, sb, error);
467   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
468   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
469   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
470   BOOST_ASIO_CHECK(!error);
471 }
472 
old_style_transfer_all(const boost::system::error_code & ec,size_t)473 bool old_style_transfer_all(const boost::system::error_code& ec,
474     size_t /*bytes_transferred*/)
475 {
476   return !!ec;
477 }
478 
479 struct short_transfer
480 {
short_transfershort_transfer481   short_transfer() {}
482 #if defined(BOOST_ASIO_HAS_MOVE)
short_transfershort_transfer483   short_transfer(short_transfer&&) {}
484 #else // defined(BOOST_ASIO_HAS_MOVE)
short_transfershort_transfer485   short_transfer(const short_transfer&) {}
486 #endif // defined(BOOST_ASIO_HAS_MOVE)
operator ()short_transfer487   size_t operator()(const boost::system::error_code& ec,
488       size_t /*bytes_transferred*/)
489   {
490     return !!ec ? 0 : 3;
491   }
492 };
493 
test_4_arg_mutable_buffer_read_at()494 void test_4_arg_mutable_buffer_read_at()
495 {
496   boost::asio::io_context ioc;
497   test_random_access_device s(ioc);
498   char read_buf[sizeof(read_data)];
499   boost::asio::mutable_buffer buffers
500     = boost::asio::buffer(read_buf, sizeof(read_buf));
501 
502   s.reset(read_data, sizeof(read_data));
503   memset(read_buf, 0, sizeof(read_buf));
504   size_t bytes_transferred = boost::asio::read_at(s, 0, buffers,
505       boost::asio::transfer_all());
506   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
507   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
508 
509   s.reset(read_data, sizeof(read_data));
510   memset(read_buf, 0, sizeof(read_buf));
511   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
512       boost::asio::transfer_all());
513   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
514   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
515 
516   s.reset(read_data, sizeof(read_data));
517   s.next_read_length(1);
518   memset(read_buf, 0, sizeof(read_buf));
519   bytes_transferred = boost::asio::read_at(s, 0, buffers,
520       boost::asio::transfer_all());
521   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
522   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
523 
524   s.reset(read_data, sizeof(read_data));
525   s.next_read_length(1);
526   memset(read_buf, 0, sizeof(read_buf));
527   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
528       boost::asio::transfer_all());
529   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
530   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
531 
532   s.reset(read_data, sizeof(read_data));
533   s.next_read_length(10);
534   memset(read_buf, 0, sizeof(read_buf));
535   bytes_transferred = boost::asio::read_at(s, 0, buffers,
536       boost::asio::transfer_all());
537   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
538   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
539 
540   s.reset(read_data, sizeof(read_data));
541   s.next_read_length(10);
542   memset(read_buf, 0, sizeof(read_buf));
543   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
544       boost::asio::transfer_all());
545   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
546   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
547 
548   s.reset(read_data, sizeof(read_data));
549   memset(read_buf, 0, sizeof(read_buf));
550   bytes_transferred = boost::asio::read_at(s, 0, buffers,
551       boost::asio::transfer_at_least(1));
552   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
553   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
554 
555   s.reset(read_data, sizeof(read_data));
556   memset(read_buf, 0, sizeof(read_buf));
557   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
558       boost::asio::transfer_at_least(1));
559   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
560   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
561 
562   s.reset(read_data, sizeof(read_data));
563   s.next_read_length(1);
564   memset(read_buf, 0, sizeof(read_buf));
565   bytes_transferred = boost::asio::read_at(s, 0, buffers,
566       boost::asio::transfer_at_least(1));
567   BOOST_ASIO_CHECK(bytes_transferred == 1);
568   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
569 
570   s.reset(read_data, sizeof(read_data));
571   s.next_read_length(1);
572   memset(read_buf, 0, sizeof(read_buf));
573   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
574       boost::asio::transfer_at_least(1));
575   BOOST_ASIO_CHECK(bytes_transferred == 1);
576   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
577 
578   s.reset(read_data, sizeof(read_data));
579   s.next_read_length(10);
580   memset(read_buf, 0, sizeof(read_buf));
581   bytes_transferred = boost::asio::read_at(s, 0, buffers,
582       boost::asio::transfer_at_least(1));
583   BOOST_ASIO_CHECK(bytes_transferred == 10);
584   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
585 
586   s.reset(read_data, sizeof(read_data));
587   s.next_read_length(10);
588   memset(read_buf, 0, sizeof(read_buf));
589   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
590       boost::asio::transfer_at_least(1));
591   BOOST_ASIO_CHECK(bytes_transferred == 10);
592   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
593 
594   s.reset(read_data, sizeof(read_data));
595   memset(read_buf, 0, sizeof(read_buf));
596   bytes_transferred = boost::asio::read_at(s, 0, buffers,
597       boost::asio::transfer_at_least(10));
598   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
599   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
600 
601   s.reset(read_data, sizeof(read_data));
602   memset(read_buf, 0, sizeof(read_buf));
603   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
604       boost::asio::transfer_at_least(10));
605   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
606   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
607 
608   s.reset(read_data, sizeof(read_data));
609   s.next_read_length(1);
610   memset(read_buf, 0, sizeof(read_buf));
611   bytes_transferred = boost::asio::read_at(s, 0, buffers,
612       boost::asio::transfer_at_least(10));
613   BOOST_ASIO_CHECK(bytes_transferred == 10);
614   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
615 
616   s.reset(read_data, sizeof(read_data));
617   s.next_read_length(1);
618   memset(read_buf, 0, sizeof(read_buf));
619   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
620       boost::asio::transfer_at_least(10));
621   BOOST_ASIO_CHECK(bytes_transferred == 10);
622   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
623 
624   s.reset(read_data, sizeof(read_data));
625   s.next_read_length(10);
626   memset(read_buf, 0, sizeof(read_buf));
627   bytes_transferred = boost::asio::read_at(s, 0, buffers,
628       boost::asio::transfer_at_least(10));
629   BOOST_ASIO_CHECK(bytes_transferred == 10);
630   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
631 
632   s.reset(read_data, sizeof(read_data));
633   s.next_read_length(10);
634   memset(read_buf, 0, sizeof(read_buf));
635   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
636       boost::asio::transfer_at_least(10));
637   BOOST_ASIO_CHECK(bytes_transferred == 10);
638   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
639 
640   s.reset(read_data, sizeof(read_data));
641   memset(read_buf, 0, sizeof(read_buf));
642   bytes_transferred = boost::asio::read_at(s, 0, buffers,
643       boost::asio::transfer_at_least(42));
644   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
645   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
646 
647   s.reset(read_data, sizeof(read_data));
648   memset(read_buf, 0, sizeof(read_buf));
649   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
650       boost::asio::transfer_at_least(42));
651   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
652   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
653 
654   s.reset(read_data, sizeof(read_data));
655   s.next_read_length(1);
656   memset(read_buf, 0, sizeof(read_buf));
657   bytes_transferred = boost::asio::read_at(s, 0, buffers,
658       boost::asio::transfer_at_least(42));
659   BOOST_ASIO_CHECK(bytes_transferred == 42);
660   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
661 
662   s.reset(read_data, sizeof(read_data));
663   s.next_read_length(1);
664   memset(read_buf, 0, sizeof(read_buf));
665   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
666       boost::asio::transfer_at_least(42));
667   BOOST_ASIO_CHECK(bytes_transferred == 42);
668   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
669 
670   s.reset(read_data, sizeof(read_data));
671   s.next_read_length(10);
672   memset(read_buf, 0, sizeof(read_buf));
673   bytes_transferred = boost::asio::read_at(s, 0, buffers,
674       boost::asio::transfer_at_least(42));
675   BOOST_ASIO_CHECK(bytes_transferred == 50);
676   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 50));
677 
678   s.reset(read_data, sizeof(read_data));
679   s.next_read_length(10);
680   memset(read_buf, 0, sizeof(read_buf));
681   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
682       boost::asio::transfer_at_least(42));
683   BOOST_ASIO_CHECK(bytes_transferred == 50);
684   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 50));
685 
686   s.reset(read_data, sizeof(read_data));
687   memset(read_buf, 0, sizeof(read_buf));
688   bytes_transferred = boost::asio::read_at(s, 0, buffers,
689       boost::asio::transfer_exactly(1));
690   BOOST_ASIO_CHECK(bytes_transferred == 1);
691   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
692 
693   s.reset(read_data, sizeof(read_data));
694   memset(read_buf, 0, sizeof(read_buf));
695   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
696       boost::asio::transfer_exactly(1));
697   BOOST_ASIO_CHECK(bytes_transferred == 1);
698   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
699 
700   s.reset(read_data, sizeof(read_data));
701   s.next_read_length(1);
702   memset(read_buf, 0, sizeof(read_buf));
703   bytes_transferred = boost::asio::read_at(s, 0, buffers,
704       boost::asio::transfer_exactly(1));
705   BOOST_ASIO_CHECK(bytes_transferred == 1);
706   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
707 
708   s.reset(read_data, sizeof(read_data));
709   s.next_read_length(1);
710   memset(read_buf, 0, sizeof(read_buf));
711   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
712       boost::asio::transfer_exactly(1));
713   BOOST_ASIO_CHECK(bytes_transferred == 1);
714   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
715 
716   s.reset(read_data, sizeof(read_data));
717   s.next_read_length(10);
718   memset(read_buf, 0, sizeof(read_buf));
719   bytes_transferred = boost::asio::read_at(s, 0, buffers,
720       boost::asio::transfer_exactly(1));
721   BOOST_ASIO_CHECK(bytes_transferred == 1);
722   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
723 
724   s.reset(read_data, sizeof(read_data));
725   s.next_read_length(10);
726   memset(read_buf, 0, sizeof(read_buf));
727   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
728       boost::asio::transfer_exactly(1));
729   BOOST_ASIO_CHECK(bytes_transferred == 1);
730   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
731 
732   s.reset(read_data, sizeof(read_data));
733   memset(read_buf, 0, sizeof(read_buf));
734   bytes_transferred = boost::asio::read_at(s, 0, buffers,
735       boost::asio::transfer_exactly(10));
736   BOOST_ASIO_CHECK(bytes_transferred == 10);
737   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
738 
739   s.reset(read_data, sizeof(read_data));
740   memset(read_buf, 0, sizeof(read_buf));
741   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
742       boost::asio::transfer_exactly(10));
743   BOOST_ASIO_CHECK(bytes_transferred == 10);
744   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
745 
746   s.reset(read_data, sizeof(read_data));
747   s.next_read_length(1);
748   memset(read_buf, 0, sizeof(read_buf));
749   bytes_transferred = boost::asio::read_at(s, 0, buffers,
750       boost::asio::transfer_exactly(10));
751   BOOST_ASIO_CHECK(bytes_transferred == 10);
752   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
753 
754   s.reset(read_data, sizeof(read_data));
755   s.next_read_length(1);
756   memset(read_buf, 0, sizeof(read_buf));
757   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
758       boost::asio::transfer_exactly(10));
759   BOOST_ASIO_CHECK(bytes_transferred == 10);
760   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
761 
762   s.reset(read_data, sizeof(read_data));
763   s.next_read_length(10);
764   memset(read_buf, 0, sizeof(read_buf));
765   bytes_transferred = boost::asio::read_at(s, 0, buffers,
766       boost::asio::transfer_exactly(10));
767   BOOST_ASIO_CHECK(bytes_transferred == 10);
768   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
769 
770   s.reset(read_data, sizeof(read_data));
771   s.next_read_length(10);
772   memset(read_buf, 0, sizeof(read_buf));
773   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
774       boost::asio::transfer_exactly(10));
775   BOOST_ASIO_CHECK(bytes_transferred == 10);
776   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
777 
778   s.reset(read_data, sizeof(read_data));
779   memset(read_buf, 0, sizeof(read_buf));
780   bytes_transferred = boost::asio::read_at(s, 0, buffers,
781       boost::asio::transfer_exactly(42));
782   BOOST_ASIO_CHECK(bytes_transferred == 42);
783   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
784 
785   s.reset(read_data, sizeof(read_data));
786   memset(read_buf, 0, sizeof(read_buf));
787   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
788       boost::asio::transfer_exactly(42));
789   BOOST_ASIO_CHECK(bytes_transferred == 42);
790   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
791 
792   s.reset(read_data, sizeof(read_data));
793   s.next_read_length(1);
794   memset(read_buf, 0, sizeof(read_buf));
795   bytes_transferred = boost::asio::read_at(s, 0, buffers,
796       boost::asio::transfer_exactly(42));
797   BOOST_ASIO_CHECK(bytes_transferred == 42);
798   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
799 
800   s.reset(read_data, sizeof(read_data));
801   s.next_read_length(1);
802   memset(read_buf, 0, sizeof(read_buf));
803   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
804       boost::asio::transfer_exactly(42));
805   BOOST_ASIO_CHECK(bytes_transferred == 42);
806   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
807 
808   s.reset(read_data, sizeof(read_data));
809   s.next_read_length(10);
810   memset(read_buf, 0, sizeof(read_buf));
811   bytes_transferred = boost::asio::read_at(s, 0, buffers,
812       boost::asio::transfer_exactly(42));
813   BOOST_ASIO_CHECK(bytes_transferred == 42);
814   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
815 
816   s.reset(read_data, sizeof(read_data));
817   s.next_read_length(10);
818   memset(read_buf, 0, sizeof(read_buf));
819   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
820       boost::asio::transfer_exactly(42));
821   BOOST_ASIO_CHECK(bytes_transferred == 42);
822   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
823 
824   s.reset(read_data, sizeof(read_data));
825   memset(read_buf, 0, sizeof(read_buf));
826   bytes_transferred = boost::asio::read_at(s, 0, buffers,
827       old_style_transfer_all);
828   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
829   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
830 
831   s.reset(read_data, sizeof(read_data));
832   memset(read_buf, 0, sizeof(read_buf));
833   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
834       old_style_transfer_all);
835   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
836   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
837 
838   s.reset(read_data, sizeof(read_data));
839   s.next_read_length(1);
840   memset(read_buf, 0, sizeof(read_buf));
841   bytes_transferred = boost::asio::read_at(s, 0, buffers,
842       old_style_transfer_all);
843   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
844   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
845 
846   s.reset(read_data, sizeof(read_data));
847   s.next_read_length(1);
848   memset(read_buf, 0, sizeof(read_buf));
849   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
850       old_style_transfer_all);
851   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
852   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
853 
854   s.reset(read_data, sizeof(read_data));
855   s.next_read_length(10);
856   memset(read_buf, 0, sizeof(read_buf));
857   bytes_transferred = boost::asio::read_at(s, 0, buffers,
858       old_style_transfer_all);
859   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
860   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
861 
862   s.reset(read_data, sizeof(read_data));
863   s.next_read_length(10);
864   memset(read_buf, 0, sizeof(read_buf));
865   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
866       old_style_transfer_all);
867   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
868   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
869 
870   s.reset(read_data, sizeof(read_data));
871   memset(read_buf, 0, sizeof(read_buf));
872   bytes_transferred = boost::asio::read_at(s, 0, buffers, short_transfer());
873   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
874   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
875 
876   s.reset(read_data, sizeof(read_data));
877   memset(read_buf, 0, sizeof(read_buf));
878   bytes_transferred = boost::asio::read_at(s, 1234, buffers, short_transfer());
879   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
880   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
881 
882   s.reset(read_data, sizeof(read_data));
883   s.next_read_length(1);
884   memset(read_buf, 0, sizeof(read_buf));
885   bytes_transferred = boost::asio::read_at(s, 0, buffers, short_transfer());
886   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
887   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
888 
889   s.reset(read_data, sizeof(read_data));
890   s.next_read_length(1);
891   memset(read_buf, 0, sizeof(read_buf));
892   bytes_transferred = boost::asio::read_at(s, 1234, buffers, short_transfer());
893   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
894   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
895 
896   s.reset(read_data, sizeof(read_data));
897   s.next_read_length(10);
898   memset(read_buf, 0, sizeof(read_buf));
899   bytes_transferred = boost::asio::read_at(s, 0, buffers, short_transfer());
900   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
901   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
902 
903   s.reset(read_data, sizeof(read_data));
904   s.next_read_length(10);
905   memset(read_buf, 0, sizeof(read_buf));
906   bytes_transferred = boost::asio::read_at(s, 1234, buffers, short_transfer());
907   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
908   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
909 }
910 
test_4_arg_vector_buffers_read_at()911 void test_4_arg_vector_buffers_read_at()
912 {
913   boost::asio::io_context ioc;
914   test_random_access_device s(ioc);
915   char read_buf[sizeof(read_data)];
916   std::vector<boost::asio::mutable_buffer> buffers;
917   buffers.push_back(boost::asio::buffer(read_buf, 32));
918   buffers.push_back(boost::asio::buffer(read_buf) + 32);
919 
920   s.reset(read_data, sizeof(read_data));
921   memset(read_buf, 0, sizeof(read_buf));
922   size_t bytes_transferred = boost::asio::read_at(s, 0, buffers,
923       boost::asio::transfer_all());
924   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
925   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
926 
927   s.reset(read_data, sizeof(read_data));
928   memset(read_buf, 0, sizeof(read_buf));
929   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
930       boost::asio::transfer_all());
931   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
932   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
933 
934   s.reset(read_data, sizeof(read_data));
935   s.next_read_length(1);
936   memset(read_buf, 0, sizeof(read_buf));
937   bytes_transferred = boost::asio::read_at(s, 0, buffers,
938       boost::asio::transfer_all());
939   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
940   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
941 
942   s.reset(read_data, sizeof(read_data));
943   s.next_read_length(1);
944   memset(read_buf, 0, sizeof(read_buf));
945   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
946       boost::asio::transfer_all());
947   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
948   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
949 
950   s.reset(read_data, sizeof(read_data));
951   s.next_read_length(10);
952   memset(read_buf, 0, sizeof(read_buf));
953   bytes_transferred = boost::asio::read_at(s, 0, buffers,
954       boost::asio::transfer_all());
955   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
956   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
957 
958   s.reset(read_data, sizeof(read_data));
959   s.next_read_length(10);
960   memset(read_buf, 0, sizeof(read_buf));
961   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
962       boost::asio::transfer_all());
963   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
964   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
965 
966   s.reset(read_data, sizeof(read_data));
967   memset(read_buf, 0, sizeof(read_buf));
968   bytes_transferred = boost::asio::read_at(s, 0, buffers,
969       boost::asio::transfer_at_least(1));
970   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
971   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
972 
973   s.reset(read_data, sizeof(read_data));
974   memset(read_buf, 0, sizeof(read_buf));
975   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
976       boost::asio::transfer_at_least(1));
977   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
978   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
979 
980   s.reset(read_data, sizeof(read_data));
981   s.next_read_length(1);
982   memset(read_buf, 0, sizeof(read_buf));
983   bytes_transferred = boost::asio::read_at(s, 0, buffers,
984       boost::asio::transfer_at_least(1));
985   BOOST_ASIO_CHECK(bytes_transferred == 1);
986   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
987 
988   s.reset(read_data, sizeof(read_data));
989   s.next_read_length(1);
990   memset(read_buf, 0, sizeof(read_buf));
991   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
992       boost::asio::transfer_at_least(1));
993   BOOST_ASIO_CHECK(bytes_transferred == 1);
994   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
995 
996   s.reset(read_data, sizeof(read_data));
997   s.next_read_length(10);
998   memset(read_buf, 0, sizeof(read_buf));
999   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1000       boost::asio::transfer_at_least(1));
1001   BOOST_ASIO_CHECK(bytes_transferred == 10);
1002   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
1003 
1004   s.reset(read_data, sizeof(read_data));
1005   s.next_read_length(10);
1006   memset(read_buf, 0, sizeof(read_buf));
1007   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1008       boost::asio::transfer_at_least(1));
1009   BOOST_ASIO_CHECK(bytes_transferred == 10);
1010   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
1011 
1012   s.reset(read_data, sizeof(read_data));
1013   memset(read_buf, 0, sizeof(read_buf));
1014   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1015       boost::asio::transfer_at_least(10));
1016   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1017   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
1018 
1019   s.reset(read_data, sizeof(read_data));
1020   memset(read_buf, 0, sizeof(read_buf));
1021   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1022       boost::asio::transfer_at_least(10));
1023   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1024   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
1025 
1026   s.reset(read_data, sizeof(read_data));
1027   s.next_read_length(1);
1028   memset(read_buf, 0, sizeof(read_buf));
1029   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1030       boost::asio::transfer_at_least(10));
1031   BOOST_ASIO_CHECK(bytes_transferred == 10);
1032   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
1033 
1034   s.reset(read_data, sizeof(read_data));
1035   s.next_read_length(1);
1036   memset(read_buf, 0, sizeof(read_buf));
1037   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1038       boost::asio::transfer_at_least(10));
1039   BOOST_ASIO_CHECK(bytes_transferred == 10);
1040   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
1041 
1042   s.reset(read_data, sizeof(read_data));
1043   s.next_read_length(10);
1044   memset(read_buf, 0, sizeof(read_buf));
1045   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1046       boost::asio::transfer_at_least(10));
1047   BOOST_ASIO_CHECK(bytes_transferred == 10);
1048   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
1049 
1050   s.reset(read_data, sizeof(read_data));
1051   s.next_read_length(10);
1052   memset(read_buf, 0, sizeof(read_buf));
1053   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1054       boost::asio::transfer_at_least(10));
1055   BOOST_ASIO_CHECK(bytes_transferred == 10);
1056   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
1057 
1058   s.reset(read_data, sizeof(read_data));
1059   memset(read_buf, 0, sizeof(read_buf));
1060   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1061       boost::asio::transfer_at_least(42));
1062   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1063   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
1064 
1065   s.reset(read_data, sizeof(read_data));
1066   memset(read_buf, 0, sizeof(read_buf));
1067   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1068       boost::asio::transfer_at_least(42));
1069   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1070   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
1071 
1072   s.reset(read_data, sizeof(read_data));
1073   s.next_read_length(1);
1074   memset(read_buf, 0, sizeof(read_buf));
1075   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1076       boost::asio::transfer_at_least(42));
1077   BOOST_ASIO_CHECK(bytes_transferred == 42);
1078   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
1079 
1080   s.reset(read_data, sizeof(read_data));
1081   s.next_read_length(1);
1082   memset(read_buf, 0, sizeof(read_buf));
1083   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1084       boost::asio::transfer_at_least(42));
1085   BOOST_ASIO_CHECK(bytes_transferred == 42);
1086   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
1087 
1088   s.reset(read_data, sizeof(read_data));
1089   s.next_read_length(10);
1090   memset(read_buf, 0, sizeof(read_buf));
1091   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1092       boost::asio::transfer_at_least(42));
1093   BOOST_ASIO_CHECK(bytes_transferred == 50);
1094   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 50));
1095 
1096   s.reset(read_data, sizeof(read_data));
1097   s.next_read_length(10);
1098   memset(read_buf, 0, sizeof(read_buf));
1099   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1100       boost::asio::transfer_at_least(42));
1101   BOOST_ASIO_CHECK(bytes_transferred == 50);
1102   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 50));
1103 
1104   s.reset(read_data, sizeof(read_data));
1105   memset(read_buf, 0, sizeof(read_buf));
1106   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1107       boost::asio::transfer_exactly(1));
1108   BOOST_ASIO_CHECK(bytes_transferred == 1);
1109   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
1110 
1111   s.reset(read_data, sizeof(read_data));
1112   memset(read_buf, 0, sizeof(read_buf));
1113   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1114       boost::asio::transfer_exactly(1));
1115   BOOST_ASIO_CHECK(bytes_transferred == 1);
1116   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
1117 
1118   s.reset(read_data, sizeof(read_data));
1119   s.next_read_length(1);
1120   memset(read_buf, 0, sizeof(read_buf));
1121   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1122       boost::asio::transfer_exactly(1));
1123   BOOST_ASIO_CHECK(bytes_transferred == 1);
1124   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
1125 
1126   s.reset(read_data, sizeof(read_data));
1127   s.next_read_length(1);
1128   memset(read_buf, 0, sizeof(read_buf));
1129   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1130       boost::asio::transfer_exactly(1));
1131   BOOST_ASIO_CHECK(bytes_transferred == 1);
1132   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
1133 
1134   s.reset(read_data, sizeof(read_data));
1135   s.next_read_length(10);
1136   memset(read_buf, 0, sizeof(read_buf));
1137   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1138       boost::asio::transfer_exactly(1));
1139   BOOST_ASIO_CHECK(bytes_transferred == 1);
1140   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
1141 
1142   s.reset(read_data, sizeof(read_data));
1143   s.next_read_length(10);
1144   memset(read_buf, 0, sizeof(read_buf));
1145   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1146       boost::asio::transfer_exactly(1));
1147   BOOST_ASIO_CHECK(bytes_transferred == 1);
1148   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
1149 
1150   s.reset(read_data, sizeof(read_data));
1151   memset(read_buf, 0, sizeof(read_buf));
1152   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1153       boost::asio::transfer_exactly(10));
1154   BOOST_ASIO_CHECK(bytes_transferred == 10);
1155   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
1156 
1157   s.reset(read_data, sizeof(read_data));
1158   memset(read_buf, 0, sizeof(read_buf));
1159   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1160       boost::asio::transfer_exactly(10));
1161   BOOST_ASIO_CHECK(bytes_transferred == 10);
1162   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
1163 
1164   s.reset(read_data, sizeof(read_data));
1165   s.next_read_length(1);
1166   memset(read_buf, 0, sizeof(read_buf));
1167   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1168       boost::asio::transfer_exactly(10));
1169   BOOST_ASIO_CHECK(bytes_transferred == 10);
1170   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
1171 
1172   s.reset(read_data, sizeof(read_data));
1173   s.next_read_length(1);
1174   memset(read_buf, 0, sizeof(read_buf));
1175   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1176       boost::asio::transfer_exactly(10));
1177   BOOST_ASIO_CHECK(bytes_transferred == 10);
1178   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
1179 
1180   s.reset(read_data, sizeof(read_data));
1181   s.next_read_length(10);
1182   memset(read_buf, 0, sizeof(read_buf));
1183   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1184       boost::asio::transfer_exactly(10));
1185   BOOST_ASIO_CHECK(bytes_transferred == 10);
1186   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
1187 
1188   s.reset(read_data, sizeof(read_data));
1189   s.next_read_length(10);
1190   memset(read_buf, 0, sizeof(read_buf));
1191   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1192       boost::asio::transfer_exactly(10));
1193   BOOST_ASIO_CHECK(bytes_transferred == 10);
1194   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
1195 
1196   s.reset(read_data, sizeof(read_data));
1197   memset(read_buf, 0, sizeof(read_buf));
1198   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1199       boost::asio::transfer_exactly(42));
1200   BOOST_ASIO_CHECK(bytes_transferred == 42);
1201   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
1202 
1203   s.reset(read_data, sizeof(read_data));
1204   memset(read_buf, 0, sizeof(read_buf));
1205   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1206       boost::asio::transfer_exactly(42));
1207   BOOST_ASIO_CHECK(bytes_transferred == 42);
1208   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
1209 
1210   s.reset(read_data, sizeof(read_data));
1211   s.next_read_length(1);
1212   memset(read_buf, 0, sizeof(read_buf));
1213   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1214       boost::asio::transfer_exactly(42));
1215   BOOST_ASIO_CHECK(bytes_transferred == 42);
1216   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
1217 
1218   s.reset(read_data, sizeof(read_data));
1219   s.next_read_length(1);
1220   memset(read_buf, 0, sizeof(read_buf));
1221   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1222       boost::asio::transfer_exactly(42));
1223   BOOST_ASIO_CHECK(bytes_transferred == 42);
1224   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
1225 
1226   s.reset(read_data, sizeof(read_data));
1227   s.next_read_length(10);
1228   memset(read_buf, 0, sizeof(read_buf));
1229   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1230       boost::asio::transfer_exactly(42));
1231   BOOST_ASIO_CHECK(bytes_transferred == 42);
1232   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
1233 
1234   s.reset(read_data, sizeof(read_data));
1235   s.next_read_length(10);
1236   memset(read_buf, 0, sizeof(read_buf));
1237   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1238       boost::asio::transfer_exactly(42));
1239   BOOST_ASIO_CHECK(bytes_transferred == 42);
1240   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
1241 
1242   s.reset(read_data, sizeof(read_data));
1243   memset(read_buf, 0, sizeof(read_buf));
1244   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1245       old_style_transfer_all);
1246   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1247   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
1248 
1249   s.reset(read_data, sizeof(read_data));
1250   memset(read_buf, 0, sizeof(read_buf));
1251   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1252       old_style_transfer_all);
1253   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1254   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
1255 
1256   s.reset(read_data, sizeof(read_data));
1257   s.next_read_length(1);
1258   memset(read_buf, 0, sizeof(read_buf));
1259   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1260       old_style_transfer_all);
1261   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1262   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
1263 
1264   s.reset(read_data, sizeof(read_data));
1265   s.next_read_length(1);
1266   memset(read_buf, 0, sizeof(read_buf));
1267   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1268       old_style_transfer_all);
1269   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1270   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
1271 
1272   s.reset(read_data, sizeof(read_data));
1273   s.next_read_length(10);
1274   memset(read_buf, 0, sizeof(read_buf));
1275   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1276       old_style_transfer_all);
1277   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1278   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
1279 
1280   s.reset(read_data, sizeof(read_data));
1281   s.next_read_length(10);
1282   memset(read_buf, 0, sizeof(read_buf));
1283   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1284       old_style_transfer_all);
1285   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1286   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
1287 
1288   s.reset(read_data, sizeof(read_data));
1289   memset(read_buf, 0, sizeof(read_buf));
1290   bytes_transferred = boost::asio::read_at(s, 0, buffers, short_transfer());
1291   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1292   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
1293 
1294   s.reset(read_data, sizeof(read_data));
1295   memset(read_buf, 0, sizeof(read_buf));
1296   bytes_transferred = boost::asio::read_at(s, 1234, buffers, short_transfer());
1297   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1298   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
1299 
1300   s.reset(read_data, sizeof(read_data));
1301   s.next_read_length(1);
1302   memset(read_buf, 0, sizeof(read_buf));
1303   bytes_transferred = boost::asio::read_at(s, 0, buffers, short_transfer());
1304   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1305   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
1306 
1307   s.reset(read_data, sizeof(read_data));
1308   s.next_read_length(1);
1309   memset(read_buf, 0, sizeof(read_buf));
1310   bytes_transferred = boost::asio::read_at(s, 1234, buffers, short_transfer());
1311   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1312   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
1313 
1314   s.reset(read_data, sizeof(read_data));
1315   s.next_read_length(10);
1316   memset(read_buf, 0, sizeof(read_buf));
1317   bytes_transferred = boost::asio::read_at(s, 0, buffers, short_transfer());
1318   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1319   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
1320 
1321   s.reset(read_data, sizeof(read_data));
1322   s.next_read_length(10);
1323   memset(read_buf, 0, sizeof(read_buf));
1324   bytes_transferred = boost::asio::read_at(s, 1234, buffers, short_transfer());
1325   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1326   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
1327 }
1328 
test_4_arg_streambuf_read_at()1329 void test_4_arg_streambuf_read_at()
1330 {
1331   boost::asio::io_context ioc;
1332   test_random_access_device s(ioc);
1333   boost::asio::streambuf sb(sizeof(read_data));
1334 
1335   s.reset(read_data, sizeof(read_data));
1336   sb.consume(sb.size());
1337   size_t bytes_transferred = boost::asio::read_at(s, 0, sb,
1338       boost::asio::transfer_all());
1339   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1340   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1341   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
1342 
1343   s.reset(read_data, sizeof(read_data));
1344   sb.consume(sb.size());
1345   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1346       boost::asio::transfer_all());
1347   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1348   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1349   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
1350 
1351   s.reset(read_data, sizeof(read_data));
1352   s.next_read_length(1);
1353   sb.consume(sb.size());
1354   bytes_transferred = boost::asio::read_at(s, 0, sb,
1355       boost::asio::transfer_all());
1356   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1357   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1358   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
1359 
1360   s.reset(read_data, sizeof(read_data));
1361   s.next_read_length(1);
1362   sb.consume(sb.size());
1363   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1364       boost::asio::transfer_all());
1365   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1366   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1367   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
1368 
1369   s.reset(read_data, sizeof(read_data));
1370   s.next_read_length(10);
1371   sb.consume(sb.size());
1372   bytes_transferred = boost::asio::read_at(s, 0, sb,
1373       boost::asio::transfer_all());
1374   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1375   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1376   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
1377 
1378   s.reset(read_data, sizeof(read_data));
1379   s.next_read_length(10);
1380   sb.consume(sb.size());
1381   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1382       boost::asio::transfer_all());
1383   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1384   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1385   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
1386 
1387   s.reset(read_data, sizeof(read_data));
1388   sb.consume(sb.size());
1389   bytes_transferred = boost::asio::read_at(s, 0, sb,
1390       boost::asio::transfer_at_least(1));
1391   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1392   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1393   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
1394 
1395   s.reset(read_data, sizeof(read_data));
1396   sb.consume(sb.size());
1397   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1398       boost::asio::transfer_at_least(1));
1399   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1400   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1401   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
1402 
1403   s.reset(read_data, sizeof(read_data));
1404   s.next_read_length(1);
1405   sb.consume(sb.size());
1406   bytes_transferred = boost::asio::read_at(s, 0, sb,
1407       boost::asio::transfer_at_least(1));
1408   BOOST_ASIO_CHECK(bytes_transferred == 1);
1409   BOOST_ASIO_CHECK(sb.size() == 1);
1410   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 1));
1411 
1412   s.reset(read_data, sizeof(read_data));
1413   s.next_read_length(1);
1414   sb.consume(sb.size());
1415   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1416       boost::asio::transfer_at_least(1));
1417   BOOST_ASIO_CHECK(bytes_transferred == 1);
1418   BOOST_ASIO_CHECK(sb.size() == 1);
1419   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 1));
1420 
1421   s.reset(read_data, sizeof(read_data));
1422   s.next_read_length(10);
1423   sb.consume(sb.size());
1424   bytes_transferred = boost::asio::read_at(s, 0, sb,
1425       boost::asio::transfer_at_least(1));
1426   BOOST_ASIO_CHECK(bytes_transferred == 10);
1427   BOOST_ASIO_CHECK(sb.size() == 10);
1428   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 10));
1429 
1430   s.reset(read_data, sizeof(read_data));
1431   s.next_read_length(10);
1432   sb.consume(sb.size());
1433   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1434       boost::asio::transfer_at_least(1));
1435   BOOST_ASIO_CHECK(bytes_transferred == 10);
1436   BOOST_ASIO_CHECK(sb.size() == 10);
1437   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 10));
1438 
1439   s.reset(read_data, sizeof(read_data));
1440   sb.consume(sb.size());
1441   bytes_transferred = boost::asio::read_at(s, 0, sb,
1442       boost::asio::transfer_at_least(10));
1443   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1444   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1445   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
1446 
1447   s.reset(read_data, sizeof(read_data));
1448   sb.consume(sb.size());
1449   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1450       boost::asio::transfer_at_least(10));
1451   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1452   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1453   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
1454 
1455   s.reset(read_data, sizeof(read_data));
1456   s.next_read_length(1);
1457   sb.consume(sb.size());
1458   bytes_transferred = boost::asio::read_at(s, 0, sb,
1459       boost::asio::transfer_at_least(10));
1460   BOOST_ASIO_CHECK(bytes_transferred == 10);
1461   BOOST_ASIO_CHECK(sb.size() == 10);
1462   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 10));
1463 
1464   s.reset(read_data, sizeof(read_data));
1465   s.next_read_length(1);
1466   sb.consume(sb.size());
1467   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1468       boost::asio::transfer_at_least(10));
1469   BOOST_ASIO_CHECK(bytes_transferred == 10);
1470   BOOST_ASIO_CHECK(sb.size() == 10);
1471   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 10));
1472 
1473   s.reset(read_data, sizeof(read_data));
1474   s.next_read_length(10);
1475   sb.consume(sb.size());
1476   bytes_transferred = boost::asio::read_at(s, 0, sb,
1477       boost::asio::transfer_at_least(10));
1478   BOOST_ASIO_CHECK(bytes_transferred == 10);
1479   BOOST_ASIO_CHECK(sb.size() == 10);
1480   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 10));
1481 
1482   s.reset(read_data, sizeof(read_data));
1483   s.next_read_length(10);
1484   sb.consume(sb.size());
1485   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1486       boost::asio::transfer_at_least(10));
1487   BOOST_ASIO_CHECK(bytes_transferred == 10);
1488   BOOST_ASIO_CHECK(sb.size() == 10);
1489   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 10));
1490 
1491   s.reset(read_data, sizeof(read_data));
1492   sb.consume(sb.size());
1493   bytes_transferred = boost::asio::read_at(s, 0, sb,
1494       boost::asio::transfer_at_least(42));
1495   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1496   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1497   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
1498 
1499   s.reset(read_data, sizeof(read_data));
1500   sb.consume(sb.size());
1501   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1502       boost::asio::transfer_at_least(42));
1503   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1504   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1505   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
1506 
1507   s.reset(read_data, sizeof(read_data));
1508   s.next_read_length(1);
1509   sb.consume(sb.size());
1510   bytes_transferred = boost::asio::read_at(s, 0, sb,
1511       boost::asio::transfer_at_least(42));
1512   BOOST_ASIO_CHECK(bytes_transferred == 42);
1513   BOOST_ASIO_CHECK(sb.size() == 42);
1514   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 42));
1515 
1516   s.reset(read_data, sizeof(read_data));
1517   s.next_read_length(1);
1518   sb.consume(sb.size());
1519   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1520       boost::asio::transfer_at_least(42));
1521   BOOST_ASIO_CHECK(bytes_transferred == 42);
1522   BOOST_ASIO_CHECK(sb.size() == 42);
1523   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 42));
1524 
1525   s.reset(read_data, sizeof(read_data));
1526   s.next_read_length(10);
1527   sb.consume(sb.size());
1528   bytes_transferred = boost::asio::read_at(s, 0, sb,
1529       boost::asio::transfer_at_least(42));
1530   BOOST_ASIO_CHECK(bytes_transferred == 50);
1531   BOOST_ASIO_CHECK(sb.size() == 50);
1532   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 50));
1533 
1534   s.reset(read_data, sizeof(read_data));
1535   s.next_read_length(10);
1536   sb.consume(sb.size());
1537   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1538       boost::asio::transfer_at_least(42));
1539   BOOST_ASIO_CHECK(bytes_transferred == 50);
1540   BOOST_ASIO_CHECK(sb.size() == 50);
1541   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 50));
1542 
1543   s.reset(read_data, sizeof(read_data));
1544   sb.consume(sb.size());
1545   bytes_transferred = boost::asio::read_at(s, 0, sb,
1546       boost::asio::transfer_exactly(1));
1547   BOOST_ASIO_CHECK(bytes_transferred == 1);
1548   BOOST_ASIO_CHECK(sb.size() == 1);
1549   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 1));
1550 
1551   s.reset(read_data, sizeof(read_data));
1552   sb.consume(sb.size());
1553   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1554       boost::asio::transfer_exactly(1));
1555   BOOST_ASIO_CHECK(bytes_transferred == 1);
1556   BOOST_ASIO_CHECK(sb.size() == 1);
1557   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 1));
1558 
1559   s.reset(read_data, sizeof(read_data));
1560   s.next_read_length(1);
1561   sb.consume(sb.size());
1562   bytes_transferred = boost::asio::read_at(s, 0, sb,
1563       boost::asio::transfer_exactly(1));
1564   BOOST_ASIO_CHECK(bytes_transferred == 1);
1565   BOOST_ASIO_CHECK(sb.size() == 1);
1566   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 1));
1567 
1568   s.reset(read_data, sizeof(read_data));
1569   s.next_read_length(1);
1570   sb.consume(sb.size());
1571   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1572       boost::asio::transfer_exactly(1));
1573   BOOST_ASIO_CHECK(bytes_transferred == 1);
1574   BOOST_ASIO_CHECK(sb.size() == 1);
1575   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 1));
1576 
1577   s.reset(read_data, sizeof(read_data));
1578   s.next_read_length(10);
1579   sb.consume(sb.size());
1580   bytes_transferred = boost::asio::read_at(s, 0, sb,
1581       boost::asio::transfer_exactly(1));
1582   BOOST_ASIO_CHECK(bytes_transferred == 1);
1583   BOOST_ASIO_CHECK(sb.size() == 1);
1584   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 1));
1585 
1586   s.reset(read_data, sizeof(read_data));
1587   s.next_read_length(10);
1588   sb.consume(sb.size());
1589   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1590       boost::asio::transfer_exactly(1));
1591   BOOST_ASIO_CHECK(bytes_transferred == 1);
1592   BOOST_ASIO_CHECK(sb.size() == 1);
1593   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 1));
1594 
1595   s.reset(read_data, sizeof(read_data));
1596   sb.consume(sb.size());
1597   bytes_transferred = boost::asio::read_at(s, 0, sb,
1598       boost::asio::transfer_exactly(10));
1599   BOOST_ASIO_CHECK(bytes_transferred == 10);
1600   BOOST_ASIO_CHECK(sb.size() == 10);
1601   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 10));
1602 
1603   s.reset(read_data, sizeof(read_data));
1604   sb.consume(sb.size());
1605   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1606       boost::asio::transfer_exactly(10));
1607   BOOST_ASIO_CHECK(bytes_transferred == 10);
1608   BOOST_ASIO_CHECK(sb.size() == 10);
1609   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 10));
1610 
1611   s.reset(read_data, sizeof(read_data));
1612   s.next_read_length(1);
1613   sb.consume(sb.size());
1614   bytes_transferred = boost::asio::read_at(s, 0, sb,
1615       boost::asio::transfer_exactly(10));
1616   BOOST_ASIO_CHECK(bytes_transferred == 10);
1617   BOOST_ASIO_CHECK(sb.size() == 10);
1618   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 10));
1619 
1620   s.reset(read_data, sizeof(read_data));
1621   s.next_read_length(1);
1622   sb.consume(sb.size());
1623   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1624       boost::asio::transfer_exactly(10));
1625   BOOST_ASIO_CHECK(bytes_transferred == 10);
1626   BOOST_ASIO_CHECK(sb.size() == 10);
1627   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 10));
1628 
1629   s.reset(read_data, sizeof(read_data));
1630   s.next_read_length(10);
1631   sb.consume(sb.size());
1632   bytes_transferred = boost::asio::read_at(s, 0, sb,
1633       boost::asio::transfer_exactly(10));
1634   BOOST_ASIO_CHECK(bytes_transferred == 10);
1635   BOOST_ASIO_CHECK(sb.size() == 10);
1636   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 10));
1637 
1638   s.reset(read_data, sizeof(read_data));
1639   s.next_read_length(10);
1640   sb.consume(sb.size());
1641   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1642       boost::asio::transfer_exactly(10));
1643   BOOST_ASIO_CHECK(bytes_transferred == 10);
1644   BOOST_ASIO_CHECK(sb.size() == 10);
1645   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 10));
1646 
1647   s.reset(read_data, sizeof(read_data));
1648   sb.consume(sb.size());
1649   bytes_transferred = boost::asio::read_at(s, 0, sb,
1650       boost::asio::transfer_exactly(42));
1651   BOOST_ASIO_CHECK(bytes_transferred == 42);
1652   BOOST_ASIO_CHECK(sb.size() == 42);
1653   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 42));
1654 
1655   s.reset(read_data, sizeof(read_data));
1656   sb.consume(sb.size());
1657   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1658       boost::asio::transfer_exactly(42));
1659   BOOST_ASIO_CHECK(bytes_transferred == 42);
1660   BOOST_ASIO_CHECK(sb.size() == 42);
1661   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 42));
1662 
1663   s.reset(read_data, sizeof(read_data));
1664   s.next_read_length(1);
1665   sb.consume(sb.size());
1666   bytes_transferred = boost::asio::read_at(s, 0, sb,
1667       boost::asio::transfer_exactly(42));
1668   BOOST_ASIO_CHECK(bytes_transferred == 42);
1669   BOOST_ASIO_CHECK(sb.size() == 42);
1670   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 42));
1671 
1672   s.reset(read_data, sizeof(read_data));
1673   s.next_read_length(1);
1674   sb.consume(sb.size());
1675   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1676       boost::asio::transfer_exactly(42));
1677   BOOST_ASIO_CHECK(bytes_transferred == 42);
1678   BOOST_ASIO_CHECK(sb.size() == 42);
1679   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 42));
1680 
1681   s.reset(read_data, sizeof(read_data));
1682   s.next_read_length(10);
1683   sb.consume(sb.size());
1684   bytes_transferred = boost::asio::read_at(s, 0, sb,
1685       boost::asio::transfer_exactly(42));
1686   BOOST_ASIO_CHECK(bytes_transferred == 42);
1687   BOOST_ASIO_CHECK(sb.size() == 42);
1688   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 42));
1689 
1690   s.reset(read_data, sizeof(read_data));
1691   s.next_read_length(10);
1692   sb.consume(sb.size());
1693   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1694       boost::asio::transfer_exactly(42));
1695   BOOST_ASIO_CHECK(bytes_transferred == 42);
1696   BOOST_ASIO_CHECK(sb.size() == 42);
1697   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 42));
1698 
1699   s.reset(read_data, sizeof(read_data));
1700   sb.consume(sb.size());
1701   bytes_transferred = boost::asio::read_at(s, 0, sb,
1702       old_style_transfer_all);
1703   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1704   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1705   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
1706 
1707   s.reset(read_data, sizeof(read_data));
1708   sb.consume(sb.size());
1709   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1710       old_style_transfer_all);
1711   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1712   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1713   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
1714 
1715   s.reset(read_data, sizeof(read_data));
1716   s.next_read_length(1);
1717   sb.consume(sb.size());
1718   bytes_transferred = boost::asio::read_at(s, 0, sb,
1719       old_style_transfer_all);
1720   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1721   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1722   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
1723 
1724   s.reset(read_data, sizeof(read_data));
1725   s.next_read_length(1);
1726   sb.consume(sb.size());
1727   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1728       old_style_transfer_all);
1729   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1730   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1731   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
1732 
1733   s.reset(read_data, sizeof(read_data));
1734   s.next_read_length(10);
1735   sb.consume(sb.size());
1736   bytes_transferred = boost::asio::read_at(s, 0, sb,
1737       old_style_transfer_all);
1738   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1739   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1740   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
1741 
1742   s.reset(read_data, sizeof(read_data));
1743   s.next_read_length(10);
1744   sb.consume(sb.size());
1745   bytes_transferred = boost::asio::read_at(s, 1234, sb,
1746       old_style_transfer_all);
1747   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1748   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1749   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
1750 
1751   s.reset(read_data, sizeof(read_data));
1752   sb.consume(sb.size());
1753   bytes_transferred = boost::asio::read_at(s, 0, sb, short_transfer());
1754   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1755   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1756   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
1757 
1758   s.reset(read_data, sizeof(read_data));
1759   sb.consume(sb.size());
1760   bytes_transferred = boost::asio::read_at(s, 1234, sb, short_transfer());
1761   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1762   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1763   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
1764 
1765   s.reset(read_data, sizeof(read_data));
1766   s.next_read_length(1);
1767   sb.consume(sb.size());
1768   bytes_transferred = boost::asio::read_at(s, 0, sb, short_transfer());
1769   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1770   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1771   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
1772 
1773   s.reset(read_data, sizeof(read_data));
1774   s.next_read_length(1);
1775   sb.consume(sb.size());
1776   bytes_transferred = boost::asio::read_at(s, 1234, sb, short_transfer());
1777   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1778   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1779   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
1780 
1781   s.reset(read_data, sizeof(read_data));
1782   s.next_read_length(10);
1783   sb.consume(sb.size());
1784   bytes_transferred = boost::asio::read_at(s, 0, sb, short_transfer());
1785   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1786   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1787   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
1788 
1789   s.reset(read_data, sizeof(read_data));
1790   s.next_read_length(10);
1791   sb.consume(sb.size());
1792   bytes_transferred = boost::asio::read_at(s, 1234, sb, short_transfer());
1793   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1794   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
1795   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
1796 }
1797 
test_5_arg_mutable_buffer_read_at()1798 void test_5_arg_mutable_buffer_read_at()
1799 {
1800   boost::asio::io_context ioc;
1801   test_random_access_device s(ioc);
1802   char read_buf[sizeof(read_data)];
1803   boost::asio::mutable_buffer buffers
1804     = boost::asio::buffer(read_buf, sizeof(read_buf));
1805 
1806   s.reset(read_data, sizeof(read_data));
1807   memset(read_buf, 0, sizeof(read_buf));
1808   boost::system::error_code error;
1809   size_t bytes_transferred = boost::asio::read_at(s, 0, buffers,
1810       boost::asio::transfer_all(), error);
1811   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1812   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
1813   BOOST_ASIO_CHECK(!error);
1814 
1815   s.reset(read_data, sizeof(read_data));
1816   memset(read_buf, 0, sizeof(read_buf));
1817   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1818       boost::asio::transfer_all(), error);
1819   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1820   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
1821   BOOST_ASIO_CHECK(!error);
1822 
1823   s.reset(read_data, sizeof(read_data));
1824   s.next_read_length(1);
1825   memset(read_buf, 0, sizeof(read_buf));
1826   error = boost::system::error_code();
1827   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1828       boost::asio::transfer_all(), error);
1829   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1830   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
1831   BOOST_ASIO_CHECK(!error);
1832 
1833   s.reset(read_data, sizeof(read_data));
1834   s.next_read_length(1);
1835   memset(read_buf, 0, sizeof(read_buf));
1836   error = boost::system::error_code();
1837   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1838       boost::asio::transfer_all(), error);
1839   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1840   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
1841   BOOST_ASIO_CHECK(!error);
1842 
1843   s.reset(read_data, sizeof(read_data));
1844   s.next_read_length(10);
1845   memset(read_buf, 0, sizeof(read_buf));
1846   error = boost::system::error_code();
1847   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1848       boost::asio::transfer_all(), error);
1849   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1850   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
1851   BOOST_ASIO_CHECK(!error);
1852 
1853   s.reset(read_data, sizeof(read_data));
1854   s.next_read_length(10);
1855   memset(read_buf, 0, sizeof(read_buf));
1856   error = boost::system::error_code();
1857   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1858       boost::asio::transfer_all(), error);
1859   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1860   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
1861   BOOST_ASIO_CHECK(!error);
1862 
1863   s.reset(read_data, sizeof(read_data));
1864   memset(read_buf, 0, sizeof(read_buf));
1865   error = boost::system::error_code();
1866   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1867       boost::asio::transfer_at_least(1), error);
1868   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1869   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
1870   BOOST_ASIO_CHECK(!error);
1871 
1872   s.reset(read_data, sizeof(read_data));
1873   memset(read_buf, 0, sizeof(read_buf));
1874   error = boost::system::error_code();
1875   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1876       boost::asio::transfer_at_least(1), error);
1877   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1878   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
1879   BOOST_ASIO_CHECK(!error);
1880 
1881   s.reset(read_data, sizeof(read_data));
1882   s.next_read_length(1);
1883   memset(read_buf, 0, sizeof(read_buf));
1884   error = boost::system::error_code();
1885   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1886       boost::asio::transfer_at_least(1), error);
1887   BOOST_ASIO_CHECK(bytes_transferred == 1);
1888   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
1889   BOOST_ASIO_CHECK(!error);
1890 
1891   s.reset(read_data, sizeof(read_data));
1892   s.next_read_length(1);
1893   memset(read_buf, 0, sizeof(read_buf));
1894   error = boost::system::error_code();
1895   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1896       boost::asio::transfer_at_least(1), error);
1897   BOOST_ASIO_CHECK(bytes_transferred == 1);
1898   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
1899   BOOST_ASIO_CHECK(!error);
1900 
1901   s.reset(read_data, sizeof(read_data));
1902   s.next_read_length(10);
1903   memset(read_buf, 0, sizeof(read_buf));
1904   error = boost::system::error_code();
1905   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1906       boost::asio::transfer_at_least(1), error);
1907   BOOST_ASIO_CHECK(bytes_transferred == 10);
1908   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
1909   BOOST_ASIO_CHECK(!error);
1910 
1911   s.reset(read_data, sizeof(read_data));
1912   s.next_read_length(10);
1913   memset(read_buf, 0, sizeof(read_buf));
1914   error = boost::system::error_code();
1915   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1916       boost::asio::transfer_at_least(1), error);
1917   BOOST_ASIO_CHECK(bytes_transferred == 10);
1918   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
1919   BOOST_ASIO_CHECK(!error);
1920 
1921   s.reset(read_data, sizeof(read_data));
1922   memset(read_buf, 0, sizeof(read_buf));
1923   error = boost::system::error_code();
1924   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1925       boost::asio::transfer_at_least(10), error);
1926   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1927   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
1928   BOOST_ASIO_CHECK(!error);
1929 
1930   s.reset(read_data, sizeof(read_data));
1931   memset(read_buf, 0, sizeof(read_buf));
1932   error = boost::system::error_code();
1933   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1934       boost::asio::transfer_at_least(10), error);
1935   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1936   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
1937   BOOST_ASIO_CHECK(!error);
1938 
1939   s.reset(read_data, sizeof(read_data));
1940   s.next_read_length(1);
1941   memset(read_buf, 0, sizeof(read_buf));
1942   error = boost::system::error_code();
1943   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1944       boost::asio::transfer_at_least(10), error);
1945   BOOST_ASIO_CHECK(bytes_transferred == 10);
1946   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
1947   BOOST_ASIO_CHECK(!error);
1948 
1949   s.reset(read_data, sizeof(read_data));
1950   s.next_read_length(1);
1951   memset(read_buf, 0, sizeof(read_buf));
1952   error = boost::system::error_code();
1953   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1954       boost::asio::transfer_at_least(10), error);
1955   BOOST_ASIO_CHECK(bytes_transferred == 10);
1956   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
1957   BOOST_ASIO_CHECK(!error);
1958 
1959   s.reset(read_data, sizeof(read_data));
1960   s.next_read_length(10);
1961   memset(read_buf, 0, sizeof(read_buf));
1962   error = boost::system::error_code();
1963   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1964       boost::asio::transfer_at_least(10), error);
1965   BOOST_ASIO_CHECK(bytes_transferred == 10);
1966   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
1967   BOOST_ASIO_CHECK(!error);
1968 
1969   s.reset(read_data, sizeof(read_data));
1970   s.next_read_length(10);
1971   memset(read_buf, 0, sizeof(read_buf));
1972   error = boost::system::error_code();
1973   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1974       boost::asio::transfer_at_least(10), error);
1975   BOOST_ASIO_CHECK(bytes_transferred == 10);
1976   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
1977   BOOST_ASIO_CHECK(!error);
1978 
1979   s.reset(read_data, sizeof(read_data));
1980   memset(read_buf, 0, sizeof(read_buf));
1981   error = boost::system::error_code();
1982   bytes_transferred = boost::asio::read_at(s, 0, buffers,
1983       boost::asio::transfer_at_least(42), error);
1984   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1985   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
1986   BOOST_ASIO_CHECK(!error);
1987 
1988   s.reset(read_data, sizeof(read_data));
1989   memset(read_buf, 0, sizeof(read_buf));
1990   error = boost::system::error_code();
1991   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
1992       boost::asio::transfer_at_least(42), error);
1993   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
1994   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
1995   BOOST_ASIO_CHECK(!error);
1996 
1997   s.reset(read_data, sizeof(read_data));
1998   s.next_read_length(1);
1999   memset(read_buf, 0, sizeof(read_buf));
2000   error = boost::system::error_code();
2001   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2002       boost::asio::transfer_at_least(42), error);
2003   BOOST_ASIO_CHECK(bytes_transferred == 42);
2004   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
2005   BOOST_ASIO_CHECK(!error);
2006 
2007   s.reset(read_data, sizeof(read_data));
2008   s.next_read_length(1);
2009   memset(read_buf, 0, sizeof(read_buf));
2010   error = boost::system::error_code();
2011   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2012       boost::asio::transfer_at_least(42), error);
2013   BOOST_ASIO_CHECK(bytes_transferred == 42);
2014   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
2015   BOOST_ASIO_CHECK(!error);
2016 
2017   s.reset(read_data, sizeof(read_data));
2018   s.next_read_length(10);
2019   memset(read_buf, 0, sizeof(read_buf));
2020   error = boost::system::error_code();
2021   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2022       boost::asio::transfer_at_least(42), error);
2023   BOOST_ASIO_CHECK(bytes_transferred == 50);
2024   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 50));
2025   BOOST_ASIO_CHECK(!error);
2026 
2027   s.reset(read_data, sizeof(read_data));
2028   s.next_read_length(10);
2029   memset(read_buf, 0, sizeof(read_buf));
2030   error = boost::system::error_code();
2031   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2032       boost::asio::transfer_at_least(42), error);
2033   BOOST_ASIO_CHECK(bytes_transferred == 50);
2034   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 50));
2035   BOOST_ASIO_CHECK(!error);
2036 
2037   s.reset(read_data, sizeof(read_data));
2038   memset(read_buf, 0, sizeof(read_buf));
2039   error = boost::system::error_code();
2040   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2041       boost::asio::transfer_exactly(1), error);
2042   BOOST_ASIO_CHECK(bytes_transferred == 1);
2043   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
2044   BOOST_ASIO_CHECK(!error);
2045 
2046   s.reset(read_data, sizeof(read_data));
2047   memset(read_buf, 0, sizeof(read_buf));
2048   error = boost::system::error_code();
2049   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2050       boost::asio::transfer_exactly(1), error);
2051   BOOST_ASIO_CHECK(bytes_transferred == 1);
2052   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
2053   BOOST_ASIO_CHECK(!error);
2054 
2055   s.reset(read_data, sizeof(read_data));
2056   s.next_read_length(1);
2057   memset(read_buf, 0, sizeof(read_buf));
2058   error = boost::system::error_code();
2059   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2060       boost::asio::transfer_exactly(1), error);
2061   BOOST_ASIO_CHECK(bytes_transferred == 1);
2062   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
2063   BOOST_ASIO_CHECK(!error);
2064 
2065   s.reset(read_data, sizeof(read_data));
2066   s.next_read_length(1);
2067   memset(read_buf, 0, sizeof(read_buf));
2068   error = boost::system::error_code();
2069   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2070       boost::asio::transfer_exactly(1), error);
2071   BOOST_ASIO_CHECK(bytes_transferred == 1);
2072   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
2073   BOOST_ASIO_CHECK(!error);
2074 
2075   s.reset(read_data, sizeof(read_data));
2076   s.next_read_length(10);
2077   memset(read_buf, 0, sizeof(read_buf));
2078   error = boost::system::error_code();
2079   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2080       boost::asio::transfer_exactly(1), error);
2081   BOOST_ASIO_CHECK(bytes_transferred == 1);
2082   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
2083   BOOST_ASIO_CHECK(!error);
2084 
2085   s.reset(read_data, sizeof(read_data));
2086   s.next_read_length(10);
2087   memset(read_buf, 0, sizeof(read_buf));
2088   error = boost::system::error_code();
2089   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2090       boost::asio::transfer_exactly(1), error);
2091   BOOST_ASIO_CHECK(bytes_transferred == 1);
2092   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
2093   BOOST_ASIO_CHECK(!error);
2094 
2095   s.reset(read_data, sizeof(read_data));
2096   memset(read_buf, 0, sizeof(read_buf));
2097   error = boost::system::error_code();
2098   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2099       boost::asio::transfer_exactly(10), error);
2100   BOOST_ASIO_CHECK(bytes_transferred == 10);
2101   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
2102   BOOST_ASIO_CHECK(!error);
2103 
2104   s.reset(read_data, sizeof(read_data));
2105   memset(read_buf, 0, sizeof(read_buf));
2106   error = boost::system::error_code();
2107   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2108       boost::asio::transfer_exactly(10), error);
2109   BOOST_ASIO_CHECK(bytes_transferred == 10);
2110   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
2111   BOOST_ASIO_CHECK(!error);
2112 
2113   s.reset(read_data, sizeof(read_data));
2114   s.next_read_length(1);
2115   memset(read_buf, 0, sizeof(read_buf));
2116   error = boost::system::error_code();
2117   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2118       boost::asio::transfer_exactly(10), error);
2119   BOOST_ASIO_CHECK(bytes_transferred == 10);
2120   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
2121   BOOST_ASIO_CHECK(!error);
2122 
2123   s.reset(read_data, sizeof(read_data));
2124   s.next_read_length(1);
2125   memset(read_buf, 0, sizeof(read_buf));
2126   error = boost::system::error_code();
2127   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2128       boost::asio::transfer_exactly(10), error);
2129   BOOST_ASIO_CHECK(bytes_transferred == 10);
2130   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
2131   BOOST_ASIO_CHECK(!error);
2132 
2133   s.reset(read_data, sizeof(read_data));
2134   s.next_read_length(10);
2135   memset(read_buf, 0, sizeof(read_buf));
2136   error = boost::system::error_code();
2137   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2138       boost::asio::transfer_exactly(10), error);
2139   BOOST_ASIO_CHECK(bytes_transferred == 10);
2140   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
2141   BOOST_ASIO_CHECK(!error);
2142 
2143   s.reset(read_data, sizeof(read_data));
2144   s.next_read_length(10);
2145   memset(read_buf, 0, sizeof(read_buf));
2146   error = boost::system::error_code();
2147   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2148       boost::asio::transfer_exactly(10), error);
2149   BOOST_ASIO_CHECK(bytes_transferred == 10);
2150   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
2151   BOOST_ASIO_CHECK(!error);
2152 
2153   s.reset(read_data, sizeof(read_data));
2154   memset(read_buf, 0, sizeof(read_buf));
2155   error = boost::system::error_code();
2156   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2157       boost::asio::transfer_exactly(42), error);
2158   BOOST_ASIO_CHECK(bytes_transferred == 42);
2159   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
2160   BOOST_ASIO_CHECK(!error);
2161 
2162   s.reset(read_data, sizeof(read_data));
2163   memset(read_buf, 0, sizeof(read_buf));
2164   error = boost::system::error_code();
2165   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2166       boost::asio::transfer_exactly(42), error);
2167   BOOST_ASIO_CHECK(bytes_transferred == 42);
2168   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
2169   BOOST_ASIO_CHECK(!error);
2170 
2171   s.reset(read_data, sizeof(read_data));
2172   s.next_read_length(1);
2173   memset(read_buf, 0, sizeof(read_buf));
2174   error = boost::system::error_code();
2175   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2176       boost::asio::transfer_exactly(42), error);
2177   BOOST_ASIO_CHECK(bytes_transferred == 42);
2178   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
2179   BOOST_ASIO_CHECK(!error);
2180 
2181   s.reset(read_data, sizeof(read_data));
2182   s.next_read_length(1);
2183   memset(read_buf, 0, sizeof(read_buf));
2184   error = boost::system::error_code();
2185   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2186       boost::asio::transfer_exactly(42), error);
2187   BOOST_ASIO_CHECK(bytes_transferred == 42);
2188   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
2189   BOOST_ASIO_CHECK(!error);
2190 
2191   s.reset(read_data, sizeof(read_data));
2192   s.next_read_length(10);
2193   memset(read_buf, 0, sizeof(read_buf));
2194   error = boost::system::error_code();
2195   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2196       boost::asio::transfer_exactly(42), error);
2197   BOOST_ASIO_CHECK(bytes_transferred == 42);
2198   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
2199   BOOST_ASIO_CHECK(!error);
2200 
2201   s.reset(read_data, sizeof(read_data));
2202   s.next_read_length(10);
2203   memset(read_buf, 0, sizeof(read_buf));
2204   error = boost::system::error_code();
2205   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2206       boost::asio::transfer_exactly(42), error);
2207   BOOST_ASIO_CHECK(bytes_transferred == 42);
2208   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
2209   BOOST_ASIO_CHECK(!error);
2210 
2211   s.reset(read_data, sizeof(read_data));
2212   memset(read_buf, 0, sizeof(read_buf));
2213   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2214       old_style_transfer_all, error);
2215   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2216   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
2217   BOOST_ASIO_CHECK(!error);
2218 
2219   s.reset(read_data, sizeof(read_data));
2220   memset(read_buf, 0, sizeof(read_buf));
2221   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2222       old_style_transfer_all, error);
2223   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2224   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
2225   BOOST_ASIO_CHECK(!error);
2226 
2227   s.reset(read_data, sizeof(read_data));
2228   s.next_read_length(1);
2229   memset(read_buf, 0, sizeof(read_buf));
2230   error = boost::system::error_code();
2231   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2232       old_style_transfer_all, error);
2233   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2234   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
2235   BOOST_ASIO_CHECK(!error);
2236 
2237   s.reset(read_data, sizeof(read_data));
2238   s.next_read_length(1);
2239   memset(read_buf, 0, sizeof(read_buf));
2240   error = boost::system::error_code();
2241   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2242       old_style_transfer_all, error);
2243   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2244   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
2245   BOOST_ASIO_CHECK(!error);
2246 
2247   s.reset(read_data, sizeof(read_data));
2248   s.next_read_length(10);
2249   memset(read_buf, 0, sizeof(read_buf));
2250   error = boost::system::error_code();
2251   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2252       old_style_transfer_all, error);
2253   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2254   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
2255   BOOST_ASIO_CHECK(!error);
2256 
2257   s.reset(read_data, sizeof(read_data));
2258   s.next_read_length(10);
2259   memset(read_buf, 0, sizeof(read_buf));
2260   error = boost::system::error_code();
2261   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2262       old_style_transfer_all, error);
2263   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2264   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
2265   BOOST_ASIO_CHECK(!error);
2266 
2267   s.reset(read_data, sizeof(read_data));
2268   memset(read_buf, 0, sizeof(read_buf));
2269   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2270       short_transfer(), error);
2271   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2272   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
2273   BOOST_ASIO_CHECK(!error);
2274 
2275   s.reset(read_data, sizeof(read_data));
2276   memset(read_buf, 0, sizeof(read_buf));
2277   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2278       short_transfer(), error);
2279   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2280   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
2281   BOOST_ASIO_CHECK(!error);
2282 
2283   s.reset(read_data, sizeof(read_data));
2284   s.next_read_length(1);
2285   memset(read_buf, 0, sizeof(read_buf));
2286   error = boost::system::error_code();
2287   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2288       short_transfer(), error);
2289   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2290   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
2291   BOOST_ASIO_CHECK(!error);
2292 
2293   s.reset(read_data, sizeof(read_data));
2294   s.next_read_length(1);
2295   memset(read_buf, 0, sizeof(read_buf));
2296   error = boost::system::error_code();
2297   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2298       short_transfer(), error);
2299   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2300   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
2301   BOOST_ASIO_CHECK(!error);
2302 
2303   s.reset(read_data, sizeof(read_data));
2304   s.next_read_length(10);
2305   memset(read_buf, 0, sizeof(read_buf));
2306   error = boost::system::error_code();
2307   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2308       short_transfer(), error);
2309   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2310   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
2311   BOOST_ASIO_CHECK(!error);
2312 
2313   s.reset(read_data, sizeof(read_data));
2314   s.next_read_length(10);
2315   memset(read_buf, 0, sizeof(read_buf));
2316   error = boost::system::error_code();
2317   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2318       short_transfer(), error);
2319   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2320   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
2321   BOOST_ASIO_CHECK(!error);
2322 }
2323 
test_5_arg_vector_buffers_read_at()2324 void test_5_arg_vector_buffers_read_at()
2325 {
2326   boost::asio::io_context ioc;
2327   test_random_access_device s(ioc);
2328   char read_buf[sizeof(read_data)];
2329   std::vector<boost::asio::mutable_buffer> buffers;
2330   buffers.push_back(boost::asio::buffer(read_buf, 32));
2331   buffers.push_back(boost::asio::buffer(read_buf) + 32);
2332 
2333   s.reset(read_data, sizeof(read_data));
2334   memset(read_buf, 0, sizeof(read_buf));
2335   boost::system::error_code error;
2336   size_t bytes_transferred = boost::asio::read_at(s, 0, buffers,
2337       boost::asio::transfer_all(), error);
2338   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2339   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
2340   BOOST_ASIO_CHECK(!error);
2341 
2342   s.reset(read_data, sizeof(read_data));
2343   memset(read_buf, 0, sizeof(read_buf));
2344   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2345       boost::asio::transfer_all(), error);
2346   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2347   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
2348   BOOST_ASIO_CHECK(!error);
2349 
2350   s.reset(read_data, sizeof(read_data));
2351   s.next_read_length(1);
2352   memset(read_buf, 0, sizeof(read_buf));
2353   error = boost::system::error_code();
2354   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2355       boost::asio::transfer_all(), error);
2356   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2357   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
2358   BOOST_ASIO_CHECK(!error);
2359 
2360   s.reset(read_data, sizeof(read_data));
2361   s.next_read_length(1);
2362   memset(read_buf, 0, sizeof(read_buf));
2363   error = boost::system::error_code();
2364   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2365       boost::asio::transfer_all(), error);
2366   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2367   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
2368   BOOST_ASIO_CHECK(!error);
2369 
2370   s.reset(read_data, sizeof(read_data));
2371   s.next_read_length(10);
2372   memset(read_buf, 0, sizeof(read_buf));
2373   error = boost::system::error_code();
2374   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2375       boost::asio::transfer_all(), error);
2376   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2377   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
2378   BOOST_ASIO_CHECK(!error);
2379 
2380   s.reset(read_data, sizeof(read_data));
2381   s.next_read_length(10);
2382   memset(read_buf, 0, sizeof(read_buf));
2383   error = boost::system::error_code();
2384   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2385       boost::asio::transfer_all(), error);
2386   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2387   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
2388   BOOST_ASIO_CHECK(!error);
2389 
2390   s.reset(read_data, sizeof(read_data));
2391   memset(read_buf, 0, sizeof(read_buf));
2392   error = boost::system::error_code();
2393   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2394       boost::asio::transfer_at_least(1), error);
2395   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2396   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
2397   BOOST_ASIO_CHECK(!error);
2398 
2399   s.reset(read_data, sizeof(read_data));
2400   memset(read_buf, 0, sizeof(read_buf));
2401   error = boost::system::error_code();
2402   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2403       boost::asio::transfer_at_least(1), error);
2404   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2405   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
2406   BOOST_ASIO_CHECK(!error);
2407 
2408   s.reset(read_data, sizeof(read_data));
2409   s.next_read_length(1);
2410   memset(read_buf, 0, sizeof(read_buf));
2411   error = boost::system::error_code();
2412   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2413       boost::asio::transfer_at_least(1), error);
2414   BOOST_ASIO_CHECK(bytes_transferred == 1);
2415   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
2416   BOOST_ASIO_CHECK(!error);
2417 
2418   s.reset(read_data, sizeof(read_data));
2419   s.next_read_length(1);
2420   memset(read_buf, 0, sizeof(read_buf));
2421   error = boost::system::error_code();
2422   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2423       boost::asio::transfer_at_least(1), error);
2424   BOOST_ASIO_CHECK(bytes_transferred == 1);
2425   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
2426   BOOST_ASIO_CHECK(!error);
2427 
2428   s.reset(read_data, sizeof(read_data));
2429   s.next_read_length(10);
2430   memset(read_buf, 0, sizeof(read_buf));
2431   error = boost::system::error_code();
2432   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2433       boost::asio::transfer_at_least(1), error);
2434   BOOST_ASIO_CHECK(bytes_transferred == 10);
2435   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
2436   BOOST_ASIO_CHECK(!error);
2437 
2438   s.reset(read_data, sizeof(read_data));
2439   s.next_read_length(10);
2440   memset(read_buf, 0, sizeof(read_buf));
2441   error = boost::system::error_code();
2442   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2443       boost::asio::transfer_at_least(1), error);
2444   BOOST_ASIO_CHECK(bytes_transferred == 10);
2445   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
2446   BOOST_ASIO_CHECK(!error);
2447 
2448   s.reset(read_data, sizeof(read_data));
2449   memset(read_buf, 0, sizeof(read_buf));
2450   error = boost::system::error_code();
2451   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2452       boost::asio::transfer_at_least(10), error);
2453   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2454   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
2455   BOOST_ASIO_CHECK(!error);
2456 
2457   s.reset(read_data, sizeof(read_data));
2458   memset(read_buf, 0, sizeof(read_buf));
2459   error = boost::system::error_code();
2460   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2461       boost::asio::transfer_at_least(10), error);
2462   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2463   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
2464   BOOST_ASIO_CHECK(!error);
2465 
2466   s.reset(read_data, sizeof(read_data));
2467   s.next_read_length(1);
2468   memset(read_buf, 0, sizeof(read_buf));
2469   error = boost::system::error_code();
2470   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2471       boost::asio::transfer_at_least(10), error);
2472   BOOST_ASIO_CHECK(bytes_transferred == 10);
2473   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
2474   BOOST_ASIO_CHECK(!error);
2475 
2476   s.reset(read_data, sizeof(read_data));
2477   s.next_read_length(1);
2478   memset(read_buf, 0, sizeof(read_buf));
2479   error = boost::system::error_code();
2480   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2481       boost::asio::transfer_at_least(10), error);
2482   BOOST_ASIO_CHECK(bytes_transferred == 10);
2483   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
2484   BOOST_ASIO_CHECK(!error);
2485 
2486   s.reset(read_data, sizeof(read_data));
2487   s.next_read_length(10);
2488   memset(read_buf, 0, sizeof(read_buf));
2489   error = boost::system::error_code();
2490   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2491       boost::asio::transfer_at_least(10), error);
2492   BOOST_ASIO_CHECK(bytes_transferred == 10);
2493   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
2494   BOOST_ASIO_CHECK(!error);
2495 
2496   s.reset(read_data, sizeof(read_data));
2497   s.next_read_length(10);
2498   memset(read_buf, 0, sizeof(read_buf));
2499   error = boost::system::error_code();
2500   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2501       boost::asio::transfer_at_least(10), error);
2502   BOOST_ASIO_CHECK(bytes_transferred == 10);
2503   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
2504   BOOST_ASIO_CHECK(!error);
2505 
2506   s.reset(read_data, sizeof(read_data));
2507   memset(read_buf, 0, sizeof(read_buf));
2508   error = boost::system::error_code();
2509   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2510       boost::asio::transfer_at_least(42), error);
2511   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2512   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
2513   BOOST_ASIO_CHECK(!error);
2514 
2515   s.reset(read_data, sizeof(read_data));
2516   memset(read_buf, 0, sizeof(read_buf));
2517   error = boost::system::error_code();
2518   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2519       boost::asio::transfer_at_least(42), error);
2520   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2521   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
2522   BOOST_ASIO_CHECK(!error);
2523 
2524   s.reset(read_data, sizeof(read_data));
2525   s.next_read_length(1);
2526   memset(read_buf, 0, sizeof(read_buf));
2527   error = boost::system::error_code();
2528   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2529       boost::asio::transfer_at_least(42), error);
2530   BOOST_ASIO_CHECK(bytes_transferred == 42);
2531   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
2532   BOOST_ASIO_CHECK(!error);
2533 
2534   s.reset(read_data, sizeof(read_data));
2535   s.next_read_length(1);
2536   memset(read_buf, 0, sizeof(read_buf));
2537   error = boost::system::error_code();
2538   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2539       boost::asio::transfer_at_least(42), error);
2540   BOOST_ASIO_CHECK(bytes_transferred == 42);
2541   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
2542   BOOST_ASIO_CHECK(!error);
2543 
2544   s.reset(read_data, sizeof(read_data));
2545   s.next_read_length(10);
2546   memset(read_buf, 0, sizeof(read_buf));
2547   error = boost::system::error_code();
2548   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2549       boost::asio::transfer_at_least(42), error);
2550   BOOST_ASIO_CHECK(bytes_transferred == 50);
2551   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 50));
2552   BOOST_ASIO_CHECK(!error);
2553 
2554   s.reset(read_data, sizeof(read_data));
2555   s.next_read_length(10);
2556   memset(read_buf, 0, sizeof(read_buf));
2557   error = boost::system::error_code();
2558   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2559       boost::asio::transfer_at_least(42), error);
2560   BOOST_ASIO_CHECK(bytes_transferred == 50);
2561   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 50));
2562   BOOST_ASIO_CHECK(!error);
2563 
2564   s.reset(read_data, sizeof(read_data));
2565   memset(read_buf, 0, sizeof(read_buf));
2566   error = boost::system::error_code();
2567   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2568       boost::asio::transfer_exactly(1), error);
2569   BOOST_ASIO_CHECK(bytes_transferred == 1);
2570   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
2571   BOOST_ASIO_CHECK(!error);
2572 
2573   s.reset(read_data, sizeof(read_data));
2574   memset(read_buf, 0, sizeof(read_buf));
2575   error = boost::system::error_code();
2576   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2577       boost::asio::transfer_exactly(1), error);
2578   BOOST_ASIO_CHECK(bytes_transferred == 1);
2579   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
2580   BOOST_ASIO_CHECK(!error);
2581 
2582   s.reset(read_data, sizeof(read_data));
2583   s.next_read_length(1);
2584   memset(read_buf, 0, sizeof(read_buf));
2585   error = boost::system::error_code();
2586   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2587       boost::asio::transfer_exactly(1), error);
2588   BOOST_ASIO_CHECK(bytes_transferred == 1);
2589   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
2590   BOOST_ASIO_CHECK(!error);
2591 
2592   s.reset(read_data, sizeof(read_data));
2593   s.next_read_length(1);
2594   memset(read_buf, 0, sizeof(read_buf));
2595   error = boost::system::error_code();
2596   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2597       boost::asio::transfer_exactly(1), error);
2598   BOOST_ASIO_CHECK(bytes_transferred == 1);
2599   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
2600   BOOST_ASIO_CHECK(!error);
2601 
2602   s.reset(read_data, sizeof(read_data));
2603   s.next_read_length(10);
2604   memset(read_buf, 0, sizeof(read_buf));
2605   error = boost::system::error_code();
2606   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2607       boost::asio::transfer_exactly(1), error);
2608   BOOST_ASIO_CHECK(bytes_transferred == 1);
2609   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
2610   BOOST_ASIO_CHECK(!error);
2611 
2612   s.reset(read_data, sizeof(read_data));
2613   s.next_read_length(10);
2614   memset(read_buf, 0, sizeof(read_buf));
2615   error = boost::system::error_code();
2616   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2617       boost::asio::transfer_exactly(1), error);
2618   BOOST_ASIO_CHECK(bytes_transferred == 1);
2619   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
2620   BOOST_ASIO_CHECK(!error);
2621 
2622   s.reset(read_data, sizeof(read_data));
2623   memset(read_buf, 0, sizeof(read_buf));
2624   error = boost::system::error_code();
2625   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2626       boost::asio::transfer_exactly(10), error);
2627   BOOST_ASIO_CHECK(bytes_transferred == 10);
2628   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
2629   BOOST_ASIO_CHECK(!error);
2630 
2631   s.reset(read_data, sizeof(read_data));
2632   memset(read_buf, 0, sizeof(read_buf));
2633   error = boost::system::error_code();
2634   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2635       boost::asio::transfer_exactly(10), error);
2636   BOOST_ASIO_CHECK(bytes_transferred == 10);
2637   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
2638   BOOST_ASIO_CHECK(!error);
2639 
2640   s.reset(read_data, sizeof(read_data));
2641   s.next_read_length(1);
2642   memset(read_buf, 0, sizeof(read_buf));
2643   error = boost::system::error_code();
2644   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2645       boost::asio::transfer_exactly(10), error);
2646   BOOST_ASIO_CHECK(bytes_transferred == 10);
2647   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
2648   BOOST_ASIO_CHECK(!error);
2649 
2650   s.reset(read_data, sizeof(read_data));
2651   s.next_read_length(1);
2652   memset(read_buf, 0, sizeof(read_buf));
2653   error = boost::system::error_code();
2654   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2655       boost::asio::transfer_exactly(10), error);
2656   BOOST_ASIO_CHECK(bytes_transferred == 10);
2657   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
2658   BOOST_ASIO_CHECK(!error);
2659 
2660   s.reset(read_data, sizeof(read_data));
2661   s.next_read_length(10);
2662   memset(read_buf, 0, sizeof(read_buf));
2663   error = boost::system::error_code();
2664   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2665       boost::asio::transfer_exactly(10), error);
2666   BOOST_ASIO_CHECK(bytes_transferred == 10);
2667   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
2668   BOOST_ASIO_CHECK(!error);
2669 
2670   s.reset(read_data, sizeof(read_data));
2671   s.next_read_length(10);
2672   memset(read_buf, 0, sizeof(read_buf));
2673   error = boost::system::error_code();
2674   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2675       boost::asio::transfer_exactly(10), error);
2676   BOOST_ASIO_CHECK(bytes_transferred == 10);
2677   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
2678   BOOST_ASIO_CHECK(!error);
2679 
2680   s.reset(read_data, sizeof(read_data));
2681   memset(read_buf, 0, sizeof(read_buf));
2682   error = boost::system::error_code();
2683   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2684       boost::asio::transfer_exactly(42), error);
2685   BOOST_ASIO_CHECK(bytes_transferred == 42);
2686   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
2687   BOOST_ASIO_CHECK(!error);
2688 
2689   s.reset(read_data, sizeof(read_data));
2690   memset(read_buf, 0, sizeof(read_buf));
2691   error = boost::system::error_code();
2692   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2693       boost::asio::transfer_exactly(42), error);
2694   BOOST_ASIO_CHECK(bytes_transferred == 42);
2695   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
2696   BOOST_ASIO_CHECK(!error);
2697 
2698   s.reset(read_data, sizeof(read_data));
2699   s.next_read_length(1);
2700   memset(read_buf, 0, sizeof(read_buf));
2701   error = boost::system::error_code();
2702   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2703       boost::asio::transfer_exactly(42), error);
2704   BOOST_ASIO_CHECK(bytes_transferred == 42);
2705   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
2706   BOOST_ASIO_CHECK(!error);
2707 
2708   s.reset(read_data, sizeof(read_data));
2709   s.next_read_length(1);
2710   memset(read_buf, 0, sizeof(read_buf));
2711   error = boost::system::error_code();
2712   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2713       boost::asio::transfer_exactly(42), error);
2714   BOOST_ASIO_CHECK(bytes_transferred == 42);
2715   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
2716   BOOST_ASIO_CHECK(!error);
2717 
2718   s.reset(read_data, sizeof(read_data));
2719   s.next_read_length(10);
2720   memset(read_buf, 0, sizeof(read_buf));
2721   error = boost::system::error_code();
2722   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2723       boost::asio::transfer_exactly(42), error);
2724   BOOST_ASIO_CHECK(bytes_transferred == 42);
2725   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
2726   BOOST_ASIO_CHECK(!error);
2727 
2728   s.reset(read_data, sizeof(read_data));
2729   s.next_read_length(10);
2730   memset(read_buf, 0, sizeof(read_buf));
2731   error = boost::system::error_code();
2732   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2733       boost::asio::transfer_exactly(42), error);
2734   BOOST_ASIO_CHECK(bytes_transferred == 42);
2735   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
2736   BOOST_ASIO_CHECK(!error);
2737 
2738   s.reset(read_data, sizeof(read_data));
2739   memset(read_buf, 0, sizeof(read_buf));
2740   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2741       old_style_transfer_all, error);
2742   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2743   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
2744   BOOST_ASIO_CHECK(!error);
2745 
2746   s.reset(read_data, sizeof(read_data));
2747   memset(read_buf, 0, sizeof(read_buf));
2748   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2749       old_style_transfer_all, error);
2750   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2751   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
2752   BOOST_ASIO_CHECK(!error);
2753 
2754   s.reset(read_data, sizeof(read_data));
2755   s.next_read_length(1);
2756   memset(read_buf, 0, sizeof(read_buf));
2757   error = boost::system::error_code();
2758   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2759       old_style_transfer_all, error);
2760   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2761   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
2762   BOOST_ASIO_CHECK(!error);
2763 
2764   s.reset(read_data, sizeof(read_data));
2765   s.next_read_length(1);
2766   memset(read_buf, 0, sizeof(read_buf));
2767   error = boost::system::error_code();
2768   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2769       old_style_transfer_all, error);
2770   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2771   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
2772   BOOST_ASIO_CHECK(!error);
2773 
2774   s.reset(read_data, sizeof(read_data));
2775   s.next_read_length(10);
2776   memset(read_buf, 0, sizeof(read_buf));
2777   error = boost::system::error_code();
2778   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2779       old_style_transfer_all, error);
2780   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2781   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
2782   BOOST_ASIO_CHECK(!error);
2783 
2784   s.reset(read_data, sizeof(read_data));
2785   s.next_read_length(10);
2786   memset(read_buf, 0, sizeof(read_buf));
2787   error = boost::system::error_code();
2788   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2789       old_style_transfer_all, error);
2790   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2791   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
2792   BOOST_ASIO_CHECK(!error);
2793 
2794   s.reset(read_data, sizeof(read_data));
2795   memset(read_buf, 0, sizeof(read_buf));
2796   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2797       short_transfer(), error);
2798   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2799   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
2800   BOOST_ASIO_CHECK(!error);
2801 
2802   s.reset(read_data, sizeof(read_data));
2803   memset(read_buf, 0, sizeof(read_buf));
2804   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2805       short_transfer(), error);
2806   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2807   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
2808   BOOST_ASIO_CHECK(!error);
2809 
2810   s.reset(read_data, sizeof(read_data));
2811   s.next_read_length(1);
2812   memset(read_buf, 0, sizeof(read_buf));
2813   error = boost::system::error_code();
2814   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2815       short_transfer(), error);
2816   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2817   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
2818   BOOST_ASIO_CHECK(!error);
2819 
2820   s.reset(read_data, sizeof(read_data));
2821   s.next_read_length(1);
2822   memset(read_buf, 0, sizeof(read_buf));
2823   error = boost::system::error_code();
2824   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2825       short_transfer(), error);
2826   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2827   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
2828   BOOST_ASIO_CHECK(!error);
2829 
2830   s.reset(read_data, sizeof(read_data));
2831   s.next_read_length(10);
2832   memset(read_buf, 0, sizeof(read_buf));
2833   error = boost::system::error_code();
2834   bytes_transferred = boost::asio::read_at(s, 0, buffers,
2835       short_transfer(), error);
2836   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2837   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
2838   BOOST_ASIO_CHECK(!error);
2839 
2840   s.reset(read_data, sizeof(read_data));
2841   s.next_read_length(10);
2842   memset(read_buf, 0, sizeof(read_buf));
2843   error = boost::system::error_code();
2844   bytes_transferred = boost::asio::read_at(s, 1234, buffers,
2845       short_transfer(), error);
2846   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2847   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
2848   BOOST_ASIO_CHECK(!error);
2849 }
2850 
test_5_arg_streambuf_read_at()2851 void test_5_arg_streambuf_read_at()
2852 {
2853   boost::asio::io_context ioc;
2854   test_random_access_device s(ioc);
2855   boost::asio::streambuf sb(sizeof(read_data));
2856 
2857   s.reset(read_data, sizeof(read_data));
2858   sb.consume(sb.size());
2859   boost::system::error_code error;
2860   size_t bytes_transferred = boost::asio::read_at(s, 0, sb,
2861       boost::asio::transfer_all(), error);
2862   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2863   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
2864   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
2865   BOOST_ASIO_CHECK(!error);
2866 
2867   s.reset(read_data, sizeof(read_data));
2868   sb.consume(sb.size());
2869   bytes_transferred = boost::asio::read_at(s, 1234, sb,
2870       boost::asio::transfer_all(), error);
2871   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2872   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
2873   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
2874   BOOST_ASIO_CHECK(!error);
2875 
2876   s.reset(read_data, sizeof(read_data));
2877   s.next_read_length(1);
2878   sb.consume(sb.size());
2879   error = boost::system::error_code();
2880   bytes_transferred = boost::asio::read_at(s, 0, sb,
2881       boost::asio::transfer_all(), error);
2882   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2883   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
2884   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
2885   BOOST_ASIO_CHECK(!error);
2886 
2887   s.reset(read_data, sizeof(read_data));
2888   s.next_read_length(1);
2889   sb.consume(sb.size());
2890   error = boost::system::error_code();
2891   bytes_transferred = boost::asio::read_at(s, 1234, sb,
2892       boost::asio::transfer_all(), error);
2893   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2894   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
2895   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
2896   BOOST_ASIO_CHECK(!error);
2897 
2898   s.reset(read_data, sizeof(read_data));
2899   s.next_read_length(10);
2900   sb.consume(sb.size());
2901   error = boost::system::error_code();
2902   bytes_transferred = boost::asio::read_at(s, 0, sb,
2903       boost::asio::transfer_all(), error);
2904   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2905   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
2906   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
2907   BOOST_ASIO_CHECK(!error);
2908 
2909   s.reset(read_data, sizeof(read_data));
2910   s.next_read_length(10);
2911   sb.consume(sb.size());
2912   error = boost::system::error_code();
2913   bytes_transferred = boost::asio::read_at(s, 1234, sb,
2914       boost::asio::transfer_all(), error);
2915   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2916   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
2917   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
2918   BOOST_ASIO_CHECK(!error);
2919 
2920   s.reset(read_data, sizeof(read_data));
2921   sb.consume(sb.size());
2922   error = boost::system::error_code();
2923   bytes_transferred = boost::asio::read_at(s, 0, sb,
2924       boost::asio::transfer_at_least(1), error);
2925   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2926   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
2927   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
2928   BOOST_ASIO_CHECK(!error);
2929 
2930   s.reset(read_data, sizeof(read_data));
2931   sb.consume(sb.size());
2932   error = boost::system::error_code();
2933   bytes_transferred = boost::asio::read_at(s, 1234, sb,
2934       boost::asio::transfer_at_least(1), error);
2935   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2936   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
2937   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
2938   BOOST_ASIO_CHECK(!error);
2939 
2940   s.reset(read_data, sizeof(read_data));
2941   s.next_read_length(1);
2942   sb.consume(sb.size());
2943   error = boost::system::error_code();
2944   bytes_transferred = boost::asio::read_at(s, 0, sb,
2945       boost::asio::transfer_at_least(1), error);
2946   BOOST_ASIO_CHECK(bytes_transferred == 1);
2947   BOOST_ASIO_CHECK(sb.size() == 1);
2948   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 1));
2949   BOOST_ASIO_CHECK(!error);
2950 
2951   s.reset(read_data, sizeof(read_data));
2952   s.next_read_length(1);
2953   sb.consume(sb.size());
2954   error = boost::system::error_code();
2955   bytes_transferred = boost::asio::read_at(s, 1234, sb,
2956       boost::asio::transfer_at_least(1), error);
2957   BOOST_ASIO_CHECK(bytes_transferred == 1);
2958   BOOST_ASIO_CHECK(sb.size() == 1);
2959   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 1));
2960   BOOST_ASIO_CHECK(!error);
2961 
2962   s.reset(read_data, sizeof(read_data));
2963   s.next_read_length(10);
2964   sb.consume(sb.size());
2965   error = boost::system::error_code();
2966   bytes_transferred = boost::asio::read_at(s, 0, sb,
2967       boost::asio::transfer_at_least(1), error);
2968   BOOST_ASIO_CHECK(bytes_transferred == 10);
2969   BOOST_ASIO_CHECK(sb.size() == 10);
2970   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 10));
2971   BOOST_ASIO_CHECK(!error);
2972 
2973   s.reset(read_data, sizeof(read_data));
2974   s.next_read_length(10);
2975   sb.consume(sb.size());
2976   error = boost::system::error_code();
2977   bytes_transferred = boost::asio::read_at(s, 1234, sb,
2978       boost::asio::transfer_at_least(1), error);
2979   BOOST_ASIO_CHECK(bytes_transferred == 10);
2980   BOOST_ASIO_CHECK(sb.size() == 10);
2981   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 10));
2982   BOOST_ASIO_CHECK(!error);
2983 
2984   s.reset(read_data, sizeof(read_data));
2985   sb.consume(sb.size());
2986   error = boost::system::error_code();
2987   bytes_transferred = boost::asio::read_at(s, 0, sb,
2988       boost::asio::transfer_at_least(10), error);
2989   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
2990   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
2991   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
2992   BOOST_ASIO_CHECK(!error);
2993 
2994   s.reset(read_data, sizeof(read_data));
2995   sb.consume(sb.size());
2996   error = boost::system::error_code();
2997   bytes_transferred = boost::asio::read_at(s, 1234, sb,
2998       boost::asio::transfer_at_least(10), error);
2999   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
3000   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3001   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
3002   BOOST_ASIO_CHECK(!error);
3003 
3004   s.reset(read_data, sizeof(read_data));
3005   s.next_read_length(1);
3006   sb.consume(sb.size());
3007   error = boost::system::error_code();
3008   bytes_transferred = boost::asio::read_at(s, 0, sb,
3009       boost::asio::transfer_at_least(10), error);
3010   BOOST_ASIO_CHECK(bytes_transferred == 10);
3011   BOOST_ASIO_CHECK(sb.size() == 10);
3012   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 10));
3013   BOOST_ASIO_CHECK(!error);
3014 
3015   s.reset(read_data, sizeof(read_data));
3016   s.next_read_length(1);
3017   sb.consume(sb.size());
3018   error = boost::system::error_code();
3019   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3020       boost::asio::transfer_at_least(10), error);
3021   BOOST_ASIO_CHECK(bytes_transferred == 10);
3022   BOOST_ASIO_CHECK(sb.size() == 10);
3023   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 10));
3024   BOOST_ASIO_CHECK(!error);
3025 
3026   s.reset(read_data, sizeof(read_data));
3027   s.next_read_length(10);
3028   sb.consume(sb.size());
3029   error = boost::system::error_code();
3030   bytes_transferred = boost::asio::read_at(s, 0, sb,
3031       boost::asio::transfer_at_least(10), error);
3032   BOOST_ASIO_CHECK(bytes_transferred == 10);
3033   BOOST_ASIO_CHECK(sb.size() == 10);
3034   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 10));
3035   BOOST_ASIO_CHECK(!error);
3036 
3037   s.reset(read_data, sizeof(read_data));
3038   s.next_read_length(10);
3039   sb.consume(sb.size());
3040   error = boost::system::error_code();
3041   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3042       boost::asio::transfer_at_least(10), error);
3043   BOOST_ASIO_CHECK(bytes_transferred == 10);
3044   BOOST_ASIO_CHECK(sb.size() == 10);
3045   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 10));
3046   BOOST_ASIO_CHECK(!error);
3047 
3048   s.reset(read_data, sizeof(read_data));
3049   sb.consume(sb.size());
3050   error = boost::system::error_code();
3051   bytes_transferred = boost::asio::read_at(s, 0, sb,
3052       boost::asio::transfer_at_least(42), error);
3053   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
3054   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3055   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
3056   BOOST_ASIO_CHECK(!error);
3057 
3058   s.reset(read_data, sizeof(read_data));
3059   sb.consume(sb.size());
3060   error = boost::system::error_code();
3061   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3062       boost::asio::transfer_at_least(42), error);
3063   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
3064   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3065   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
3066   BOOST_ASIO_CHECK(!error);
3067 
3068   s.reset(read_data, sizeof(read_data));
3069   s.next_read_length(1);
3070   sb.consume(sb.size());
3071   error = boost::system::error_code();
3072   bytes_transferred = boost::asio::read_at(s, 0, sb,
3073       boost::asio::transfer_at_least(42), error);
3074   BOOST_ASIO_CHECK(bytes_transferred == 42);
3075   BOOST_ASIO_CHECK(sb.size() == 42);
3076   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 42));
3077   BOOST_ASIO_CHECK(!error);
3078 
3079   s.reset(read_data, sizeof(read_data));
3080   s.next_read_length(1);
3081   sb.consume(sb.size());
3082   error = boost::system::error_code();
3083   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3084       boost::asio::transfer_at_least(42), error);
3085   BOOST_ASIO_CHECK(bytes_transferred == 42);
3086   BOOST_ASIO_CHECK(sb.size() == 42);
3087   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 42));
3088   BOOST_ASIO_CHECK(!error);
3089 
3090   s.reset(read_data, sizeof(read_data));
3091   s.next_read_length(10);
3092   sb.consume(sb.size());
3093   error = boost::system::error_code();
3094   bytes_transferred = boost::asio::read_at(s, 0, sb,
3095       boost::asio::transfer_at_least(42), error);
3096   BOOST_ASIO_CHECK(bytes_transferred == 50);
3097   BOOST_ASIO_CHECK(sb.size() == 50);
3098   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 50));
3099   BOOST_ASIO_CHECK(!error);
3100 
3101   s.reset(read_data, sizeof(read_data));
3102   s.next_read_length(10);
3103   sb.consume(sb.size());
3104   error = boost::system::error_code();
3105   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3106       boost::asio::transfer_at_least(42), error);
3107   BOOST_ASIO_CHECK(bytes_transferred == 50);
3108   BOOST_ASIO_CHECK(sb.size() == 50);
3109   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 50));
3110   BOOST_ASIO_CHECK(!error);
3111 
3112   s.reset(read_data, sizeof(read_data));
3113   sb.consume(sb.size());
3114   error = boost::system::error_code();
3115   bytes_transferred = boost::asio::read_at(s, 0, sb,
3116       boost::asio::transfer_exactly(1), error);
3117   BOOST_ASIO_CHECK(bytes_transferred == 1);
3118   BOOST_ASIO_CHECK(sb.size() == 1);
3119   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 1));
3120   BOOST_ASIO_CHECK(!error);
3121 
3122   s.reset(read_data, sizeof(read_data));
3123   sb.consume(sb.size());
3124   error = boost::system::error_code();
3125   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3126       boost::asio::transfer_exactly(1), error);
3127   BOOST_ASIO_CHECK(bytes_transferred == 1);
3128   BOOST_ASIO_CHECK(sb.size() == 1);
3129   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 1));
3130   BOOST_ASIO_CHECK(!error);
3131 
3132   s.reset(read_data, sizeof(read_data));
3133   s.next_read_length(1);
3134   sb.consume(sb.size());
3135   error = boost::system::error_code();
3136   bytes_transferred = boost::asio::read_at(s, 0, sb,
3137       boost::asio::transfer_exactly(1), error);
3138   BOOST_ASIO_CHECK(bytes_transferred == 1);
3139   BOOST_ASIO_CHECK(sb.size() == 1);
3140   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 1));
3141   BOOST_ASIO_CHECK(!error);
3142 
3143   s.reset(read_data, sizeof(read_data));
3144   s.next_read_length(1);
3145   sb.consume(sb.size());
3146   error = boost::system::error_code();
3147   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3148       boost::asio::transfer_exactly(1), error);
3149   BOOST_ASIO_CHECK(bytes_transferred == 1);
3150   BOOST_ASIO_CHECK(sb.size() == 1);
3151   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 1));
3152   BOOST_ASIO_CHECK(!error);
3153 
3154   s.reset(read_data, sizeof(read_data));
3155   s.next_read_length(10);
3156   sb.consume(sb.size());
3157   error = boost::system::error_code();
3158   bytes_transferred = boost::asio::read_at(s, 0, sb,
3159       boost::asio::transfer_exactly(1), error);
3160   BOOST_ASIO_CHECK(bytes_transferred == 1);
3161   BOOST_ASIO_CHECK(sb.size() == 1);
3162   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 1));
3163   BOOST_ASIO_CHECK(!error);
3164 
3165   s.reset(read_data, sizeof(read_data));
3166   s.next_read_length(10);
3167   sb.consume(sb.size());
3168   error = boost::system::error_code();
3169   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3170       boost::asio::transfer_exactly(1), error);
3171   BOOST_ASIO_CHECK(bytes_transferred == 1);
3172   BOOST_ASIO_CHECK(sb.size() == 1);
3173   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 1));
3174   BOOST_ASIO_CHECK(!error);
3175 
3176   s.reset(read_data, sizeof(read_data));
3177   sb.consume(sb.size());
3178   error = boost::system::error_code();
3179   bytes_transferred = boost::asio::read_at(s, 0, sb,
3180       boost::asio::transfer_exactly(10), error);
3181   BOOST_ASIO_CHECK(bytes_transferred == 10);
3182   BOOST_ASIO_CHECK(sb.size() == 10);
3183   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 10));
3184   BOOST_ASIO_CHECK(!error);
3185 
3186   s.reset(read_data, sizeof(read_data));
3187   sb.consume(sb.size());
3188   error = boost::system::error_code();
3189   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3190       boost::asio::transfer_exactly(10), error);
3191   BOOST_ASIO_CHECK(bytes_transferred == 10);
3192   BOOST_ASIO_CHECK(sb.size() == 10);
3193   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 10));
3194   BOOST_ASIO_CHECK(!error);
3195 
3196   s.reset(read_data, sizeof(read_data));
3197   s.next_read_length(1);
3198   sb.consume(sb.size());
3199   error = boost::system::error_code();
3200   bytes_transferred = boost::asio::read_at(s, 0, sb,
3201       boost::asio::transfer_exactly(10), error);
3202   BOOST_ASIO_CHECK(bytes_transferred == 10);
3203   BOOST_ASIO_CHECK(sb.size() == 10);
3204   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 10));
3205   BOOST_ASIO_CHECK(!error);
3206 
3207   s.reset(read_data, sizeof(read_data));
3208   s.next_read_length(1);
3209   sb.consume(sb.size());
3210   error = boost::system::error_code();
3211   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3212       boost::asio::transfer_exactly(10), error);
3213   BOOST_ASIO_CHECK(bytes_transferred == 10);
3214   BOOST_ASIO_CHECK(sb.size() == 10);
3215   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 10));
3216   BOOST_ASIO_CHECK(!error);
3217 
3218   s.reset(read_data, sizeof(read_data));
3219   s.next_read_length(10);
3220   sb.consume(sb.size());
3221   error = boost::system::error_code();
3222   bytes_transferred = boost::asio::read_at(s, 0, sb,
3223       boost::asio::transfer_exactly(10), error);
3224   BOOST_ASIO_CHECK(bytes_transferred == 10);
3225   BOOST_ASIO_CHECK(sb.size() == 10);
3226   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 10));
3227   BOOST_ASIO_CHECK(!error);
3228 
3229   s.reset(read_data, sizeof(read_data));
3230   s.next_read_length(10);
3231   sb.consume(sb.size());
3232   error = boost::system::error_code();
3233   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3234       boost::asio::transfer_exactly(10), error);
3235   BOOST_ASIO_CHECK(bytes_transferred == 10);
3236   BOOST_ASIO_CHECK(sb.size() == 10);
3237   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 10));
3238   BOOST_ASIO_CHECK(!error);
3239 
3240   s.reset(read_data, sizeof(read_data));
3241   sb.consume(sb.size());
3242   error = boost::system::error_code();
3243   bytes_transferred = boost::asio::read_at(s, 0, sb,
3244       boost::asio::transfer_exactly(42), error);
3245   BOOST_ASIO_CHECK(bytes_transferred == 42);
3246   BOOST_ASIO_CHECK(sb.size() == 42);
3247   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 42));
3248   BOOST_ASIO_CHECK(!error);
3249 
3250   s.reset(read_data, sizeof(read_data));
3251   sb.consume(sb.size());
3252   error = boost::system::error_code();
3253   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3254       boost::asio::transfer_exactly(42), error);
3255   BOOST_ASIO_CHECK(bytes_transferred == 42);
3256   BOOST_ASIO_CHECK(sb.size() == 42);
3257   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 42));
3258   BOOST_ASIO_CHECK(!error);
3259 
3260   s.reset(read_data, sizeof(read_data));
3261   s.next_read_length(1);
3262   sb.consume(sb.size());
3263   error = boost::system::error_code();
3264   bytes_transferred = boost::asio::read_at(s, 0, sb,
3265       boost::asio::transfer_exactly(42), error);
3266   BOOST_ASIO_CHECK(bytes_transferred == 42);
3267   BOOST_ASIO_CHECK(sb.size() == 42);
3268   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 42));
3269   BOOST_ASIO_CHECK(!error);
3270 
3271   s.reset(read_data, sizeof(read_data));
3272   s.next_read_length(1);
3273   sb.consume(sb.size());
3274   error = boost::system::error_code();
3275   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3276       boost::asio::transfer_exactly(42), error);
3277   BOOST_ASIO_CHECK(bytes_transferred == 42);
3278   BOOST_ASIO_CHECK(sb.size() == 42);
3279   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 42));
3280   BOOST_ASIO_CHECK(!error);
3281 
3282   s.reset(read_data, sizeof(read_data));
3283   s.next_read_length(10);
3284   sb.consume(sb.size());
3285   error = boost::system::error_code();
3286   bytes_transferred = boost::asio::read_at(s, 0, sb,
3287       boost::asio::transfer_exactly(42), error);
3288   BOOST_ASIO_CHECK(bytes_transferred == 42);
3289   BOOST_ASIO_CHECK(sb.size() == 42);
3290   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 42));
3291   BOOST_ASIO_CHECK(!error);
3292 
3293   s.reset(read_data, sizeof(read_data));
3294   s.next_read_length(10);
3295   sb.consume(sb.size());
3296   error = boost::system::error_code();
3297   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3298       boost::asio::transfer_exactly(42), error);
3299   BOOST_ASIO_CHECK(bytes_transferred == 42);
3300   BOOST_ASIO_CHECK(sb.size() == 42);
3301   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 42));
3302   BOOST_ASIO_CHECK(!error);
3303 
3304   s.reset(read_data, sizeof(read_data));
3305   sb.consume(sb.size());
3306   bytes_transferred = boost::asio::read_at(s, 0, sb,
3307       old_style_transfer_all, error);
3308   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
3309   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3310   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
3311   BOOST_ASIO_CHECK(!error);
3312 
3313   s.reset(read_data, sizeof(read_data));
3314   sb.consume(sb.size());
3315   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3316       old_style_transfer_all, error);
3317   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
3318   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3319   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
3320   BOOST_ASIO_CHECK(!error);
3321 
3322   s.reset(read_data, sizeof(read_data));
3323   s.next_read_length(1);
3324   sb.consume(sb.size());
3325   error = boost::system::error_code();
3326   bytes_transferred = boost::asio::read_at(s, 0, sb,
3327       old_style_transfer_all, error);
3328   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
3329   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3330   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
3331   BOOST_ASIO_CHECK(!error);
3332 
3333   s.reset(read_data, sizeof(read_data));
3334   s.next_read_length(1);
3335   sb.consume(sb.size());
3336   error = boost::system::error_code();
3337   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3338       old_style_transfer_all, error);
3339   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
3340   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3341   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
3342   BOOST_ASIO_CHECK(!error);
3343 
3344   s.reset(read_data, sizeof(read_data));
3345   s.next_read_length(10);
3346   sb.consume(sb.size());
3347   error = boost::system::error_code();
3348   bytes_transferred = boost::asio::read_at(s, 0, sb,
3349       old_style_transfer_all, error);
3350   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
3351   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3352   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
3353   BOOST_ASIO_CHECK(!error);
3354 
3355   s.reset(read_data, sizeof(read_data));
3356   s.next_read_length(10);
3357   sb.consume(sb.size());
3358   error = boost::system::error_code();
3359   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3360       old_style_transfer_all, error);
3361   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
3362   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3363   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
3364   BOOST_ASIO_CHECK(!error);
3365 
3366   s.reset(read_data, sizeof(read_data));
3367   sb.consume(sb.size());
3368   bytes_transferred = boost::asio::read_at(s, 0, sb,
3369       short_transfer(), error);
3370   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
3371   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3372   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
3373   BOOST_ASIO_CHECK(!error);
3374 
3375   s.reset(read_data, sizeof(read_data));
3376   sb.consume(sb.size());
3377   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3378       short_transfer(), error);
3379   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
3380   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3381   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
3382   BOOST_ASIO_CHECK(!error);
3383 
3384   s.reset(read_data, sizeof(read_data));
3385   s.next_read_length(1);
3386   sb.consume(sb.size());
3387   error = boost::system::error_code();
3388   bytes_transferred = boost::asio::read_at(s, 0, sb,
3389       short_transfer(), error);
3390   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
3391   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3392   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
3393   BOOST_ASIO_CHECK(!error);
3394 
3395   s.reset(read_data, sizeof(read_data));
3396   s.next_read_length(1);
3397   sb.consume(sb.size());
3398   error = boost::system::error_code();
3399   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3400       short_transfer(), error);
3401   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
3402   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3403   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
3404   BOOST_ASIO_CHECK(!error);
3405 
3406   s.reset(read_data, sizeof(read_data));
3407   s.next_read_length(10);
3408   sb.consume(sb.size());
3409   error = boost::system::error_code();
3410   bytes_transferred = boost::asio::read_at(s, 0, sb,
3411       short_transfer(), error);
3412   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
3413   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3414   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
3415   BOOST_ASIO_CHECK(!error);
3416 
3417   s.reset(read_data, sizeof(read_data));
3418   s.next_read_length(10);
3419   sb.consume(sb.size());
3420   error = boost::system::error_code();
3421   bytes_transferred = boost::asio::read_at(s, 1234, sb,
3422       short_transfer(), error);
3423   BOOST_ASIO_CHECK(bytes_transferred == sizeof(read_data));
3424   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3425   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
3426   BOOST_ASIO_CHECK(!error);
3427 }
3428 
async_read_handler(const boost::system::error_code & e,size_t bytes_transferred,size_t expected_bytes_transferred,bool * called)3429 void async_read_handler(const boost::system::error_code& e,
3430     size_t bytes_transferred, size_t expected_bytes_transferred, bool* called)
3431 {
3432   *called = true;
3433   BOOST_ASIO_CHECK(!e);
3434   BOOST_ASIO_CHECK(bytes_transferred == expected_bytes_transferred);
3435 }
3436 
test_4_arg_mutable_buffer_async_read_at()3437 void test_4_arg_mutable_buffer_async_read_at()
3438 {
3439 #if defined(BOOST_ASIO_HAS_BOOST_BIND)
3440   namespace bindns = boost;
3441 #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
3442   namespace bindns = std;
3443   using std::placeholders::_1;
3444   using std::placeholders::_2;
3445 #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
3446 
3447   boost::asio::io_context ioc;
3448   test_random_access_device s(ioc);
3449   char read_buf[sizeof(read_data)];
3450   boost::asio::mutable_buffer buffers
3451     = boost::asio::buffer(read_buf, sizeof(read_buf));
3452 
3453   s.reset(read_data, sizeof(read_data));
3454   memset(read_buf, 0, sizeof(read_buf));
3455   bool called = false;
3456   boost::asio::async_read_at(s, 0, buffers,
3457       bindns::bind(async_read_handler,
3458         _1, _2, sizeof(read_data), &called));
3459   ioc.restart();
3460   ioc.run();
3461   BOOST_ASIO_CHECK(called);
3462   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
3463 
3464   s.reset(read_data, sizeof(read_data));
3465   memset(read_buf, 0, sizeof(read_buf));
3466   called = false;
3467   boost::asio::async_read_at(s, 1234, buffers,
3468       bindns::bind(async_read_handler,
3469         _1, _2, sizeof(read_data), &called));
3470   ioc.restart();
3471   ioc.run();
3472   BOOST_ASIO_CHECK(called);
3473   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
3474 
3475   s.reset(read_data, sizeof(read_data));
3476   s.next_read_length(1);
3477   memset(read_buf, 0, sizeof(read_buf));
3478   called = false;
3479   boost::asio::async_read_at(s, 0, buffers,
3480       bindns::bind(async_read_handler,
3481         _1, _2, sizeof(read_data), &called));
3482   ioc.restart();
3483   ioc.run();
3484   BOOST_ASIO_CHECK(called);
3485   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
3486 
3487   s.reset(read_data, sizeof(read_data));
3488   s.next_read_length(1);
3489   memset(read_buf, 0, sizeof(read_buf));
3490   called = false;
3491   boost::asio::async_read_at(s, 1234, buffers,
3492       bindns::bind(async_read_handler,
3493         _1, _2, sizeof(read_data), &called));
3494   ioc.restart();
3495   ioc.run();
3496   BOOST_ASIO_CHECK(called);
3497   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
3498 
3499   s.reset(read_data, sizeof(read_data));
3500   s.next_read_length(10);
3501   memset(read_buf, 0, sizeof(read_buf));
3502   called = false;
3503   boost::asio::async_read_at(s, 0, buffers,
3504       bindns::bind(async_read_handler,
3505         _1, _2, sizeof(read_data), &called));
3506   ioc.restart();
3507   ioc.run();
3508   BOOST_ASIO_CHECK(called);
3509   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
3510 
3511   s.reset(read_data, sizeof(read_data));
3512   s.next_read_length(10);
3513   memset(read_buf, 0, sizeof(read_buf));
3514   called = false;
3515   boost::asio::async_read_at(s, 1234, buffers,
3516       bindns::bind(async_read_handler,
3517         _1, _2, sizeof(read_data), &called));
3518   ioc.restart();
3519   ioc.run();
3520   BOOST_ASIO_CHECK(called);
3521   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
3522 
3523   s.reset(read_data, sizeof(read_data));
3524   memset(read_buf, 0, sizeof(read_buf));
3525   int i = boost::asio::async_read_at(s, 1234, buffers,
3526       archetypes::lazy_handler());
3527   BOOST_ASIO_CHECK(i == 42);
3528   ioc.restart();
3529   ioc.run();
3530   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
3531 }
3532 
test_4_arg_boost_array_buffers_async_read_at()3533 void test_4_arg_boost_array_buffers_async_read_at()
3534 {
3535 #if defined(BOOST_ASIO_HAS_BOOST_BIND)
3536   namespace bindns = boost;
3537 #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
3538   namespace bindns = std;
3539   using std::placeholders::_1;
3540   using std::placeholders::_2;
3541 #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
3542 
3543 #if defined(BOOST_ASIO_HAS_BOOST_ARRAY)
3544   boost::asio::io_context ioc;
3545   test_random_access_device s(ioc);
3546   char read_buf[sizeof(read_data)];
3547   boost::array<boost::asio::mutable_buffer, 2> buffers = { {
3548     boost::asio::buffer(read_buf, 32),
3549     boost::asio::buffer(read_buf) + 32 } };
3550 
3551   s.reset(read_data, sizeof(read_data));
3552   memset(read_buf, 0, sizeof(read_buf));
3553   bool called = false;
3554   boost::asio::async_read_at(s, 0, buffers,
3555       bindns::bind(async_read_handler,
3556         _1, _2, sizeof(read_data), &called));
3557   ioc.restart();
3558   ioc.run();
3559   BOOST_ASIO_CHECK(called);
3560   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
3561 
3562   s.reset(read_data, sizeof(read_data));
3563   memset(read_buf, 0, sizeof(read_buf));
3564   called = false;
3565   boost::asio::async_read_at(s, 1234, buffers,
3566       bindns::bind(async_read_handler,
3567         _1, _2, sizeof(read_data), &called));
3568   ioc.restart();
3569   ioc.run();
3570   BOOST_ASIO_CHECK(called);
3571   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
3572 
3573   s.reset(read_data, sizeof(read_data));
3574   s.next_read_length(1);
3575   memset(read_buf, 0, sizeof(read_buf));
3576   called = false;
3577   boost::asio::async_read_at(s, 0, buffers,
3578       bindns::bind(async_read_handler,
3579         _1, _2, sizeof(read_data), &called));
3580   ioc.restart();
3581   ioc.run();
3582   BOOST_ASIO_CHECK(called);
3583   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
3584 
3585   s.reset(read_data, sizeof(read_data));
3586   s.next_read_length(1);
3587   memset(read_buf, 0, sizeof(read_buf));
3588   called = false;
3589   boost::asio::async_read_at(s, 1234, buffers,
3590       bindns::bind(async_read_handler,
3591         _1, _2, sizeof(read_data), &called));
3592   ioc.restart();
3593   ioc.run();
3594   BOOST_ASIO_CHECK(called);
3595   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
3596 
3597   s.reset(read_data, sizeof(read_data));
3598   s.next_read_length(10);
3599   memset(read_buf, 0, sizeof(read_buf));
3600   called = false;
3601   boost::asio::async_read_at(s, 0, buffers,
3602       bindns::bind(async_read_handler,
3603         _1, _2, sizeof(read_data), &called));
3604   ioc.restart();
3605   ioc.run();
3606   BOOST_ASIO_CHECK(called);
3607   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
3608 
3609   s.reset(read_data, sizeof(read_data));
3610   s.next_read_length(10);
3611   memset(read_buf, 0, sizeof(read_buf));
3612   called = false;
3613   boost::asio::async_read_at(s, 1234, buffers,
3614       bindns::bind(async_read_handler,
3615         _1, _2, sizeof(read_data), &called));
3616   ioc.restart();
3617   ioc.run();
3618   BOOST_ASIO_CHECK(called);
3619   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
3620 
3621   s.reset(read_data, sizeof(read_data));
3622   memset(read_buf, 0, sizeof(read_buf));
3623   int i = boost::asio::async_read_at(s, 1234, buffers,
3624       archetypes::lazy_handler());
3625   BOOST_ASIO_CHECK(i == 42);
3626   ioc.restart();
3627   ioc.run();
3628   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
3629 #endif // defined(BOOST_ASIO_HAS_BOOST_ARRAY)
3630 }
3631 
test_4_arg_std_array_buffers_async_read_at()3632 void test_4_arg_std_array_buffers_async_read_at()
3633 {
3634 #if defined(BOOST_ASIO_HAS_BOOST_BIND)
3635   namespace bindns = boost;
3636 #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
3637   namespace bindns = std;
3638   using std::placeholders::_1;
3639   using std::placeholders::_2;
3640 #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
3641 
3642 #if defined(BOOST_ASIO_HAS_STD_ARRAY)
3643   boost::asio::io_context ioc;
3644   test_random_access_device s(ioc);
3645   char read_buf[sizeof(read_data)];
3646   std::array<boost::asio::mutable_buffer, 2> buffers = { {
3647     boost::asio::buffer(read_buf, 32),
3648     boost::asio::buffer(read_buf) + 32 } };
3649 
3650   s.reset(read_data, sizeof(read_data));
3651   memset(read_buf, 0, sizeof(read_buf));
3652   bool called = false;
3653   boost::asio::async_read_at(s, 0, buffers,
3654       bindns::bind(async_read_handler,
3655         _1, _2, sizeof(read_data), &called));
3656   ioc.restart();
3657   ioc.run();
3658   BOOST_ASIO_CHECK(called);
3659   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
3660 
3661   s.reset(read_data, sizeof(read_data));
3662   memset(read_buf, 0, sizeof(read_buf));
3663   called = false;
3664   boost::asio::async_read_at(s, 1234, buffers,
3665       bindns::bind(async_read_handler,
3666         _1, _2, sizeof(read_data), &called));
3667   ioc.restart();
3668   ioc.run();
3669   BOOST_ASIO_CHECK(called);
3670   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
3671 
3672   s.reset(read_data, sizeof(read_data));
3673   s.next_read_length(1);
3674   memset(read_buf, 0, sizeof(read_buf));
3675   called = false;
3676   boost::asio::async_read_at(s, 0, buffers,
3677       bindns::bind(async_read_handler,
3678         _1, _2, sizeof(read_data), &called));
3679   ioc.restart();
3680   ioc.run();
3681   BOOST_ASIO_CHECK(called);
3682   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
3683 
3684   s.reset(read_data, sizeof(read_data));
3685   s.next_read_length(1);
3686   memset(read_buf, 0, sizeof(read_buf));
3687   called = false;
3688   boost::asio::async_read_at(s, 1234, buffers,
3689       bindns::bind(async_read_handler,
3690         _1, _2, sizeof(read_data), &called));
3691   ioc.restart();
3692   ioc.run();
3693   BOOST_ASIO_CHECK(called);
3694   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
3695 
3696   s.reset(read_data, sizeof(read_data));
3697   s.next_read_length(10);
3698   memset(read_buf, 0, sizeof(read_buf));
3699   called = false;
3700   boost::asio::async_read_at(s, 0, buffers,
3701       bindns::bind(async_read_handler,
3702         _1, _2, sizeof(read_data), &called));
3703   ioc.restart();
3704   ioc.run();
3705   BOOST_ASIO_CHECK(called);
3706   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
3707 
3708   s.reset(read_data, sizeof(read_data));
3709   s.next_read_length(10);
3710   memset(read_buf, 0, sizeof(read_buf));
3711   called = false;
3712   boost::asio::async_read_at(s, 1234, buffers,
3713       bindns::bind(async_read_handler,
3714         _1, _2, sizeof(read_data), &called));
3715   ioc.restart();
3716   ioc.run();
3717   BOOST_ASIO_CHECK(called);
3718   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
3719 
3720   s.reset(read_data, sizeof(read_data));
3721   memset(read_buf, 0, sizeof(read_buf));
3722   int i = boost::asio::async_read_at(s, 1234, buffers,
3723       archetypes::lazy_handler());
3724   BOOST_ASIO_CHECK(i == 42);
3725   ioc.restart();
3726   ioc.run();
3727   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
3728 #endif // defined(BOOST_ASIO_HAS_STD_ARRAY)
3729 }
3730 
test_4_arg_vector_buffers_async_read_at()3731 void test_4_arg_vector_buffers_async_read_at()
3732 {
3733 #if defined(BOOST_ASIO_HAS_BOOST_BIND)
3734   namespace bindns = boost;
3735 #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
3736   namespace bindns = std;
3737   using std::placeholders::_1;
3738   using std::placeholders::_2;
3739 #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
3740 
3741   boost::asio::io_context ioc;
3742   test_random_access_device s(ioc);
3743   char read_buf[sizeof(read_data)];
3744   std::vector<boost::asio::mutable_buffer> buffers;
3745   buffers.push_back(boost::asio::buffer(read_buf, 32));
3746   buffers.push_back(boost::asio::buffer(read_buf) + 32);
3747 
3748   s.reset(read_data, sizeof(read_data));
3749   memset(read_buf, 0, sizeof(read_buf));
3750   bool called = false;
3751   boost::asio::async_read_at(s, 0, buffers,
3752       bindns::bind(async_read_handler,
3753         _1, _2, sizeof(read_data), &called));
3754   ioc.restart();
3755   ioc.run();
3756   BOOST_ASIO_CHECK(called);
3757   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
3758 
3759   s.reset(read_data, sizeof(read_data));
3760   memset(read_buf, 0, sizeof(read_buf));
3761   called = false;
3762   boost::asio::async_read_at(s, 1234, buffers,
3763       bindns::bind(async_read_handler,
3764         _1, _2, sizeof(read_data), &called));
3765   ioc.restart();
3766   ioc.run();
3767   BOOST_ASIO_CHECK(called);
3768   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
3769 
3770   s.reset(read_data, sizeof(read_data));
3771   s.next_read_length(1);
3772   memset(read_buf, 0, sizeof(read_buf));
3773   called = false;
3774   boost::asio::async_read_at(s, 0, buffers,
3775       bindns::bind(async_read_handler,
3776         _1, _2, sizeof(read_data), &called));
3777   ioc.restart();
3778   ioc.run();
3779   BOOST_ASIO_CHECK(called);
3780   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
3781 
3782   s.reset(read_data, sizeof(read_data));
3783   s.next_read_length(1);
3784   memset(read_buf, 0, sizeof(read_buf));
3785   called = false;
3786   boost::asio::async_read_at(s, 1234, buffers,
3787       bindns::bind(async_read_handler,
3788         _1, _2, sizeof(read_data), &called));
3789   ioc.restart();
3790   ioc.run();
3791   BOOST_ASIO_CHECK(called);
3792   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
3793 
3794   s.reset(read_data, sizeof(read_data));
3795   s.next_read_length(10);
3796   memset(read_buf, 0, sizeof(read_buf));
3797   called = false;
3798   boost::asio::async_read_at(s, 0, buffers,
3799       bindns::bind(async_read_handler,
3800         _1, _2, sizeof(read_data), &called));
3801   ioc.restart();
3802   ioc.run();
3803   BOOST_ASIO_CHECK(called);
3804   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
3805 
3806   s.reset(read_data, sizeof(read_data));
3807   s.next_read_length(10);
3808   memset(read_buf, 0, sizeof(read_buf));
3809   called = false;
3810   boost::asio::async_read_at(s, 1234, buffers,
3811       bindns::bind(async_read_handler,
3812         _1, _2, sizeof(read_data), &called));
3813   ioc.restart();
3814   ioc.run();
3815   BOOST_ASIO_CHECK(called);
3816   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
3817 
3818   s.reset(read_data, sizeof(read_data));
3819   memset(read_buf, 0, sizeof(read_buf));
3820   int i = boost::asio::async_read_at(s, 1234, buffers,
3821       archetypes::lazy_handler());
3822   BOOST_ASIO_CHECK(i == 42);
3823   ioc.restart();
3824   ioc.run();
3825   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
3826 }
3827 
test_4_arg_streambuf_async_read_at()3828 void test_4_arg_streambuf_async_read_at()
3829 {
3830 #if defined(BOOST_ASIO_HAS_BOOST_BIND)
3831   namespace bindns = boost;
3832 #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
3833   namespace bindns = std;
3834   using std::placeholders::_1;
3835   using std::placeholders::_2;
3836 #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
3837 
3838   boost::asio::io_context ioc;
3839   test_random_access_device s(ioc);
3840   boost::asio::streambuf sb(sizeof(read_data));
3841 
3842   s.reset(read_data, sizeof(read_data));
3843   sb.consume(sb.size());
3844   bool called = false;
3845   boost::asio::async_read_at(s, 0, sb,
3846       bindns::bind(async_read_handler,
3847         _1, _2, sizeof(read_data), &called));
3848   ioc.restart();
3849   ioc.run();
3850   BOOST_ASIO_CHECK(called);
3851   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3852   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
3853 
3854   s.reset(read_data, sizeof(read_data));
3855   sb.consume(sb.size());
3856   called = false;
3857   boost::asio::async_read_at(s, 1234, sb,
3858       bindns::bind(async_read_handler,
3859         _1, _2, sizeof(read_data), &called));
3860   ioc.restart();
3861   ioc.run();
3862   BOOST_ASIO_CHECK(called);
3863   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3864   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
3865 
3866   s.reset(read_data, sizeof(read_data));
3867   s.next_read_length(1);
3868   sb.consume(sb.size());
3869   called = false;
3870   boost::asio::async_read_at(s, 0, sb,
3871       bindns::bind(async_read_handler,
3872         _1, _2, sizeof(read_data), &called));
3873   ioc.restart();
3874   ioc.run();
3875   BOOST_ASIO_CHECK(called);
3876   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3877   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
3878 
3879   s.reset(read_data, sizeof(read_data));
3880   s.next_read_length(1);
3881   sb.consume(sb.size());
3882   called = false;
3883   boost::asio::async_read_at(s, 1234, sb,
3884       bindns::bind(async_read_handler,
3885         _1, _2, sizeof(read_data), &called));
3886   ioc.restart();
3887   ioc.run();
3888   BOOST_ASIO_CHECK(called);
3889   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3890   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
3891 
3892   s.reset(read_data, sizeof(read_data));
3893   s.next_read_length(10);
3894   sb.consume(sb.size());
3895   called = false;
3896   boost::asio::async_read_at(s, 0, sb,
3897       bindns::bind(async_read_handler,
3898         _1, _2, sizeof(read_data), &called));
3899   ioc.restart();
3900   ioc.run();
3901   BOOST_ASIO_CHECK(called);
3902   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3903   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
3904 
3905   s.reset(read_data, sizeof(read_data));
3906   s.next_read_length(10);
3907   sb.consume(sb.size());
3908   called = false;
3909   boost::asio::async_read_at(s, 1234, sb,
3910       bindns::bind(async_read_handler,
3911         _1, _2, sizeof(read_data), &called));
3912   ioc.restart();
3913   ioc.run();
3914   BOOST_ASIO_CHECK(called);
3915   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
3916   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
3917 
3918   s.reset(read_data, sizeof(read_data));
3919   sb.consume(sb.size());
3920   int i = boost::asio::async_read_at(s, 1234, sb,
3921       archetypes::lazy_handler());
3922   BOOST_ASIO_CHECK(i == 42);
3923   ioc.restart();
3924   ioc.run();
3925   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
3926 }
3927 
test_5_arg_mutable_buffer_async_read_at()3928 void test_5_arg_mutable_buffer_async_read_at()
3929 {
3930 #if defined(BOOST_ASIO_HAS_BOOST_BIND)
3931   namespace bindns = boost;
3932 #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
3933   namespace bindns = std;
3934   using std::placeholders::_1;
3935   using std::placeholders::_2;
3936 #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
3937 
3938   boost::asio::io_context ioc;
3939   test_random_access_device s(ioc);
3940   char read_buf[sizeof(read_data)];
3941   boost::asio::mutable_buffer buffers
3942     = boost::asio::buffer(read_buf, sizeof(read_buf));
3943 
3944   s.reset(read_data, sizeof(read_data));
3945   memset(read_buf, 0, sizeof(read_buf));
3946   bool called = false;
3947   boost::asio::async_read_at(s, 0, buffers,
3948       boost::asio::transfer_all(),
3949       bindns::bind(async_read_handler,
3950         _1, _2, sizeof(read_data), &called));
3951   ioc.restart();
3952   ioc.run();
3953   BOOST_ASIO_CHECK(called);
3954   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
3955 
3956   s.reset(read_data, sizeof(read_data));
3957   memset(read_buf, 0, sizeof(read_buf));
3958   called = false;
3959   boost::asio::async_read_at(s, 1234, buffers,
3960       boost::asio::transfer_all(),
3961       bindns::bind(async_read_handler,
3962         _1, _2, sizeof(read_data), &called));
3963   ioc.restart();
3964   ioc.run();
3965   BOOST_ASIO_CHECK(called);
3966   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
3967 
3968   s.reset(read_data, sizeof(read_data));
3969   s.next_read_length(1);
3970   memset(read_buf, 0, sizeof(read_buf));
3971   called = false;
3972   boost::asio::async_read_at(s, 0, buffers,
3973       boost::asio::transfer_all(),
3974       bindns::bind(async_read_handler,
3975         _1, _2, sizeof(read_data), &called));
3976   ioc.restart();
3977   ioc.run();
3978   BOOST_ASIO_CHECK(called);
3979   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
3980 
3981   s.reset(read_data, sizeof(read_data));
3982   s.next_read_length(1);
3983   memset(read_buf, 0, sizeof(read_buf));
3984   called = false;
3985   boost::asio::async_read_at(s, 1234, buffers,
3986       boost::asio::transfer_all(),
3987       bindns::bind(async_read_handler,
3988         _1, _2, sizeof(read_data), &called));
3989   ioc.restart();
3990   ioc.run();
3991   BOOST_ASIO_CHECK(called);
3992   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
3993 
3994   s.reset(read_data, sizeof(read_data));
3995   s.next_read_length(10);
3996   memset(read_buf, 0, sizeof(read_buf));
3997   called = false;
3998   boost::asio::async_read_at(s, 0, buffers,
3999       boost::asio::transfer_all(),
4000       bindns::bind(async_read_handler,
4001         _1, _2, sizeof(read_data), &called));
4002   ioc.restart();
4003   ioc.run();
4004   BOOST_ASIO_CHECK(called);
4005   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
4006 
4007   s.reset(read_data, sizeof(read_data));
4008   s.next_read_length(10);
4009   memset(read_buf, 0, sizeof(read_buf));
4010   called = false;
4011   boost::asio::async_read_at(s, 1234, buffers,
4012       boost::asio::transfer_all(),
4013       bindns::bind(async_read_handler,
4014         _1, _2, sizeof(read_data), &called));
4015   ioc.restart();
4016   ioc.run();
4017   BOOST_ASIO_CHECK(called);
4018   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
4019 
4020   s.reset(read_data, sizeof(read_data));
4021   memset(read_buf, 0, sizeof(read_buf));
4022   called = false;
4023   boost::asio::async_read_at(s, 0, buffers,
4024       boost::asio::transfer_at_least(1),
4025       bindns::bind(async_read_handler,
4026         _1, _2, sizeof(read_data), &called));
4027   ioc.restart();
4028   ioc.run();
4029   BOOST_ASIO_CHECK(called);
4030   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
4031 
4032   s.reset(read_data, sizeof(read_data));
4033   memset(read_buf, 0, sizeof(read_buf));
4034   called = false;
4035   boost::asio::async_read_at(s, 1234, buffers,
4036       boost::asio::transfer_at_least(1),
4037       bindns::bind(async_read_handler,
4038         _1, _2, sizeof(read_data), &called));
4039   ioc.restart();
4040   ioc.run();
4041   BOOST_ASIO_CHECK(called);
4042   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
4043 
4044   s.reset(read_data, sizeof(read_data));
4045   s.next_read_length(1);
4046   memset(read_buf, 0, sizeof(read_buf));
4047   called = false;
4048   boost::asio::async_read_at(s, 0, buffers,
4049       boost::asio::transfer_at_least(1),
4050       bindns::bind(async_read_handler,
4051         _1, _2, 1, &called));
4052   ioc.restart();
4053   ioc.run();
4054   BOOST_ASIO_CHECK(called);
4055   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
4056 
4057   s.reset(read_data, sizeof(read_data));
4058   s.next_read_length(1);
4059   memset(read_buf, 0, sizeof(read_buf));
4060   called = false;
4061   boost::asio::async_read_at(s, 1234, buffers,
4062       boost::asio::transfer_at_least(1),
4063       bindns::bind(async_read_handler,
4064         _1, _2, 1, &called));
4065   ioc.restart();
4066   ioc.run();
4067   BOOST_ASIO_CHECK(called);
4068   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
4069 
4070   s.reset(read_data, sizeof(read_data));
4071   s.next_read_length(10);
4072   memset(read_buf, 0, sizeof(read_buf));
4073   called = false;
4074   boost::asio::async_read_at(s, 0, buffers,
4075       boost::asio::transfer_at_least(1),
4076       bindns::bind(async_read_handler,
4077         _1, _2, 10, &called));
4078   ioc.restart();
4079   ioc.run();
4080   BOOST_ASIO_CHECK(called);
4081   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
4082 
4083   s.reset(read_data, sizeof(read_data));
4084   s.next_read_length(10);
4085   memset(read_buf, 0, sizeof(read_buf));
4086   called = false;
4087   boost::asio::async_read_at(s, 1234, buffers,
4088       boost::asio::transfer_at_least(1),
4089       bindns::bind(async_read_handler,
4090         _1, _2, 10, &called));
4091   ioc.restart();
4092   ioc.run();
4093   BOOST_ASIO_CHECK(called);
4094   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
4095 
4096   s.reset(read_data, sizeof(read_data));
4097   memset(read_buf, 0, sizeof(read_buf));
4098   called = false;
4099   boost::asio::async_read_at(s, 0, buffers,
4100       boost::asio::transfer_at_least(10),
4101       bindns::bind(async_read_handler,
4102         _1, _2, sizeof(read_data), &called));
4103   ioc.restart();
4104   ioc.run();
4105   BOOST_ASIO_CHECK(called);
4106   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
4107 
4108   s.reset(read_data, sizeof(read_data));
4109   memset(read_buf, 0, sizeof(read_buf));
4110   called = false;
4111   boost::asio::async_read_at(s, 1234, buffers,
4112       boost::asio::transfer_at_least(10),
4113       bindns::bind(async_read_handler,
4114         _1, _2, sizeof(read_data), &called));
4115   ioc.restart();
4116   ioc.run();
4117   BOOST_ASIO_CHECK(called);
4118   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
4119 
4120   s.reset(read_data, sizeof(read_data));
4121   s.next_read_length(1);
4122   memset(read_buf, 0, sizeof(read_buf));
4123   called = false;
4124   boost::asio::async_read_at(s, 0, buffers,
4125       boost::asio::transfer_at_least(10),
4126       bindns::bind(async_read_handler,
4127         _1, _2, 10, &called));
4128   ioc.restart();
4129   ioc.run();
4130   BOOST_ASIO_CHECK(called);
4131   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
4132 
4133   s.reset(read_data, sizeof(read_data));
4134   s.next_read_length(1);
4135   memset(read_buf, 0, sizeof(read_buf));
4136   called = false;
4137   boost::asio::async_read_at(s, 1234, buffers,
4138       boost::asio::transfer_at_least(10),
4139       bindns::bind(async_read_handler,
4140         _1, _2, 10, &called));
4141   ioc.restart();
4142   ioc.run();
4143   BOOST_ASIO_CHECK(called);
4144   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
4145 
4146   s.reset(read_data, sizeof(read_data));
4147   s.next_read_length(10);
4148   memset(read_buf, 0, sizeof(read_buf));
4149   called = false;
4150   boost::asio::async_read_at(s, 0, buffers,
4151       boost::asio::transfer_at_least(10),
4152       bindns::bind(async_read_handler,
4153         _1, _2, 10, &called));
4154   ioc.restart();
4155   ioc.run();
4156   BOOST_ASIO_CHECK(called);
4157   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
4158 
4159   s.reset(read_data, sizeof(read_data));
4160   s.next_read_length(10);
4161   memset(read_buf, 0, sizeof(read_buf));
4162   called = false;
4163   boost::asio::async_read_at(s, 1234, buffers,
4164       boost::asio::transfer_at_least(10),
4165       bindns::bind(async_read_handler,
4166         _1, _2, 10, &called));
4167   ioc.restart();
4168   ioc.run();
4169   BOOST_ASIO_CHECK(called);
4170   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
4171 
4172   s.reset(read_data, sizeof(read_data));
4173   memset(read_buf, 0, sizeof(read_buf));
4174   called = false;
4175   boost::asio::async_read_at(s, 0, buffers,
4176       boost::asio::transfer_at_least(42),
4177       bindns::bind(async_read_handler,
4178         _1, _2, sizeof(read_data), &called));
4179   ioc.restart();
4180   ioc.run();
4181   BOOST_ASIO_CHECK(called);
4182   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
4183 
4184   s.reset(read_data, sizeof(read_data));
4185   memset(read_buf, 0, sizeof(read_buf));
4186   called = false;
4187   boost::asio::async_read_at(s, 1234, buffers,
4188       boost::asio::transfer_at_least(42),
4189       bindns::bind(async_read_handler,
4190         _1, _2, sizeof(read_data), &called));
4191   ioc.restart();
4192   ioc.run();
4193   BOOST_ASIO_CHECK(called);
4194   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
4195 
4196   s.reset(read_data, sizeof(read_data));
4197   s.next_read_length(1);
4198   memset(read_buf, 0, sizeof(read_buf));
4199   called = false;
4200   boost::asio::async_read_at(s, 0, buffers,
4201       boost::asio::transfer_at_least(42),
4202       bindns::bind(async_read_handler,
4203         _1, _2, 42, &called));
4204   ioc.restart();
4205   ioc.run();
4206   BOOST_ASIO_CHECK(called);
4207   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
4208 
4209   s.reset(read_data, sizeof(read_data));
4210   s.next_read_length(1);
4211   memset(read_buf, 0, sizeof(read_buf));
4212   called = false;
4213   boost::asio::async_read_at(s, 1234, buffers,
4214       boost::asio::transfer_at_least(42),
4215       bindns::bind(async_read_handler,
4216         _1, _2, 42, &called));
4217   ioc.restart();
4218   ioc.run();
4219   BOOST_ASIO_CHECK(called);
4220   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
4221 
4222   s.reset(read_data, sizeof(read_data));
4223   s.next_read_length(10);
4224   memset(read_buf, 0, sizeof(read_buf));
4225   called = false;
4226   boost::asio::async_read_at(s, 0, buffers,
4227       boost::asio::transfer_at_least(42),
4228       bindns::bind(async_read_handler,
4229         _1, _2, 50, &called));
4230   ioc.restart();
4231   ioc.run();
4232   BOOST_ASIO_CHECK(called);
4233   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 50));
4234 
4235   s.reset(read_data, sizeof(read_data));
4236   s.next_read_length(10);
4237   memset(read_buf, 0, sizeof(read_buf));
4238   called = false;
4239   boost::asio::async_read_at(s, 1234, buffers,
4240       boost::asio::transfer_at_least(42),
4241       bindns::bind(async_read_handler,
4242         _1, _2, 50, &called));
4243   ioc.restart();
4244   ioc.run();
4245   BOOST_ASIO_CHECK(called);
4246   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 50));
4247 
4248   s.reset(read_data, sizeof(read_data));
4249   memset(read_buf, 0, sizeof(read_buf));
4250   called = false;
4251   boost::asio::async_read_at(s, 0, buffers,
4252       boost::asio::transfer_exactly(1),
4253       bindns::bind(async_read_handler,
4254         _1, _2, 1, &called));
4255   ioc.restart();
4256   ioc.run();
4257   BOOST_ASIO_CHECK(called);
4258   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
4259 
4260   s.reset(read_data, sizeof(read_data));
4261   memset(read_buf, 0, sizeof(read_buf));
4262   called = false;
4263   boost::asio::async_read_at(s, 1234, buffers,
4264       boost::asio::transfer_exactly(1),
4265       bindns::bind(async_read_handler,
4266         _1, _2, 1, &called));
4267   ioc.restart();
4268   ioc.run();
4269   BOOST_ASIO_CHECK(called);
4270   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
4271 
4272   s.reset(read_data, sizeof(read_data));
4273   s.next_read_length(1);
4274   memset(read_buf, 0, sizeof(read_buf));
4275   called = false;
4276   boost::asio::async_read_at(s, 0, buffers,
4277       boost::asio::transfer_exactly(1),
4278       bindns::bind(async_read_handler,
4279         _1, _2, 1, &called));
4280   ioc.restart();
4281   ioc.run();
4282   BOOST_ASIO_CHECK(called);
4283   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
4284 
4285   s.reset(read_data, sizeof(read_data));
4286   s.next_read_length(1);
4287   memset(read_buf, 0, sizeof(read_buf));
4288   called = false;
4289   boost::asio::async_read_at(s, 1234, buffers,
4290       boost::asio::transfer_exactly(1),
4291       bindns::bind(async_read_handler,
4292         _1, _2, 1, &called));
4293   ioc.restart();
4294   ioc.run();
4295   BOOST_ASIO_CHECK(called);
4296   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
4297 
4298   s.reset(read_data, sizeof(read_data));
4299   s.next_read_length(10);
4300   memset(read_buf, 0, sizeof(read_buf));
4301   called = false;
4302   boost::asio::async_read_at(s, 0, buffers,
4303       boost::asio::transfer_exactly(1),
4304       bindns::bind(async_read_handler,
4305         _1, _2, 1, &called));
4306   ioc.restart();
4307   ioc.run();
4308   BOOST_ASIO_CHECK(called);
4309   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
4310 
4311   s.reset(read_data, sizeof(read_data));
4312   s.next_read_length(10);
4313   memset(read_buf, 0, sizeof(read_buf));
4314   called = false;
4315   boost::asio::async_read_at(s, 1234, buffers,
4316       boost::asio::transfer_exactly(1),
4317       bindns::bind(async_read_handler,
4318         _1, _2, 1, &called));
4319   ioc.restart();
4320   ioc.run();
4321   BOOST_ASIO_CHECK(called);
4322   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
4323 
4324   s.reset(read_data, sizeof(read_data));
4325   memset(read_buf, 0, sizeof(read_buf));
4326   called = false;
4327   boost::asio::async_read_at(s, 0, buffers,
4328       boost::asio::transfer_exactly(10),
4329       bindns::bind(async_read_handler,
4330         _1, _2, 10, &called));
4331   ioc.restart();
4332   ioc.run();
4333   BOOST_ASIO_CHECK(called);
4334   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
4335 
4336   s.reset(read_data, sizeof(read_data));
4337   memset(read_buf, 0, sizeof(read_buf));
4338   called = false;
4339   boost::asio::async_read_at(s, 1234, buffers,
4340       boost::asio::transfer_exactly(10),
4341       bindns::bind(async_read_handler,
4342         _1, _2, 10, &called));
4343   ioc.restart();
4344   ioc.run();
4345   BOOST_ASIO_CHECK(called);
4346   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
4347 
4348   s.reset(read_data, sizeof(read_data));
4349   s.next_read_length(1);
4350   memset(read_buf, 0, sizeof(read_buf));
4351   called = false;
4352   boost::asio::async_read_at(s, 0, buffers,
4353       boost::asio::transfer_exactly(10),
4354       bindns::bind(async_read_handler,
4355         _1, _2, 10, &called));
4356   ioc.restart();
4357   ioc.run();
4358   BOOST_ASIO_CHECK(called);
4359   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
4360 
4361   s.reset(read_data, sizeof(read_data));
4362   s.next_read_length(1);
4363   memset(read_buf, 0, sizeof(read_buf));
4364   called = false;
4365   boost::asio::async_read_at(s, 1234, buffers,
4366       boost::asio::transfer_exactly(10),
4367       bindns::bind(async_read_handler,
4368         _1, _2, 10, &called));
4369   ioc.restart();
4370   ioc.run();
4371   BOOST_ASIO_CHECK(called);
4372   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
4373 
4374   s.reset(read_data, sizeof(read_data));
4375   s.next_read_length(10);
4376   memset(read_buf, 0, sizeof(read_buf));
4377   called = false;
4378   boost::asio::async_read_at(s, 0, buffers,
4379       boost::asio::transfer_exactly(10),
4380       bindns::bind(async_read_handler,
4381         _1, _2, 10, &called));
4382   ioc.restart();
4383   ioc.run();
4384   BOOST_ASIO_CHECK(called);
4385   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
4386 
4387   s.reset(read_data, sizeof(read_data));
4388   s.next_read_length(10);
4389   memset(read_buf, 0, sizeof(read_buf));
4390   called = false;
4391   boost::asio::async_read_at(s, 1234, buffers,
4392       boost::asio::transfer_exactly(10),
4393       bindns::bind(async_read_handler,
4394         _1, _2, 10, &called));
4395   ioc.restart();
4396   ioc.run();
4397   BOOST_ASIO_CHECK(called);
4398   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
4399 
4400   s.reset(read_data, sizeof(read_data));
4401   memset(read_buf, 0, sizeof(read_buf));
4402   called = false;
4403   boost::asio::async_read_at(s, 0, buffers,
4404       boost::asio::transfer_exactly(42),
4405       bindns::bind(async_read_handler,
4406         _1, _2, 42, &called));
4407   ioc.restart();
4408   ioc.run();
4409   BOOST_ASIO_CHECK(called);
4410   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
4411 
4412   s.reset(read_data, sizeof(read_data));
4413   memset(read_buf, 0, sizeof(read_buf));
4414   called = false;
4415   boost::asio::async_read_at(s, 1234, buffers,
4416       boost::asio::transfer_exactly(42),
4417       bindns::bind(async_read_handler,
4418         _1, _2, 42, &called));
4419   ioc.restart();
4420   ioc.run();
4421   BOOST_ASIO_CHECK(called);
4422   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
4423 
4424   s.reset(read_data, sizeof(read_data));
4425   s.next_read_length(1);
4426   memset(read_buf, 0, sizeof(read_buf));
4427   called = false;
4428   boost::asio::async_read_at(s, 0, buffers,
4429       boost::asio::transfer_exactly(42),
4430       bindns::bind(async_read_handler,
4431         _1, _2, 42, &called));
4432   ioc.restart();
4433   ioc.run();
4434   BOOST_ASIO_CHECK(called);
4435   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
4436 
4437   s.reset(read_data, sizeof(read_data));
4438   s.next_read_length(1);
4439   memset(read_buf, 0, sizeof(read_buf));
4440   called = false;
4441   boost::asio::async_read_at(s, 1234, buffers,
4442       boost::asio::transfer_exactly(42),
4443       bindns::bind(async_read_handler,
4444         _1, _2, 42, &called));
4445   ioc.restart();
4446   ioc.run();
4447   BOOST_ASIO_CHECK(called);
4448   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
4449 
4450   s.reset(read_data, sizeof(read_data));
4451   s.next_read_length(10);
4452   memset(read_buf, 0, sizeof(read_buf));
4453   called = false;
4454   boost::asio::async_read_at(s, 0, buffers,
4455       boost::asio::transfer_exactly(42),
4456       bindns::bind(async_read_handler,
4457         _1, _2, 42, &called));
4458   ioc.restart();
4459   ioc.run();
4460   BOOST_ASIO_CHECK(called);
4461   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
4462 
4463   s.reset(read_data, sizeof(read_data));
4464   s.next_read_length(10);
4465   memset(read_buf, 0, sizeof(read_buf));
4466   called = false;
4467   boost::asio::async_read_at(s, 1234, buffers,
4468       boost::asio::transfer_exactly(42),
4469       bindns::bind(async_read_handler,
4470         _1, _2, 42, &called));
4471   ioc.restart();
4472   ioc.run();
4473   BOOST_ASIO_CHECK(called);
4474   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
4475 
4476   s.reset(read_data, sizeof(read_data));
4477   memset(read_buf, 0, sizeof(read_buf));
4478   called = false;
4479   boost::asio::async_read_at(s, 0, buffers, old_style_transfer_all,
4480       bindns::bind(async_read_handler,
4481         _1, _2, sizeof(read_data), &called));
4482   ioc.restart();
4483   ioc.run();
4484   BOOST_ASIO_CHECK(called);
4485   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
4486 
4487   s.reset(read_data, sizeof(read_data));
4488   memset(read_buf, 0, sizeof(read_buf));
4489   called = false;
4490   boost::asio::async_read_at(s, 1234, buffers, old_style_transfer_all,
4491       bindns::bind(async_read_handler,
4492         _1, _2, sizeof(read_data), &called));
4493   ioc.restart();
4494   ioc.run();
4495   BOOST_ASIO_CHECK(called);
4496   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
4497 
4498   s.reset(read_data, sizeof(read_data));
4499   s.next_read_length(1);
4500   memset(read_buf, 0, sizeof(read_buf));
4501   called = false;
4502   boost::asio::async_read_at(s, 0, buffers, old_style_transfer_all,
4503       bindns::bind(async_read_handler,
4504         _1, _2, sizeof(read_data), &called));
4505   ioc.restart();
4506   ioc.run();
4507   BOOST_ASIO_CHECK(called);
4508   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
4509 
4510   s.reset(read_data, sizeof(read_data));
4511   s.next_read_length(1);
4512   memset(read_buf, 0, sizeof(read_buf));
4513   called = false;
4514   boost::asio::async_read_at(s, 1234, buffers, old_style_transfer_all,
4515       bindns::bind(async_read_handler,
4516         _1, _2, sizeof(read_data), &called));
4517   ioc.restart();
4518   ioc.run();
4519   BOOST_ASIO_CHECK(called);
4520   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
4521 
4522   s.reset(read_data, sizeof(read_data));
4523   s.next_read_length(10);
4524   memset(read_buf, 0, sizeof(read_buf));
4525   called = false;
4526   boost::asio::async_read_at(s, 0, buffers, old_style_transfer_all,
4527       bindns::bind(async_read_handler,
4528         _1, _2, sizeof(read_data), &called));
4529   ioc.restart();
4530   ioc.run();
4531   BOOST_ASIO_CHECK(called);
4532   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
4533 
4534   s.reset(read_data, sizeof(read_data));
4535   s.next_read_length(10);
4536   memset(read_buf, 0, sizeof(read_buf));
4537   called = false;
4538   boost::asio::async_read_at(s, 1234, buffers, old_style_transfer_all,
4539       bindns::bind(async_read_handler,
4540         _1, _2, sizeof(read_data), &called));
4541   ioc.restart();
4542   ioc.run();
4543   BOOST_ASIO_CHECK(called);
4544   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
4545 
4546   s.reset(read_data, sizeof(read_data));
4547   memset(read_buf, 0, sizeof(read_buf));
4548   called = false;
4549   boost::asio::async_read_at(s, 0, buffers, short_transfer(),
4550       bindns::bind(async_read_handler,
4551         _1, _2, sizeof(read_data), &called));
4552   ioc.restart();
4553   ioc.run();
4554   BOOST_ASIO_CHECK(called);
4555   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
4556 
4557   s.reset(read_data, sizeof(read_data));
4558   memset(read_buf, 0, sizeof(read_buf));
4559   called = false;
4560   boost::asio::async_read_at(s, 1234, buffers, short_transfer(),
4561       bindns::bind(async_read_handler,
4562         _1, _2, sizeof(read_data), &called));
4563   ioc.restart();
4564   ioc.run();
4565   BOOST_ASIO_CHECK(called);
4566   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
4567 
4568   s.reset(read_data, sizeof(read_data));
4569   s.next_read_length(1);
4570   memset(read_buf, 0, sizeof(read_buf));
4571   called = false;
4572   boost::asio::async_read_at(s, 0, buffers, short_transfer(),
4573       bindns::bind(async_read_handler,
4574         _1, _2, sizeof(read_data), &called));
4575   ioc.restart();
4576   ioc.run();
4577   BOOST_ASIO_CHECK(called);
4578   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
4579 
4580   s.reset(read_data, sizeof(read_data));
4581   s.next_read_length(1);
4582   memset(read_buf, 0, sizeof(read_buf));
4583   called = false;
4584   boost::asio::async_read_at(s, 1234, buffers, short_transfer(),
4585       bindns::bind(async_read_handler,
4586         _1, _2, sizeof(read_data), &called));
4587   ioc.restart();
4588   ioc.run();
4589   BOOST_ASIO_CHECK(called);
4590   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
4591 
4592   s.reset(read_data, sizeof(read_data));
4593   s.next_read_length(10);
4594   memset(read_buf, 0, sizeof(read_buf));
4595   called = false;
4596   boost::asio::async_read_at(s, 0, buffers, short_transfer(),
4597       bindns::bind(async_read_handler,
4598         _1, _2, sizeof(read_data), &called));
4599   ioc.restart();
4600   ioc.run();
4601   BOOST_ASIO_CHECK(called);
4602   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
4603 
4604   s.reset(read_data, sizeof(read_data));
4605   s.next_read_length(10);
4606   memset(read_buf, 0, sizeof(read_buf));
4607   called = false;
4608   boost::asio::async_read_at(s, 1234, buffers, short_transfer(),
4609       bindns::bind(async_read_handler,
4610         _1, _2, sizeof(read_data), &called));
4611   ioc.restart();
4612   ioc.run();
4613   BOOST_ASIO_CHECK(called);
4614   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
4615 
4616   s.reset(read_data, sizeof(read_data));
4617   memset(read_buf, 0, sizeof(read_buf));
4618   int i = boost::asio::async_read_at(s, 1234, buffers,
4619       short_transfer(), archetypes::lazy_handler());
4620   BOOST_ASIO_CHECK(i == 42);
4621   ioc.restart();
4622   ioc.run();
4623   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
4624 }
4625 
test_5_arg_boost_array_buffers_async_read_at()4626 void test_5_arg_boost_array_buffers_async_read_at()
4627 {
4628 #if defined(BOOST_ASIO_HAS_BOOST_BIND)
4629   namespace bindns = boost;
4630 #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
4631   namespace bindns = std;
4632   using std::placeholders::_1;
4633   using std::placeholders::_2;
4634 #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
4635 
4636 #if defined(BOOST_ASIO_HAS_BOOST_ARRAY)
4637   boost::asio::io_context ioc;
4638   test_random_access_device s(ioc);
4639   char read_buf[sizeof(read_data)];
4640   boost::array<boost::asio::mutable_buffer, 2> buffers = { {
4641     boost::asio::buffer(read_buf, 32),
4642     boost::asio::buffer(read_buf) + 32 } };
4643 
4644   s.reset(read_data, sizeof(read_data));
4645   memset(read_buf, 0, sizeof(read_buf));
4646   bool called = false;
4647   boost::asio::async_read_at(s, 0, buffers,
4648       boost::asio::transfer_all(),
4649       bindns::bind(async_read_handler,
4650         _1, _2, sizeof(read_data), &called));
4651   ioc.restart();
4652   ioc.run();
4653   BOOST_ASIO_CHECK(called);
4654   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
4655 
4656   s.reset(read_data, sizeof(read_data));
4657   memset(read_buf, 0, sizeof(read_buf));
4658   called = false;
4659   boost::asio::async_read_at(s, 1234, buffers,
4660       boost::asio::transfer_all(),
4661       bindns::bind(async_read_handler,
4662         _1, _2, sizeof(read_data), &called));
4663   ioc.restart();
4664   ioc.run();
4665   BOOST_ASIO_CHECK(called);
4666   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
4667 
4668   s.reset(read_data, sizeof(read_data));
4669   s.next_read_length(1);
4670   memset(read_buf, 0, sizeof(read_buf));
4671   called = false;
4672   boost::asio::async_read_at(s, 0, buffers,
4673       boost::asio::transfer_all(),
4674       bindns::bind(async_read_handler,
4675         _1, _2, sizeof(read_data), &called));
4676   ioc.restart();
4677   ioc.run();
4678   BOOST_ASIO_CHECK(called);
4679   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
4680 
4681   s.reset(read_data, sizeof(read_data));
4682   s.next_read_length(1);
4683   memset(read_buf, 0, sizeof(read_buf));
4684   called = false;
4685   boost::asio::async_read_at(s, 1234, buffers,
4686       boost::asio::transfer_all(),
4687       bindns::bind(async_read_handler,
4688         _1, _2, sizeof(read_data), &called));
4689   ioc.restart();
4690   ioc.run();
4691   BOOST_ASIO_CHECK(called);
4692   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
4693 
4694   s.reset(read_data, sizeof(read_data));
4695   s.next_read_length(10);
4696   memset(read_buf, 0, sizeof(read_buf));
4697   called = false;
4698   boost::asio::async_read_at(s, 0, buffers,
4699       boost::asio::transfer_all(),
4700       bindns::bind(async_read_handler,
4701         _1, _2, sizeof(read_data), &called));
4702   ioc.restart();
4703   ioc.run();
4704   BOOST_ASIO_CHECK(called);
4705   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
4706 
4707   s.reset(read_data, sizeof(read_data));
4708   s.next_read_length(10);
4709   memset(read_buf, 0, sizeof(read_buf));
4710   called = false;
4711   boost::asio::async_read_at(s, 1234, buffers,
4712       boost::asio::transfer_all(),
4713       bindns::bind(async_read_handler,
4714         _1, _2, sizeof(read_data), &called));
4715   ioc.restart();
4716   ioc.run();
4717   BOOST_ASIO_CHECK(called);
4718   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
4719 
4720   s.reset(read_data, sizeof(read_data));
4721   memset(read_buf, 0, sizeof(read_buf));
4722   called = false;
4723   boost::asio::async_read_at(s, 0, buffers,
4724       boost::asio::transfer_at_least(1),
4725       bindns::bind(async_read_handler,
4726         _1, _2, sizeof(read_data), &called));
4727   ioc.restart();
4728   ioc.run();
4729   BOOST_ASIO_CHECK(called);
4730   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
4731 
4732   s.reset(read_data, sizeof(read_data));
4733   memset(read_buf, 0, sizeof(read_buf));
4734   called = false;
4735   boost::asio::async_read_at(s, 1234, buffers,
4736       boost::asio::transfer_at_least(1),
4737       bindns::bind(async_read_handler,
4738         _1, _2, sizeof(read_data), &called));
4739   ioc.restart();
4740   ioc.run();
4741   BOOST_ASIO_CHECK(called);
4742   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
4743 
4744   s.reset(read_data, sizeof(read_data));
4745   s.next_read_length(1);
4746   memset(read_buf, 0, sizeof(read_buf));
4747   called = false;
4748   boost::asio::async_read_at(s, 0, buffers,
4749       boost::asio::transfer_at_least(1),
4750       bindns::bind(async_read_handler,
4751         _1, _2, 1, &called));
4752   ioc.restart();
4753   ioc.run();
4754   BOOST_ASIO_CHECK(called);
4755   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
4756 
4757   s.reset(read_data, sizeof(read_data));
4758   s.next_read_length(1);
4759   memset(read_buf, 0, sizeof(read_buf));
4760   called = false;
4761   boost::asio::async_read_at(s, 1234, buffers,
4762       boost::asio::transfer_at_least(1),
4763       bindns::bind(async_read_handler,
4764         _1, _2, 1, &called));
4765   ioc.restart();
4766   ioc.run();
4767   BOOST_ASIO_CHECK(called);
4768   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
4769 
4770   s.reset(read_data, sizeof(read_data));
4771   s.next_read_length(10);
4772   memset(read_buf, 0, sizeof(read_buf));
4773   called = false;
4774   boost::asio::async_read_at(s, 0, buffers,
4775       boost::asio::transfer_at_least(1),
4776       bindns::bind(async_read_handler,
4777         _1, _2, 10, &called));
4778   ioc.restart();
4779   ioc.run();
4780   BOOST_ASIO_CHECK(called);
4781   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
4782 
4783   s.reset(read_data, sizeof(read_data));
4784   s.next_read_length(10);
4785   memset(read_buf, 0, sizeof(read_buf));
4786   called = false;
4787   boost::asio::async_read_at(s, 1234, buffers,
4788       boost::asio::transfer_at_least(1),
4789       bindns::bind(async_read_handler,
4790         _1, _2, 10, &called));
4791   ioc.restart();
4792   ioc.run();
4793   BOOST_ASIO_CHECK(called);
4794   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
4795 
4796   s.reset(read_data, sizeof(read_data));
4797   memset(read_buf, 0, sizeof(read_buf));
4798   called = false;
4799   boost::asio::async_read_at(s, 0, buffers,
4800       boost::asio::transfer_at_least(10),
4801       bindns::bind(async_read_handler,
4802         _1, _2, sizeof(read_data), &called));
4803   ioc.restart();
4804   ioc.run();
4805   BOOST_ASIO_CHECK(called);
4806   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
4807 
4808   s.reset(read_data, sizeof(read_data));
4809   memset(read_buf, 0, sizeof(read_buf));
4810   called = false;
4811   boost::asio::async_read_at(s, 1234, buffers,
4812       boost::asio::transfer_at_least(10),
4813       bindns::bind(async_read_handler,
4814         _1, _2, sizeof(read_data), &called));
4815   ioc.restart();
4816   ioc.run();
4817   BOOST_ASIO_CHECK(called);
4818   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
4819 
4820   s.reset(read_data, sizeof(read_data));
4821   s.next_read_length(1);
4822   memset(read_buf, 0, sizeof(read_buf));
4823   called = false;
4824   boost::asio::async_read_at(s, 0, buffers,
4825       boost::asio::transfer_at_least(10),
4826       bindns::bind(async_read_handler,
4827         _1, _2, 10, &called));
4828   ioc.restart();
4829   ioc.run();
4830   BOOST_ASIO_CHECK(called);
4831   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
4832 
4833   s.reset(read_data, sizeof(read_data));
4834   s.next_read_length(1);
4835   memset(read_buf, 0, sizeof(read_buf));
4836   called = false;
4837   boost::asio::async_read_at(s, 1234, buffers,
4838       boost::asio::transfer_at_least(10),
4839       bindns::bind(async_read_handler,
4840         _1, _2, 10, &called));
4841   ioc.restart();
4842   ioc.run();
4843   BOOST_ASIO_CHECK(called);
4844   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
4845 
4846   s.reset(read_data, sizeof(read_data));
4847   s.next_read_length(10);
4848   memset(read_buf, 0, sizeof(read_buf));
4849   called = false;
4850   boost::asio::async_read_at(s, 0, buffers,
4851       boost::asio::transfer_at_least(10),
4852       bindns::bind(async_read_handler,
4853         _1, _2, 10, &called));
4854   ioc.restart();
4855   ioc.run();
4856   BOOST_ASIO_CHECK(called);
4857   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
4858 
4859   s.reset(read_data, sizeof(read_data));
4860   s.next_read_length(10);
4861   memset(read_buf, 0, sizeof(read_buf));
4862   called = false;
4863   boost::asio::async_read_at(s, 1234, buffers,
4864       boost::asio::transfer_at_least(10),
4865       bindns::bind(async_read_handler,
4866         _1, _2, 10, &called));
4867   ioc.restart();
4868   ioc.run();
4869   BOOST_ASIO_CHECK(called);
4870   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
4871 
4872   s.reset(read_data, sizeof(read_data));
4873   memset(read_buf, 0, sizeof(read_buf));
4874   called = false;
4875   boost::asio::async_read_at(s, 0, buffers,
4876       boost::asio::transfer_at_least(42),
4877       bindns::bind(async_read_handler,
4878         _1, _2, sizeof(read_data), &called));
4879   ioc.restart();
4880   ioc.run();
4881   BOOST_ASIO_CHECK(called);
4882   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
4883 
4884   s.reset(read_data, sizeof(read_data));
4885   memset(read_buf, 0, sizeof(read_buf));
4886   called = false;
4887   boost::asio::async_read_at(s, 1234, buffers,
4888       boost::asio::transfer_at_least(42),
4889       bindns::bind(async_read_handler,
4890         _1, _2, sizeof(read_data), &called));
4891   ioc.restart();
4892   ioc.run();
4893   BOOST_ASIO_CHECK(called);
4894   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
4895 
4896   s.reset(read_data, sizeof(read_data));
4897   s.next_read_length(1);
4898   memset(read_buf, 0, sizeof(read_buf));
4899   called = false;
4900   boost::asio::async_read_at(s, 0, buffers,
4901       boost::asio::transfer_at_least(42),
4902       bindns::bind(async_read_handler,
4903         _1, _2, 42, &called));
4904   ioc.restart();
4905   ioc.run();
4906   BOOST_ASIO_CHECK(called);
4907   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
4908 
4909   s.reset(read_data, sizeof(read_data));
4910   s.next_read_length(1);
4911   memset(read_buf, 0, sizeof(read_buf));
4912   called = false;
4913   boost::asio::async_read_at(s, 1234, buffers,
4914       boost::asio::transfer_at_least(42),
4915       bindns::bind(async_read_handler,
4916         _1, _2, 42, &called));
4917   ioc.restart();
4918   ioc.run();
4919   BOOST_ASIO_CHECK(called);
4920   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
4921 
4922   s.reset(read_data, sizeof(read_data));
4923   s.next_read_length(10);
4924   memset(read_buf, 0, sizeof(read_buf));
4925   called = false;
4926   boost::asio::async_read_at(s, 0, buffers,
4927       boost::asio::transfer_at_least(42),
4928       bindns::bind(async_read_handler,
4929         _1, _2, 50, &called));
4930   ioc.restart();
4931   ioc.run();
4932   BOOST_ASIO_CHECK(called);
4933   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 50));
4934 
4935   s.reset(read_data, sizeof(read_data));
4936   s.next_read_length(10);
4937   memset(read_buf, 0, sizeof(read_buf));
4938   called = false;
4939   boost::asio::async_read_at(s, 1234, buffers,
4940       boost::asio::transfer_at_least(42),
4941       bindns::bind(async_read_handler,
4942         _1, _2, 50, &called));
4943   ioc.restart();
4944   ioc.run();
4945   BOOST_ASIO_CHECK(called);
4946   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 50));
4947 
4948   s.reset(read_data, sizeof(read_data));
4949   memset(read_buf, 0, sizeof(read_buf));
4950   called = false;
4951   boost::asio::async_read_at(s, 0, buffers,
4952       boost::asio::transfer_exactly(1),
4953       bindns::bind(async_read_handler,
4954         _1, _2, 1, &called));
4955   ioc.restart();
4956   ioc.run();
4957   BOOST_ASIO_CHECK(called);
4958   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
4959 
4960   s.reset(read_data, sizeof(read_data));
4961   memset(read_buf, 0, sizeof(read_buf));
4962   called = false;
4963   boost::asio::async_read_at(s, 1234, buffers,
4964       boost::asio::transfer_exactly(1),
4965       bindns::bind(async_read_handler,
4966         _1, _2, 1, &called));
4967   ioc.restart();
4968   ioc.run();
4969   BOOST_ASIO_CHECK(called);
4970   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
4971 
4972   s.reset(read_data, sizeof(read_data));
4973   s.next_read_length(1);
4974   memset(read_buf, 0, sizeof(read_buf));
4975   called = false;
4976   boost::asio::async_read_at(s, 0, buffers,
4977       boost::asio::transfer_exactly(1),
4978       bindns::bind(async_read_handler,
4979         _1, _2, 1, &called));
4980   ioc.restart();
4981   ioc.run();
4982   BOOST_ASIO_CHECK(called);
4983   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
4984 
4985   s.reset(read_data, sizeof(read_data));
4986   s.next_read_length(1);
4987   memset(read_buf, 0, sizeof(read_buf));
4988   called = false;
4989   boost::asio::async_read_at(s, 1234, buffers,
4990       boost::asio::transfer_exactly(1),
4991       bindns::bind(async_read_handler,
4992         _1, _2, 1, &called));
4993   ioc.restart();
4994   ioc.run();
4995   BOOST_ASIO_CHECK(called);
4996   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
4997 
4998   s.reset(read_data, sizeof(read_data));
4999   s.next_read_length(10);
5000   memset(read_buf, 0, sizeof(read_buf));
5001   called = false;
5002   boost::asio::async_read_at(s, 0, buffers,
5003       boost::asio::transfer_exactly(1),
5004       bindns::bind(async_read_handler,
5005         _1, _2, 1, &called));
5006   ioc.restart();
5007   ioc.run();
5008   BOOST_ASIO_CHECK(called);
5009   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
5010 
5011   s.reset(read_data, sizeof(read_data));
5012   s.next_read_length(10);
5013   memset(read_buf, 0, sizeof(read_buf));
5014   called = false;
5015   boost::asio::async_read_at(s, 1234, buffers,
5016       boost::asio::transfer_exactly(1),
5017       bindns::bind(async_read_handler,
5018         _1, _2, 1, &called));
5019   ioc.restart();
5020   ioc.run();
5021   BOOST_ASIO_CHECK(called);
5022   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
5023 
5024   s.reset(read_data, sizeof(read_data));
5025   memset(read_buf, 0, sizeof(read_buf));
5026   called = false;
5027   boost::asio::async_read_at(s, 0, buffers,
5028       boost::asio::transfer_exactly(10),
5029       bindns::bind(async_read_handler,
5030         _1, _2, 10, &called));
5031   ioc.restart();
5032   ioc.run();
5033   BOOST_ASIO_CHECK(called);
5034   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
5035 
5036   s.reset(read_data, sizeof(read_data));
5037   memset(read_buf, 0, sizeof(read_buf));
5038   called = false;
5039   boost::asio::async_read_at(s, 1234, buffers,
5040       boost::asio::transfer_exactly(10),
5041       bindns::bind(async_read_handler,
5042         _1, _2, 10, &called));
5043   ioc.restart();
5044   ioc.run();
5045   BOOST_ASIO_CHECK(called);
5046   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
5047 
5048   s.reset(read_data, sizeof(read_data));
5049   s.next_read_length(1);
5050   memset(read_buf, 0, sizeof(read_buf));
5051   called = false;
5052   boost::asio::async_read_at(s, 0, buffers,
5053       boost::asio::transfer_exactly(10),
5054       bindns::bind(async_read_handler,
5055         _1, _2, 10, &called));
5056   ioc.restart();
5057   ioc.run();
5058   BOOST_ASIO_CHECK(called);
5059   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
5060 
5061   s.reset(read_data, sizeof(read_data));
5062   s.next_read_length(1);
5063   memset(read_buf, 0, sizeof(read_buf));
5064   called = false;
5065   boost::asio::async_read_at(s, 1234, buffers,
5066       boost::asio::transfer_exactly(10),
5067       bindns::bind(async_read_handler,
5068         _1, _2, 10, &called));
5069   ioc.restart();
5070   ioc.run();
5071   BOOST_ASIO_CHECK(called);
5072   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
5073 
5074   s.reset(read_data, sizeof(read_data));
5075   s.next_read_length(10);
5076   memset(read_buf, 0, sizeof(read_buf));
5077   called = false;
5078   boost::asio::async_read_at(s, 0, buffers,
5079       boost::asio::transfer_exactly(10),
5080       bindns::bind(async_read_handler,
5081         _1, _2, 10, &called));
5082   ioc.restart();
5083   ioc.run();
5084   BOOST_ASIO_CHECK(called);
5085   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
5086 
5087   s.reset(read_data, sizeof(read_data));
5088   s.next_read_length(10);
5089   memset(read_buf, 0, sizeof(read_buf));
5090   called = false;
5091   boost::asio::async_read_at(s, 1234, buffers,
5092       boost::asio::transfer_exactly(10),
5093       bindns::bind(async_read_handler,
5094         _1, _2, 10, &called));
5095   ioc.restart();
5096   ioc.run();
5097   BOOST_ASIO_CHECK(called);
5098   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
5099 
5100   s.reset(read_data, sizeof(read_data));
5101   memset(read_buf, 0, sizeof(read_buf));
5102   called = false;
5103   boost::asio::async_read_at(s, 0, buffers,
5104       boost::asio::transfer_exactly(42),
5105       bindns::bind(async_read_handler,
5106         _1, _2, 42, &called));
5107   ioc.restart();
5108   ioc.run();
5109   BOOST_ASIO_CHECK(called);
5110   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
5111 
5112   s.reset(read_data, sizeof(read_data));
5113   memset(read_buf, 0, sizeof(read_buf));
5114   called = false;
5115   boost::asio::async_read_at(s, 1234, buffers,
5116       boost::asio::transfer_exactly(42),
5117       bindns::bind(async_read_handler,
5118         _1, _2, 42, &called));
5119   ioc.restart();
5120   ioc.run();
5121   BOOST_ASIO_CHECK(called);
5122   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
5123 
5124   s.reset(read_data, sizeof(read_data));
5125   s.next_read_length(1);
5126   memset(read_buf, 0, sizeof(read_buf));
5127   called = false;
5128   boost::asio::async_read_at(s, 0, buffers,
5129       boost::asio::transfer_exactly(42),
5130       bindns::bind(async_read_handler,
5131         _1, _2, 42, &called));
5132   ioc.restart();
5133   ioc.run();
5134   BOOST_ASIO_CHECK(called);
5135   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
5136 
5137   s.reset(read_data, sizeof(read_data));
5138   s.next_read_length(1);
5139   memset(read_buf, 0, sizeof(read_buf));
5140   called = false;
5141   boost::asio::async_read_at(s, 1234, buffers,
5142       boost::asio::transfer_exactly(42),
5143       bindns::bind(async_read_handler,
5144         _1, _2, 42, &called));
5145   ioc.restart();
5146   ioc.run();
5147   BOOST_ASIO_CHECK(called);
5148   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
5149 
5150   s.reset(read_data, sizeof(read_data));
5151   s.next_read_length(10);
5152   memset(read_buf, 0, sizeof(read_buf));
5153   called = false;
5154   boost::asio::async_read_at(s, 0, buffers,
5155       boost::asio::transfer_exactly(42),
5156       bindns::bind(async_read_handler,
5157         _1, _2, 42, &called));
5158   ioc.restart();
5159   ioc.run();
5160   BOOST_ASIO_CHECK(called);
5161   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
5162 
5163   s.reset(read_data, sizeof(read_data));
5164   s.next_read_length(10);
5165   memset(read_buf, 0, sizeof(read_buf));
5166   called = false;
5167   boost::asio::async_read_at(s, 1234, buffers,
5168       boost::asio::transfer_exactly(42),
5169       bindns::bind(async_read_handler,
5170         _1, _2, 42, &called));
5171   ioc.restart();
5172   ioc.run();
5173   BOOST_ASIO_CHECK(called);
5174   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
5175 
5176   s.reset(read_data, sizeof(read_data));
5177   memset(read_buf, 0, sizeof(read_buf));
5178   called = false;
5179   boost::asio::async_read_at(s, 0, buffers, old_style_transfer_all,
5180       bindns::bind(async_read_handler,
5181         _1, _2, sizeof(read_data), &called));
5182   ioc.restart();
5183   ioc.run();
5184   BOOST_ASIO_CHECK(called);
5185   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
5186 
5187   s.reset(read_data, sizeof(read_data));
5188   memset(read_buf, 0, sizeof(read_buf));
5189   called = false;
5190   boost::asio::async_read_at(s, 1234, buffers, old_style_transfer_all,
5191       bindns::bind(async_read_handler,
5192         _1, _2, sizeof(read_data), &called));
5193   ioc.restart();
5194   ioc.run();
5195   BOOST_ASIO_CHECK(called);
5196   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
5197 
5198   s.reset(read_data, sizeof(read_data));
5199   s.next_read_length(1);
5200   memset(read_buf, 0, sizeof(read_buf));
5201   called = false;
5202   boost::asio::async_read_at(s, 0, buffers, old_style_transfer_all,
5203       bindns::bind(async_read_handler,
5204         _1, _2, sizeof(read_data), &called));
5205   ioc.restart();
5206   ioc.run();
5207   BOOST_ASIO_CHECK(called);
5208   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
5209 
5210   s.reset(read_data, sizeof(read_data));
5211   s.next_read_length(1);
5212   memset(read_buf, 0, sizeof(read_buf));
5213   called = false;
5214   boost::asio::async_read_at(s, 1234, buffers, old_style_transfer_all,
5215       bindns::bind(async_read_handler,
5216         _1, _2, sizeof(read_data), &called));
5217   ioc.restart();
5218   ioc.run();
5219   BOOST_ASIO_CHECK(called);
5220   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
5221 
5222   s.reset(read_data, sizeof(read_data));
5223   s.next_read_length(10);
5224   memset(read_buf, 0, sizeof(read_buf));
5225   called = false;
5226   boost::asio::async_read_at(s, 0, buffers, old_style_transfer_all,
5227       bindns::bind(async_read_handler,
5228         _1, _2, sizeof(read_data), &called));
5229   ioc.restart();
5230   ioc.run();
5231   BOOST_ASIO_CHECK(called);
5232   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
5233 
5234   s.reset(read_data, sizeof(read_data));
5235   s.next_read_length(10);
5236   memset(read_buf, 0, sizeof(read_buf));
5237   called = false;
5238   boost::asio::async_read_at(s, 1234, buffers, old_style_transfer_all,
5239       bindns::bind(async_read_handler,
5240         _1, _2, sizeof(read_data), &called));
5241   ioc.restart();
5242   ioc.run();
5243   BOOST_ASIO_CHECK(called);
5244   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
5245 
5246   s.reset(read_data, sizeof(read_data));
5247   memset(read_buf, 0, sizeof(read_buf));
5248   called = false;
5249   boost::asio::async_read_at(s, 0, buffers, short_transfer(),
5250       bindns::bind(async_read_handler,
5251         _1, _2, sizeof(read_data), &called));
5252   ioc.restart();
5253   ioc.run();
5254   BOOST_ASIO_CHECK(called);
5255   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
5256 
5257   s.reset(read_data, sizeof(read_data));
5258   memset(read_buf, 0, sizeof(read_buf));
5259   called = false;
5260   boost::asio::async_read_at(s, 1234, buffers, short_transfer(),
5261       bindns::bind(async_read_handler,
5262         _1, _2, sizeof(read_data), &called));
5263   ioc.restart();
5264   ioc.run();
5265   BOOST_ASIO_CHECK(called);
5266   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
5267 
5268   s.reset(read_data, sizeof(read_data));
5269   s.next_read_length(1);
5270   memset(read_buf, 0, sizeof(read_buf));
5271   called = false;
5272   boost::asio::async_read_at(s, 0, buffers, short_transfer(),
5273       bindns::bind(async_read_handler,
5274         _1, _2, sizeof(read_data), &called));
5275   ioc.restart();
5276   ioc.run();
5277   BOOST_ASIO_CHECK(called);
5278   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
5279 
5280   s.reset(read_data, sizeof(read_data));
5281   s.next_read_length(1);
5282   memset(read_buf, 0, sizeof(read_buf));
5283   called = false;
5284   boost::asio::async_read_at(s, 1234, buffers, short_transfer(),
5285       bindns::bind(async_read_handler,
5286         _1, _2, sizeof(read_data), &called));
5287   ioc.restart();
5288   ioc.run();
5289   BOOST_ASIO_CHECK(called);
5290   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
5291 
5292   s.reset(read_data, sizeof(read_data));
5293   s.next_read_length(10);
5294   memset(read_buf, 0, sizeof(read_buf));
5295   called = false;
5296   boost::asio::async_read_at(s, 0, buffers, short_transfer(),
5297       bindns::bind(async_read_handler,
5298         _1, _2, sizeof(read_data), &called));
5299   ioc.restart();
5300   ioc.run();
5301   BOOST_ASIO_CHECK(called);
5302   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
5303 
5304   s.reset(read_data, sizeof(read_data));
5305   s.next_read_length(10);
5306   memset(read_buf, 0, sizeof(read_buf));
5307   called = false;
5308   boost::asio::async_read_at(s, 1234, buffers, short_transfer(),
5309       bindns::bind(async_read_handler,
5310         _1, _2, sizeof(read_data), &called));
5311   ioc.restart();
5312   ioc.run();
5313   BOOST_ASIO_CHECK(called);
5314   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
5315 
5316   s.reset(read_data, sizeof(read_data));
5317   memset(read_buf, 0, sizeof(read_buf));
5318   int i = boost::asio::async_read_at(s, 1234, buffers,
5319       short_transfer(), archetypes::lazy_handler());
5320   BOOST_ASIO_CHECK(i == 42);
5321   ioc.restart();
5322   ioc.run();
5323   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
5324 #endif // defined(BOOST_ASIO_HAS_BOOST_ARRAY)
5325 }
5326 
test_5_arg_std_array_buffers_async_read_at()5327 void test_5_arg_std_array_buffers_async_read_at()
5328 {
5329 #if defined(BOOST_ASIO_HAS_BOOST_BIND)
5330   namespace bindns = boost;
5331 #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
5332   namespace bindns = std;
5333   using std::placeholders::_1;
5334   using std::placeholders::_2;
5335 #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
5336 
5337 #if defined(BOOST_ASIO_HAS_STD_ARRAY)
5338   boost::asio::io_context ioc;
5339   test_random_access_device s(ioc);
5340   char read_buf[sizeof(read_data)];
5341   std::array<boost::asio::mutable_buffer, 2> buffers = { {
5342     boost::asio::buffer(read_buf, 32),
5343     boost::asio::buffer(read_buf) + 32 } };
5344 
5345   s.reset(read_data, sizeof(read_data));
5346   memset(read_buf, 0, sizeof(read_buf));
5347   bool called = false;
5348   boost::asio::async_read_at(s, 0, buffers,
5349       boost::asio::transfer_all(),
5350       bindns::bind(async_read_handler,
5351         _1, _2, sizeof(read_data), &called));
5352   ioc.restart();
5353   ioc.run();
5354   BOOST_ASIO_CHECK(called);
5355   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
5356 
5357   s.reset(read_data, sizeof(read_data));
5358   memset(read_buf, 0, sizeof(read_buf));
5359   called = false;
5360   boost::asio::async_read_at(s, 1234, buffers,
5361       boost::asio::transfer_all(),
5362       bindns::bind(async_read_handler,
5363         _1, _2, sizeof(read_data), &called));
5364   ioc.restart();
5365   ioc.run();
5366   BOOST_ASIO_CHECK(called);
5367   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
5368 
5369   s.reset(read_data, sizeof(read_data));
5370   s.next_read_length(1);
5371   memset(read_buf, 0, sizeof(read_buf));
5372   called = false;
5373   boost::asio::async_read_at(s, 0, buffers,
5374       boost::asio::transfer_all(),
5375       bindns::bind(async_read_handler,
5376         _1, _2, sizeof(read_data), &called));
5377   ioc.restart();
5378   ioc.run();
5379   BOOST_ASIO_CHECK(called);
5380   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
5381 
5382   s.reset(read_data, sizeof(read_data));
5383   s.next_read_length(1);
5384   memset(read_buf, 0, sizeof(read_buf));
5385   called = false;
5386   boost::asio::async_read_at(s, 1234, buffers,
5387       boost::asio::transfer_all(),
5388       bindns::bind(async_read_handler,
5389         _1, _2, sizeof(read_data), &called));
5390   ioc.restart();
5391   ioc.run();
5392   BOOST_ASIO_CHECK(called);
5393   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
5394 
5395   s.reset(read_data, sizeof(read_data));
5396   s.next_read_length(10);
5397   memset(read_buf, 0, sizeof(read_buf));
5398   called = false;
5399   boost::asio::async_read_at(s, 0, buffers,
5400       boost::asio::transfer_all(),
5401       bindns::bind(async_read_handler,
5402         _1, _2, sizeof(read_data), &called));
5403   ioc.restart();
5404   ioc.run();
5405   BOOST_ASIO_CHECK(called);
5406   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
5407 
5408   s.reset(read_data, sizeof(read_data));
5409   s.next_read_length(10);
5410   memset(read_buf, 0, sizeof(read_buf));
5411   called = false;
5412   boost::asio::async_read_at(s, 1234, buffers,
5413       boost::asio::transfer_all(),
5414       bindns::bind(async_read_handler,
5415         _1, _2, sizeof(read_data), &called));
5416   ioc.restart();
5417   ioc.run();
5418   BOOST_ASIO_CHECK(called);
5419   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
5420 
5421   s.reset(read_data, sizeof(read_data));
5422   memset(read_buf, 0, sizeof(read_buf));
5423   called = false;
5424   boost::asio::async_read_at(s, 0, buffers,
5425       boost::asio::transfer_at_least(1),
5426       bindns::bind(async_read_handler,
5427         _1, _2, sizeof(read_data), &called));
5428   ioc.restart();
5429   ioc.run();
5430   BOOST_ASIO_CHECK(called);
5431   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
5432 
5433   s.reset(read_data, sizeof(read_data));
5434   memset(read_buf, 0, sizeof(read_buf));
5435   called = false;
5436   boost::asio::async_read_at(s, 1234, buffers,
5437       boost::asio::transfer_at_least(1),
5438       bindns::bind(async_read_handler,
5439         _1, _2, sizeof(read_data), &called));
5440   ioc.restart();
5441   ioc.run();
5442   BOOST_ASIO_CHECK(called);
5443   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
5444 
5445   s.reset(read_data, sizeof(read_data));
5446   s.next_read_length(1);
5447   memset(read_buf, 0, sizeof(read_buf));
5448   called = false;
5449   boost::asio::async_read_at(s, 0, buffers,
5450       boost::asio::transfer_at_least(1),
5451       bindns::bind(async_read_handler,
5452         _1, _2, 1, &called));
5453   ioc.restart();
5454   ioc.run();
5455   BOOST_ASIO_CHECK(called);
5456   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
5457 
5458   s.reset(read_data, sizeof(read_data));
5459   s.next_read_length(1);
5460   memset(read_buf, 0, sizeof(read_buf));
5461   called = false;
5462   boost::asio::async_read_at(s, 1234, buffers,
5463       boost::asio::transfer_at_least(1),
5464       bindns::bind(async_read_handler,
5465         _1, _2, 1, &called));
5466   ioc.restart();
5467   ioc.run();
5468   BOOST_ASIO_CHECK(called);
5469   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
5470 
5471   s.reset(read_data, sizeof(read_data));
5472   s.next_read_length(10);
5473   memset(read_buf, 0, sizeof(read_buf));
5474   called = false;
5475   boost::asio::async_read_at(s, 0, buffers,
5476       boost::asio::transfer_at_least(1),
5477       bindns::bind(async_read_handler,
5478         _1, _2, 10, &called));
5479   ioc.restart();
5480   ioc.run();
5481   BOOST_ASIO_CHECK(called);
5482   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
5483 
5484   s.reset(read_data, sizeof(read_data));
5485   s.next_read_length(10);
5486   memset(read_buf, 0, sizeof(read_buf));
5487   called = false;
5488   boost::asio::async_read_at(s, 1234, buffers,
5489       boost::asio::transfer_at_least(1),
5490       bindns::bind(async_read_handler,
5491         _1, _2, 10, &called));
5492   ioc.restart();
5493   ioc.run();
5494   BOOST_ASIO_CHECK(called);
5495   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
5496 
5497   s.reset(read_data, sizeof(read_data));
5498   memset(read_buf, 0, sizeof(read_buf));
5499   called = false;
5500   boost::asio::async_read_at(s, 0, buffers,
5501       boost::asio::transfer_at_least(10),
5502       bindns::bind(async_read_handler,
5503         _1, _2, sizeof(read_data), &called));
5504   ioc.restart();
5505   ioc.run();
5506   BOOST_ASIO_CHECK(called);
5507   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
5508 
5509   s.reset(read_data, sizeof(read_data));
5510   memset(read_buf, 0, sizeof(read_buf));
5511   called = false;
5512   boost::asio::async_read_at(s, 1234, buffers,
5513       boost::asio::transfer_at_least(10),
5514       bindns::bind(async_read_handler,
5515         _1, _2, sizeof(read_data), &called));
5516   ioc.restart();
5517   ioc.run();
5518   BOOST_ASIO_CHECK(called);
5519   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
5520 
5521   s.reset(read_data, sizeof(read_data));
5522   s.next_read_length(1);
5523   memset(read_buf, 0, sizeof(read_buf));
5524   called = false;
5525   boost::asio::async_read_at(s, 0, buffers,
5526       boost::asio::transfer_at_least(10),
5527       bindns::bind(async_read_handler,
5528         _1, _2, 10, &called));
5529   ioc.restart();
5530   ioc.run();
5531   BOOST_ASIO_CHECK(called);
5532   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
5533 
5534   s.reset(read_data, sizeof(read_data));
5535   s.next_read_length(1);
5536   memset(read_buf, 0, sizeof(read_buf));
5537   called = false;
5538   boost::asio::async_read_at(s, 1234, buffers,
5539       boost::asio::transfer_at_least(10),
5540       bindns::bind(async_read_handler,
5541         _1, _2, 10, &called));
5542   ioc.restart();
5543   ioc.run();
5544   BOOST_ASIO_CHECK(called);
5545   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
5546 
5547   s.reset(read_data, sizeof(read_data));
5548   s.next_read_length(10);
5549   memset(read_buf, 0, sizeof(read_buf));
5550   called = false;
5551   boost::asio::async_read_at(s, 0, buffers,
5552       boost::asio::transfer_at_least(10),
5553       bindns::bind(async_read_handler,
5554         _1, _2, 10, &called));
5555   ioc.restart();
5556   ioc.run();
5557   BOOST_ASIO_CHECK(called);
5558   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
5559 
5560   s.reset(read_data, sizeof(read_data));
5561   s.next_read_length(10);
5562   memset(read_buf, 0, sizeof(read_buf));
5563   called = false;
5564   boost::asio::async_read_at(s, 1234, buffers,
5565       boost::asio::transfer_at_least(10),
5566       bindns::bind(async_read_handler,
5567         _1, _2, 10, &called));
5568   ioc.restart();
5569   ioc.run();
5570   BOOST_ASIO_CHECK(called);
5571   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
5572 
5573   s.reset(read_data, sizeof(read_data));
5574   memset(read_buf, 0, sizeof(read_buf));
5575   called = false;
5576   boost::asio::async_read_at(s, 0, buffers,
5577       boost::asio::transfer_at_least(42),
5578       bindns::bind(async_read_handler,
5579         _1, _2, sizeof(read_data), &called));
5580   ioc.restart();
5581   ioc.run();
5582   BOOST_ASIO_CHECK(called);
5583   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
5584 
5585   s.reset(read_data, sizeof(read_data));
5586   memset(read_buf, 0, sizeof(read_buf));
5587   called = false;
5588   boost::asio::async_read_at(s, 1234, buffers,
5589       boost::asio::transfer_at_least(42),
5590       bindns::bind(async_read_handler,
5591         _1, _2, sizeof(read_data), &called));
5592   ioc.restart();
5593   ioc.run();
5594   BOOST_ASIO_CHECK(called);
5595   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
5596 
5597   s.reset(read_data, sizeof(read_data));
5598   s.next_read_length(1);
5599   memset(read_buf, 0, sizeof(read_buf));
5600   called = false;
5601   boost::asio::async_read_at(s, 0, buffers,
5602       boost::asio::transfer_at_least(42),
5603       bindns::bind(async_read_handler,
5604         _1, _2, 42, &called));
5605   ioc.restart();
5606   ioc.run();
5607   BOOST_ASIO_CHECK(called);
5608   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
5609 
5610   s.reset(read_data, sizeof(read_data));
5611   s.next_read_length(1);
5612   memset(read_buf, 0, sizeof(read_buf));
5613   called = false;
5614   boost::asio::async_read_at(s, 1234, buffers,
5615       boost::asio::transfer_at_least(42),
5616       bindns::bind(async_read_handler,
5617         _1, _2, 42, &called));
5618   ioc.restart();
5619   ioc.run();
5620   BOOST_ASIO_CHECK(called);
5621   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
5622 
5623   s.reset(read_data, sizeof(read_data));
5624   s.next_read_length(10);
5625   memset(read_buf, 0, sizeof(read_buf));
5626   called = false;
5627   boost::asio::async_read_at(s, 0, buffers,
5628       boost::asio::transfer_at_least(42),
5629       bindns::bind(async_read_handler,
5630         _1, _2, 50, &called));
5631   ioc.restart();
5632   ioc.run();
5633   BOOST_ASIO_CHECK(called);
5634   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 50));
5635 
5636   s.reset(read_data, sizeof(read_data));
5637   s.next_read_length(10);
5638   memset(read_buf, 0, sizeof(read_buf));
5639   called = false;
5640   boost::asio::async_read_at(s, 1234, buffers,
5641       boost::asio::transfer_at_least(42),
5642       bindns::bind(async_read_handler,
5643         _1, _2, 50, &called));
5644   ioc.restart();
5645   ioc.run();
5646   BOOST_ASIO_CHECK(called);
5647   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 50));
5648 
5649   s.reset(read_data, sizeof(read_data));
5650   memset(read_buf, 0, sizeof(read_buf));
5651   called = false;
5652   boost::asio::async_read_at(s, 0, buffers,
5653       boost::asio::transfer_exactly(1),
5654       bindns::bind(async_read_handler,
5655         _1, _2, 1, &called));
5656   ioc.restart();
5657   ioc.run();
5658   BOOST_ASIO_CHECK(called);
5659   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
5660 
5661   s.reset(read_data, sizeof(read_data));
5662   memset(read_buf, 0, sizeof(read_buf));
5663   called = false;
5664   boost::asio::async_read_at(s, 1234, buffers,
5665       boost::asio::transfer_exactly(1),
5666       bindns::bind(async_read_handler,
5667         _1, _2, 1, &called));
5668   ioc.restart();
5669   ioc.run();
5670   BOOST_ASIO_CHECK(called);
5671   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
5672 
5673   s.reset(read_data, sizeof(read_data));
5674   s.next_read_length(1);
5675   memset(read_buf, 0, sizeof(read_buf));
5676   called = false;
5677   boost::asio::async_read_at(s, 0, buffers,
5678       boost::asio::transfer_exactly(1),
5679       bindns::bind(async_read_handler,
5680         _1, _2, 1, &called));
5681   ioc.restart();
5682   ioc.run();
5683   BOOST_ASIO_CHECK(called);
5684   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
5685 
5686   s.reset(read_data, sizeof(read_data));
5687   s.next_read_length(1);
5688   memset(read_buf, 0, sizeof(read_buf));
5689   called = false;
5690   boost::asio::async_read_at(s, 1234, buffers,
5691       boost::asio::transfer_exactly(1),
5692       bindns::bind(async_read_handler,
5693         _1, _2, 1, &called));
5694   ioc.restart();
5695   ioc.run();
5696   BOOST_ASIO_CHECK(called);
5697   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
5698 
5699   s.reset(read_data, sizeof(read_data));
5700   s.next_read_length(10);
5701   memset(read_buf, 0, sizeof(read_buf));
5702   called = false;
5703   boost::asio::async_read_at(s, 0, buffers,
5704       boost::asio::transfer_exactly(1),
5705       bindns::bind(async_read_handler,
5706         _1, _2, 1, &called));
5707   ioc.restart();
5708   ioc.run();
5709   BOOST_ASIO_CHECK(called);
5710   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
5711 
5712   s.reset(read_data, sizeof(read_data));
5713   s.next_read_length(10);
5714   memset(read_buf, 0, sizeof(read_buf));
5715   called = false;
5716   boost::asio::async_read_at(s, 1234, buffers,
5717       boost::asio::transfer_exactly(1),
5718       bindns::bind(async_read_handler,
5719         _1, _2, 1, &called));
5720   ioc.restart();
5721   ioc.run();
5722   BOOST_ASIO_CHECK(called);
5723   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
5724 
5725   s.reset(read_data, sizeof(read_data));
5726   memset(read_buf, 0, sizeof(read_buf));
5727   called = false;
5728   boost::asio::async_read_at(s, 0, buffers,
5729       boost::asio::transfer_exactly(10),
5730       bindns::bind(async_read_handler,
5731         _1, _2, 10, &called));
5732   ioc.restart();
5733   ioc.run();
5734   BOOST_ASIO_CHECK(called);
5735   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
5736 
5737   s.reset(read_data, sizeof(read_data));
5738   memset(read_buf, 0, sizeof(read_buf));
5739   called = false;
5740   boost::asio::async_read_at(s, 1234, buffers,
5741       boost::asio::transfer_exactly(10),
5742       bindns::bind(async_read_handler,
5743         _1, _2, 10, &called));
5744   ioc.restart();
5745   ioc.run();
5746   BOOST_ASIO_CHECK(called);
5747   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
5748 
5749   s.reset(read_data, sizeof(read_data));
5750   s.next_read_length(1);
5751   memset(read_buf, 0, sizeof(read_buf));
5752   called = false;
5753   boost::asio::async_read_at(s, 0, buffers,
5754       boost::asio::transfer_exactly(10),
5755       bindns::bind(async_read_handler,
5756         _1, _2, 10, &called));
5757   ioc.restart();
5758   ioc.run();
5759   BOOST_ASIO_CHECK(called);
5760   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
5761 
5762   s.reset(read_data, sizeof(read_data));
5763   s.next_read_length(1);
5764   memset(read_buf, 0, sizeof(read_buf));
5765   called = false;
5766   boost::asio::async_read_at(s, 1234, buffers,
5767       boost::asio::transfer_exactly(10),
5768       bindns::bind(async_read_handler,
5769         _1, _2, 10, &called));
5770   ioc.restart();
5771   ioc.run();
5772   BOOST_ASIO_CHECK(called);
5773   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
5774 
5775   s.reset(read_data, sizeof(read_data));
5776   s.next_read_length(10);
5777   memset(read_buf, 0, sizeof(read_buf));
5778   called = false;
5779   boost::asio::async_read_at(s, 0, buffers,
5780       boost::asio::transfer_exactly(10),
5781       bindns::bind(async_read_handler,
5782         _1, _2, 10, &called));
5783   ioc.restart();
5784   ioc.run();
5785   BOOST_ASIO_CHECK(called);
5786   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
5787 
5788   s.reset(read_data, sizeof(read_data));
5789   s.next_read_length(10);
5790   memset(read_buf, 0, sizeof(read_buf));
5791   called = false;
5792   boost::asio::async_read_at(s, 1234, buffers,
5793       boost::asio::transfer_exactly(10),
5794       bindns::bind(async_read_handler,
5795         _1, _2, 10, &called));
5796   ioc.restart();
5797   ioc.run();
5798   BOOST_ASIO_CHECK(called);
5799   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
5800 
5801   s.reset(read_data, sizeof(read_data));
5802   memset(read_buf, 0, sizeof(read_buf));
5803   called = false;
5804   boost::asio::async_read_at(s, 0, buffers,
5805       boost::asio::transfer_exactly(42),
5806       bindns::bind(async_read_handler,
5807         _1, _2, 42, &called));
5808   ioc.restart();
5809   ioc.run();
5810   BOOST_ASIO_CHECK(called);
5811   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
5812 
5813   s.reset(read_data, sizeof(read_data));
5814   memset(read_buf, 0, sizeof(read_buf));
5815   called = false;
5816   boost::asio::async_read_at(s, 1234, buffers,
5817       boost::asio::transfer_exactly(42),
5818       bindns::bind(async_read_handler,
5819         _1, _2, 42, &called));
5820   ioc.restart();
5821   ioc.run();
5822   BOOST_ASIO_CHECK(called);
5823   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
5824 
5825   s.reset(read_data, sizeof(read_data));
5826   s.next_read_length(1);
5827   memset(read_buf, 0, sizeof(read_buf));
5828   called = false;
5829   boost::asio::async_read_at(s, 0, buffers,
5830       boost::asio::transfer_exactly(42),
5831       bindns::bind(async_read_handler,
5832         _1, _2, 42, &called));
5833   ioc.restart();
5834   ioc.run();
5835   BOOST_ASIO_CHECK(called);
5836   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
5837 
5838   s.reset(read_data, sizeof(read_data));
5839   s.next_read_length(1);
5840   memset(read_buf, 0, sizeof(read_buf));
5841   called = false;
5842   boost::asio::async_read_at(s, 1234, buffers,
5843       boost::asio::transfer_exactly(42),
5844       bindns::bind(async_read_handler,
5845         _1, _2, 42, &called));
5846   ioc.restart();
5847   ioc.run();
5848   BOOST_ASIO_CHECK(called);
5849   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
5850 
5851   s.reset(read_data, sizeof(read_data));
5852   s.next_read_length(10);
5853   memset(read_buf, 0, sizeof(read_buf));
5854   called = false;
5855   boost::asio::async_read_at(s, 0, buffers,
5856       boost::asio::transfer_exactly(42),
5857       bindns::bind(async_read_handler,
5858         _1, _2, 42, &called));
5859   ioc.restart();
5860   ioc.run();
5861   BOOST_ASIO_CHECK(called);
5862   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
5863 
5864   s.reset(read_data, sizeof(read_data));
5865   s.next_read_length(10);
5866   memset(read_buf, 0, sizeof(read_buf));
5867   called = false;
5868   boost::asio::async_read_at(s, 1234, buffers,
5869       boost::asio::transfer_exactly(42),
5870       bindns::bind(async_read_handler,
5871         _1, _2, 42, &called));
5872   ioc.restart();
5873   ioc.run();
5874   BOOST_ASIO_CHECK(called);
5875   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
5876 
5877   s.reset(read_data, sizeof(read_data));
5878   memset(read_buf, 0, sizeof(read_buf));
5879   called = false;
5880   boost::asio::async_read_at(s, 0, buffers, old_style_transfer_all,
5881       bindns::bind(async_read_handler,
5882         _1, _2, sizeof(read_data), &called));
5883   ioc.restart();
5884   ioc.run();
5885   BOOST_ASIO_CHECK(called);
5886   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
5887 
5888   s.reset(read_data, sizeof(read_data));
5889   memset(read_buf, 0, sizeof(read_buf));
5890   called = false;
5891   boost::asio::async_read_at(s, 1234, buffers, old_style_transfer_all,
5892       bindns::bind(async_read_handler,
5893         _1, _2, sizeof(read_data), &called));
5894   ioc.restart();
5895   ioc.run();
5896   BOOST_ASIO_CHECK(called);
5897   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
5898 
5899   s.reset(read_data, sizeof(read_data));
5900   s.next_read_length(1);
5901   memset(read_buf, 0, sizeof(read_buf));
5902   called = false;
5903   boost::asio::async_read_at(s, 0, buffers, old_style_transfer_all,
5904       bindns::bind(async_read_handler,
5905         _1, _2, sizeof(read_data), &called));
5906   ioc.restart();
5907   ioc.run();
5908   BOOST_ASIO_CHECK(called);
5909   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
5910 
5911   s.reset(read_data, sizeof(read_data));
5912   s.next_read_length(1);
5913   memset(read_buf, 0, sizeof(read_buf));
5914   called = false;
5915   boost::asio::async_read_at(s, 1234, buffers, old_style_transfer_all,
5916       bindns::bind(async_read_handler,
5917         _1, _2, sizeof(read_data), &called));
5918   ioc.restart();
5919   ioc.run();
5920   BOOST_ASIO_CHECK(called);
5921   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
5922 
5923   s.reset(read_data, sizeof(read_data));
5924   s.next_read_length(10);
5925   memset(read_buf, 0, sizeof(read_buf));
5926   called = false;
5927   boost::asio::async_read_at(s, 0, buffers, old_style_transfer_all,
5928       bindns::bind(async_read_handler,
5929         _1, _2, sizeof(read_data), &called));
5930   ioc.restart();
5931   ioc.run();
5932   BOOST_ASIO_CHECK(called);
5933   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
5934 
5935   s.reset(read_data, sizeof(read_data));
5936   s.next_read_length(10);
5937   memset(read_buf, 0, sizeof(read_buf));
5938   called = false;
5939   boost::asio::async_read_at(s, 1234, buffers, old_style_transfer_all,
5940       bindns::bind(async_read_handler,
5941         _1, _2, sizeof(read_data), &called));
5942   ioc.restart();
5943   ioc.run();
5944   BOOST_ASIO_CHECK(called);
5945   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
5946 
5947   s.reset(read_data, sizeof(read_data));
5948   memset(read_buf, 0, sizeof(read_buf));
5949   called = false;
5950   boost::asio::async_read_at(s, 0, buffers, short_transfer(),
5951       bindns::bind(async_read_handler,
5952         _1, _2, sizeof(read_data), &called));
5953   ioc.restart();
5954   ioc.run();
5955   BOOST_ASIO_CHECK(called);
5956   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
5957 
5958   s.reset(read_data, sizeof(read_data));
5959   memset(read_buf, 0, sizeof(read_buf));
5960   called = false;
5961   boost::asio::async_read_at(s, 1234, buffers, short_transfer(),
5962       bindns::bind(async_read_handler,
5963         _1, _2, sizeof(read_data), &called));
5964   ioc.restart();
5965   ioc.run();
5966   BOOST_ASIO_CHECK(called);
5967   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
5968 
5969   s.reset(read_data, sizeof(read_data));
5970   s.next_read_length(1);
5971   memset(read_buf, 0, sizeof(read_buf));
5972   called = false;
5973   boost::asio::async_read_at(s, 0, buffers, short_transfer(),
5974       bindns::bind(async_read_handler,
5975         _1, _2, sizeof(read_data), &called));
5976   ioc.restart();
5977   ioc.run();
5978   BOOST_ASIO_CHECK(called);
5979   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
5980 
5981   s.reset(read_data, sizeof(read_data));
5982   s.next_read_length(1);
5983   memset(read_buf, 0, sizeof(read_buf));
5984   called = false;
5985   boost::asio::async_read_at(s, 1234, buffers, short_transfer(),
5986       bindns::bind(async_read_handler,
5987         _1, _2, sizeof(read_data), &called));
5988   ioc.restart();
5989   ioc.run();
5990   BOOST_ASIO_CHECK(called);
5991   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
5992 
5993   s.reset(read_data, sizeof(read_data));
5994   s.next_read_length(10);
5995   memset(read_buf, 0, sizeof(read_buf));
5996   called = false;
5997   boost::asio::async_read_at(s, 0, buffers, short_transfer(),
5998       bindns::bind(async_read_handler,
5999         _1, _2, sizeof(read_data), &called));
6000   ioc.restart();
6001   ioc.run();
6002   BOOST_ASIO_CHECK(called);
6003   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
6004 
6005   s.reset(read_data, sizeof(read_data));
6006   s.next_read_length(10);
6007   memset(read_buf, 0, sizeof(read_buf));
6008   called = false;
6009   boost::asio::async_read_at(s, 1234, buffers, short_transfer(),
6010       bindns::bind(async_read_handler,
6011         _1, _2, sizeof(read_data), &called));
6012   ioc.restart();
6013   ioc.run();
6014   BOOST_ASIO_CHECK(called);
6015   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
6016 
6017   s.reset(read_data, sizeof(read_data));
6018   memset(read_buf, 0, sizeof(read_buf));
6019   int i = boost::asio::async_read_at(s, 1234, buffers,
6020       short_transfer(), archetypes::lazy_handler());
6021   BOOST_ASIO_CHECK(i == 42);
6022   ioc.restart();
6023   ioc.run();
6024   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
6025 #endif // defined(BOOST_ASIO_HAS_STD_ARRAY)
6026 }
6027 
test_5_arg_vector_buffers_async_read_at()6028 void test_5_arg_vector_buffers_async_read_at()
6029 {
6030 #if defined(BOOST_ASIO_HAS_BOOST_BIND)
6031   namespace bindns = boost;
6032 #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
6033   namespace bindns = std;
6034   using std::placeholders::_1;
6035   using std::placeholders::_2;
6036 #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
6037 
6038   boost::asio::io_context ioc;
6039   test_random_access_device s(ioc);
6040   char read_buf[sizeof(read_data)];
6041   std::vector<boost::asio::mutable_buffer> buffers;
6042   buffers.push_back(boost::asio::buffer(read_buf, 32));
6043   buffers.push_back(boost::asio::buffer(read_buf) + 32);
6044 
6045   s.reset(read_data, sizeof(read_data));
6046   memset(read_buf, 0, sizeof(read_buf));
6047   bool called = false;
6048   boost::asio::async_read_at(s, 0, buffers,
6049       boost::asio::transfer_all(),
6050       bindns::bind(async_read_handler,
6051         _1, _2, sizeof(read_data), &called));
6052   ioc.restart();
6053   ioc.run();
6054   BOOST_ASIO_CHECK(called);
6055   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
6056 
6057   s.reset(read_data, sizeof(read_data));
6058   memset(read_buf, 0, sizeof(read_buf));
6059   called = false;
6060   boost::asio::async_read_at(s, 1234, buffers,
6061       boost::asio::transfer_all(),
6062       bindns::bind(async_read_handler,
6063         _1, _2, sizeof(read_data), &called));
6064   ioc.restart();
6065   ioc.run();
6066   BOOST_ASIO_CHECK(called);
6067   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
6068 
6069   s.reset(read_data, sizeof(read_data));
6070   s.next_read_length(1);
6071   memset(read_buf, 0, sizeof(read_buf));
6072   called = false;
6073   boost::asio::async_read_at(s, 0, buffers,
6074       boost::asio::transfer_all(),
6075       bindns::bind(async_read_handler,
6076         _1, _2, sizeof(read_data), &called));
6077   ioc.restart();
6078   ioc.run();
6079   BOOST_ASIO_CHECK(called);
6080   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
6081 
6082   s.reset(read_data, sizeof(read_data));
6083   s.next_read_length(1);
6084   memset(read_buf, 0, sizeof(read_buf));
6085   called = false;
6086   boost::asio::async_read_at(s, 1234, buffers,
6087       boost::asio::transfer_all(),
6088       bindns::bind(async_read_handler,
6089         _1, _2, sizeof(read_data), &called));
6090   ioc.restart();
6091   ioc.run();
6092   BOOST_ASIO_CHECK(called);
6093   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
6094 
6095   s.reset(read_data, sizeof(read_data));
6096   s.next_read_length(10);
6097   memset(read_buf, 0, sizeof(read_buf));
6098   called = false;
6099   boost::asio::async_read_at(s, 0, buffers,
6100       boost::asio::transfer_all(),
6101       bindns::bind(async_read_handler,
6102         _1, _2, sizeof(read_data), &called));
6103   ioc.restart();
6104   ioc.run();
6105   BOOST_ASIO_CHECK(called);
6106   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
6107 
6108   s.reset(read_data, sizeof(read_data));
6109   s.next_read_length(10);
6110   memset(read_buf, 0, sizeof(read_buf));
6111   called = false;
6112   boost::asio::async_read_at(s, 1234, buffers,
6113       boost::asio::transfer_all(),
6114       bindns::bind(async_read_handler,
6115         _1, _2, sizeof(read_data), &called));
6116   ioc.restart();
6117   ioc.run();
6118   BOOST_ASIO_CHECK(called);
6119   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
6120 
6121   s.reset(read_data, sizeof(read_data));
6122   memset(read_buf, 0, sizeof(read_buf));
6123   called = false;
6124   boost::asio::async_read_at(s, 0, buffers,
6125       boost::asio::transfer_at_least(1),
6126       bindns::bind(async_read_handler,
6127         _1, _2, sizeof(read_data), &called));
6128   ioc.restart();
6129   ioc.run();
6130   BOOST_ASIO_CHECK(called);
6131   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
6132 
6133   s.reset(read_data, sizeof(read_data));
6134   memset(read_buf, 0, sizeof(read_buf));
6135   called = false;
6136   boost::asio::async_read_at(s, 1234, buffers,
6137       boost::asio::transfer_at_least(1),
6138       bindns::bind(async_read_handler,
6139         _1, _2, sizeof(read_data), &called));
6140   ioc.restart();
6141   ioc.run();
6142   BOOST_ASIO_CHECK(called);
6143   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
6144 
6145   s.reset(read_data, sizeof(read_data));
6146   s.next_read_length(1);
6147   memset(read_buf, 0, sizeof(read_buf));
6148   called = false;
6149   boost::asio::async_read_at(s, 0, buffers,
6150       boost::asio::transfer_at_least(1),
6151       bindns::bind(async_read_handler,
6152         _1, _2, 1, &called));
6153   ioc.restart();
6154   ioc.run();
6155   BOOST_ASIO_CHECK(called);
6156   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
6157 
6158   s.reset(read_data, sizeof(read_data));
6159   s.next_read_length(1);
6160   memset(read_buf, 0, sizeof(read_buf));
6161   called = false;
6162   boost::asio::async_read_at(s, 1234, buffers,
6163       boost::asio::transfer_at_least(1),
6164       bindns::bind(async_read_handler,
6165         _1, _2, 1, &called));
6166   ioc.restart();
6167   ioc.run();
6168   BOOST_ASIO_CHECK(called);
6169   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
6170 
6171   s.reset(read_data, sizeof(read_data));
6172   s.next_read_length(10);
6173   memset(read_buf, 0, sizeof(read_buf));
6174   called = false;
6175   boost::asio::async_read_at(s, 0, buffers,
6176       boost::asio::transfer_at_least(1),
6177       bindns::bind(async_read_handler,
6178         _1, _2, 10, &called));
6179   ioc.restart();
6180   ioc.run();
6181   BOOST_ASIO_CHECK(called);
6182   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
6183 
6184   s.reset(read_data, sizeof(read_data));
6185   s.next_read_length(10);
6186   memset(read_buf, 0, sizeof(read_buf));
6187   called = false;
6188   boost::asio::async_read_at(s, 1234, buffers,
6189       boost::asio::transfer_at_least(1),
6190       bindns::bind(async_read_handler,
6191         _1, _2, 10, &called));
6192   ioc.restart();
6193   ioc.run();
6194   BOOST_ASIO_CHECK(called);
6195   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
6196 
6197   s.reset(read_data, sizeof(read_data));
6198   memset(read_buf, 0, sizeof(read_buf));
6199   called = false;
6200   boost::asio::async_read_at(s, 0, buffers,
6201       boost::asio::transfer_at_least(10),
6202       bindns::bind(async_read_handler,
6203         _1, _2, sizeof(read_data), &called));
6204   ioc.restart();
6205   ioc.run();
6206   BOOST_ASIO_CHECK(called);
6207   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
6208 
6209   s.reset(read_data, sizeof(read_data));
6210   memset(read_buf, 0, sizeof(read_buf));
6211   called = false;
6212   boost::asio::async_read_at(s, 1234, buffers,
6213       boost::asio::transfer_at_least(10),
6214       bindns::bind(async_read_handler,
6215         _1, _2, sizeof(read_data), &called));
6216   ioc.restart();
6217   ioc.run();
6218   BOOST_ASIO_CHECK(called);
6219   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
6220 
6221   s.reset(read_data, sizeof(read_data));
6222   s.next_read_length(1);
6223   memset(read_buf, 0, sizeof(read_buf));
6224   called = false;
6225   boost::asio::async_read_at(s, 0, buffers,
6226       boost::asio::transfer_at_least(10),
6227       bindns::bind(async_read_handler,
6228         _1, _2, 10, &called));
6229   ioc.restart();
6230   ioc.run();
6231   BOOST_ASIO_CHECK(called);
6232   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
6233 
6234   s.reset(read_data, sizeof(read_data));
6235   s.next_read_length(1);
6236   memset(read_buf, 0, sizeof(read_buf));
6237   called = false;
6238   boost::asio::async_read_at(s, 1234, buffers,
6239       boost::asio::transfer_at_least(10),
6240       bindns::bind(async_read_handler,
6241         _1, _2, 10, &called));
6242   ioc.restart();
6243   ioc.run();
6244   BOOST_ASIO_CHECK(called);
6245   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
6246 
6247   s.reset(read_data, sizeof(read_data));
6248   s.next_read_length(10);
6249   memset(read_buf, 0, sizeof(read_buf));
6250   called = false;
6251   boost::asio::async_read_at(s, 0, buffers,
6252       boost::asio::transfer_at_least(10),
6253       bindns::bind(async_read_handler,
6254         _1, _2, 10, &called));
6255   ioc.restart();
6256   ioc.run();
6257   BOOST_ASIO_CHECK(called);
6258   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
6259 
6260   s.reset(read_data, sizeof(read_data));
6261   s.next_read_length(10);
6262   memset(read_buf, 0, sizeof(read_buf));
6263   called = false;
6264   boost::asio::async_read_at(s, 1234, buffers,
6265       boost::asio::transfer_at_least(10),
6266       bindns::bind(async_read_handler,
6267         _1, _2, 10, &called));
6268   ioc.restart();
6269   ioc.run();
6270   BOOST_ASIO_CHECK(called);
6271   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
6272 
6273   s.reset(read_data, sizeof(read_data));
6274   memset(read_buf, 0, sizeof(read_buf));
6275   called = false;
6276   boost::asio::async_read_at(s, 0, buffers,
6277       boost::asio::transfer_at_least(42),
6278       bindns::bind(async_read_handler,
6279         _1, _2, sizeof(read_data), &called));
6280   ioc.restart();
6281   ioc.run();
6282   BOOST_ASIO_CHECK(called);
6283   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
6284 
6285   s.reset(read_data, sizeof(read_data));
6286   memset(read_buf, 0, sizeof(read_buf));
6287   called = false;
6288   boost::asio::async_read_at(s, 1234, buffers,
6289       boost::asio::transfer_at_least(42),
6290       bindns::bind(async_read_handler,
6291         _1, _2, sizeof(read_data), &called));
6292   ioc.restart();
6293   ioc.run();
6294   BOOST_ASIO_CHECK(called);
6295   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
6296 
6297   s.reset(read_data, sizeof(read_data));
6298   s.next_read_length(1);
6299   memset(read_buf, 0, sizeof(read_buf));
6300   called = false;
6301   boost::asio::async_read_at(s, 0, buffers,
6302       boost::asio::transfer_at_least(42),
6303       bindns::bind(async_read_handler,
6304         _1, _2, 42, &called));
6305   ioc.restart();
6306   ioc.run();
6307   BOOST_ASIO_CHECK(called);
6308   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
6309 
6310   s.reset(read_data, sizeof(read_data));
6311   s.next_read_length(1);
6312   memset(read_buf, 0, sizeof(read_buf));
6313   called = false;
6314   boost::asio::async_read_at(s, 1234, buffers,
6315       boost::asio::transfer_at_least(42),
6316       bindns::bind(async_read_handler,
6317         _1, _2, 42, &called));
6318   ioc.restart();
6319   ioc.run();
6320   BOOST_ASIO_CHECK(called);
6321   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
6322 
6323   s.reset(read_data, sizeof(read_data));
6324   s.next_read_length(10);
6325   memset(read_buf, 0, sizeof(read_buf));
6326   called = false;
6327   boost::asio::async_read_at(s, 0, buffers,
6328       boost::asio::transfer_at_least(42),
6329       bindns::bind(async_read_handler,
6330         _1, _2, 50, &called));
6331   ioc.restart();
6332   ioc.run();
6333   BOOST_ASIO_CHECK(called);
6334   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 50));
6335 
6336   s.reset(read_data, sizeof(read_data));
6337   s.next_read_length(10);
6338   memset(read_buf, 0, sizeof(read_buf));
6339   called = false;
6340   boost::asio::async_read_at(s, 1234, buffers,
6341       boost::asio::transfer_at_least(42),
6342       bindns::bind(async_read_handler,
6343         _1, _2, 50, &called));
6344   ioc.restart();
6345   ioc.run();
6346   BOOST_ASIO_CHECK(called);
6347   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 50));
6348 
6349   s.reset(read_data, sizeof(read_data));
6350   memset(read_buf, 0, sizeof(read_buf));
6351   called = false;
6352   boost::asio::async_read_at(s, 0, buffers,
6353       boost::asio::transfer_exactly(1),
6354       bindns::bind(async_read_handler,
6355         _1, _2, 1, &called));
6356   ioc.restart();
6357   ioc.run();
6358   BOOST_ASIO_CHECK(called);
6359   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
6360 
6361   s.reset(read_data, sizeof(read_data));
6362   memset(read_buf, 0, sizeof(read_buf));
6363   called = false;
6364   boost::asio::async_read_at(s, 1234, buffers,
6365       boost::asio::transfer_exactly(1),
6366       bindns::bind(async_read_handler,
6367         _1, _2, 1, &called));
6368   ioc.restart();
6369   ioc.run();
6370   BOOST_ASIO_CHECK(called);
6371   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
6372 
6373   s.reset(read_data, sizeof(read_data));
6374   s.next_read_length(1);
6375   memset(read_buf, 0, sizeof(read_buf));
6376   called = false;
6377   boost::asio::async_read_at(s, 0, buffers,
6378       boost::asio::transfer_exactly(1),
6379       bindns::bind(async_read_handler,
6380         _1, _2, 1, &called));
6381   ioc.restart();
6382   ioc.run();
6383   BOOST_ASIO_CHECK(called);
6384   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
6385 
6386   s.reset(read_data, sizeof(read_data));
6387   s.next_read_length(1);
6388   memset(read_buf, 0, sizeof(read_buf));
6389   called = false;
6390   boost::asio::async_read_at(s, 1234, buffers,
6391       boost::asio::transfer_exactly(1),
6392       bindns::bind(async_read_handler,
6393         _1, _2, 1, &called));
6394   ioc.restart();
6395   ioc.run();
6396   BOOST_ASIO_CHECK(called);
6397   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
6398 
6399   s.reset(read_data, sizeof(read_data));
6400   s.next_read_length(10);
6401   memset(read_buf, 0, sizeof(read_buf));
6402   called = false;
6403   boost::asio::async_read_at(s, 0, buffers,
6404       boost::asio::transfer_exactly(1),
6405       bindns::bind(async_read_handler,
6406         _1, _2, 1, &called));
6407   ioc.restart();
6408   ioc.run();
6409   BOOST_ASIO_CHECK(called);
6410   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 1));
6411 
6412   s.reset(read_data, sizeof(read_data));
6413   s.next_read_length(10);
6414   memset(read_buf, 0, sizeof(read_buf));
6415   called = false;
6416   boost::asio::async_read_at(s, 1234, buffers,
6417       boost::asio::transfer_exactly(1),
6418       bindns::bind(async_read_handler,
6419         _1, _2, 1, &called));
6420   ioc.restart();
6421   ioc.run();
6422   BOOST_ASIO_CHECK(called);
6423   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 1));
6424 
6425   s.reset(read_data, sizeof(read_data));
6426   memset(read_buf, 0, sizeof(read_buf));
6427   called = false;
6428   boost::asio::async_read_at(s, 0, buffers,
6429       boost::asio::transfer_exactly(10),
6430       bindns::bind(async_read_handler,
6431         _1, _2, 10, &called));
6432   ioc.restart();
6433   ioc.run();
6434   BOOST_ASIO_CHECK(called);
6435   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
6436 
6437   s.reset(read_data, sizeof(read_data));
6438   memset(read_buf, 0, sizeof(read_buf));
6439   called = false;
6440   boost::asio::async_read_at(s, 1234, buffers,
6441       boost::asio::transfer_exactly(10),
6442       bindns::bind(async_read_handler,
6443         _1, _2, 10, &called));
6444   ioc.restart();
6445   ioc.run();
6446   BOOST_ASIO_CHECK(called);
6447   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
6448 
6449   s.reset(read_data, sizeof(read_data));
6450   s.next_read_length(1);
6451   memset(read_buf, 0, sizeof(read_buf));
6452   called = false;
6453   boost::asio::async_read_at(s, 0, buffers,
6454       boost::asio::transfer_exactly(10),
6455       bindns::bind(async_read_handler,
6456         _1, _2, 10, &called));
6457   ioc.restart();
6458   ioc.run();
6459   BOOST_ASIO_CHECK(called);
6460   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
6461 
6462   s.reset(read_data, sizeof(read_data));
6463   s.next_read_length(1);
6464   memset(read_buf, 0, sizeof(read_buf));
6465   called = false;
6466   boost::asio::async_read_at(s, 1234, buffers,
6467       boost::asio::transfer_exactly(10),
6468       bindns::bind(async_read_handler,
6469         _1, _2, 10, &called));
6470   ioc.restart();
6471   ioc.run();
6472   BOOST_ASIO_CHECK(called);
6473   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
6474 
6475   s.reset(read_data, sizeof(read_data));
6476   s.next_read_length(10);
6477   memset(read_buf, 0, sizeof(read_buf));
6478   called = false;
6479   boost::asio::async_read_at(s, 0, buffers,
6480       boost::asio::transfer_exactly(10),
6481       bindns::bind(async_read_handler,
6482         _1, _2, 10, &called));
6483   ioc.restart();
6484   ioc.run();
6485   BOOST_ASIO_CHECK(called);
6486   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 10));
6487 
6488   s.reset(read_data, sizeof(read_data));
6489   s.next_read_length(10);
6490   memset(read_buf, 0, sizeof(read_buf));
6491   called = false;
6492   boost::asio::async_read_at(s, 1234, buffers,
6493       boost::asio::transfer_exactly(10),
6494       bindns::bind(async_read_handler,
6495         _1, _2, 10, &called));
6496   ioc.restart();
6497   ioc.run();
6498   BOOST_ASIO_CHECK(called);
6499   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 10));
6500 
6501   s.reset(read_data, sizeof(read_data));
6502   memset(read_buf, 0, sizeof(read_buf));
6503   called = false;
6504   boost::asio::async_read_at(s, 0, buffers,
6505       boost::asio::transfer_exactly(42),
6506       bindns::bind(async_read_handler,
6507         _1, _2, 42, &called));
6508   ioc.restart();
6509   ioc.run();
6510   BOOST_ASIO_CHECK(called);
6511   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
6512 
6513   s.reset(read_data, sizeof(read_data));
6514   memset(read_buf, 0, sizeof(read_buf));
6515   called = false;
6516   boost::asio::async_read_at(s, 1234, buffers,
6517       boost::asio::transfer_exactly(42),
6518       bindns::bind(async_read_handler,
6519         _1, _2, 42, &called));
6520   ioc.restart();
6521   ioc.run();
6522   BOOST_ASIO_CHECK(called);
6523   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
6524 
6525   s.reset(read_data, sizeof(read_data));
6526   s.next_read_length(1);
6527   memset(read_buf, 0, sizeof(read_buf));
6528   called = false;
6529   boost::asio::async_read_at(s, 0, buffers,
6530       boost::asio::transfer_exactly(42),
6531       bindns::bind(async_read_handler,
6532         _1, _2, 42, &called));
6533   ioc.restart();
6534   ioc.run();
6535   BOOST_ASIO_CHECK(called);
6536   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
6537 
6538   s.reset(read_data, sizeof(read_data));
6539   s.next_read_length(1);
6540   memset(read_buf, 0, sizeof(read_buf));
6541   called = false;
6542   boost::asio::async_read_at(s, 1234, buffers,
6543       boost::asio::transfer_exactly(42),
6544       bindns::bind(async_read_handler,
6545         _1, _2, 42, &called));
6546   ioc.restart();
6547   ioc.run();
6548   BOOST_ASIO_CHECK(called);
6549   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
6550 
6551   s.reset(read_data, sizeof(read_data));
6552   s.next_read_length(10);
6553   memset(read_buf, 0, sizeof(read_buf));
6554   called = false;
6555   boost::asio::async_read_at(s, 0, buffers,
6556       boost::asio::transfer_exactly(42),
6557       bindns::bind(async_read_handler,
6558         _1, _2, 42, &called));
6559   ioc.restart();
6560   ioc.run();
6561   BOOST_ASIO_CHECK(called);
6562   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, 42));
6563 
6564   s.reset(read_data, sizeof(read_data));
6565   s.next_read_length(10);
6566   memset(read_buf, 0, sizeof(read_buf));
6567   called = false;
6568   boost::asio::async_read_at(s, 1234, buffers,
6569       boost::asio::transfer_exactly(42),
6570       bindns::bind(async_read_handler,
6571         _1, _2, 42, &called));
6572   ioc.restart();
6573   ioc.run();
6574   BOOST_ASIO_CHECK(called);
6575   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, 42));
6576 
6577   s.reset(read_data, sizeof(read_data));
6578   memset(read_buf, 0, sizeof(read_buf));
6579   called = false;
6580   boost::asio::async_read_at(s, 0, buffers, old_style_transfer_all,
6581       bindns::bind(async_read_handler,
6582         _1, _2, sizeof(read_data), &called));
6583   ioc.restart();
6584   ioc.run();
6585   BOOST_ASIO_CHECK(called);
6586   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
6587 
6588   s.reset(read_data, sizeof(read_data));
6589   memset(read_buf, 0, sizeof(read_buf));
6590   called = false;
6591   boost::asio::async_read_at(s, 1234, buffers, old_style_transfer_all,
6592       bindns::bind(async_read_handler,
6593         _1, _2, sizeof(read_data), &called));
6594   ioc.restart();
6595   ioc.run();
6596   BOOST_ASIO_CHECK(called);
6597   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
6598 
6599   s.reset(read_data, sizeof(read_data));
6600   s.next_read_length(1);
6601   memset(read_buf, 0, sizeof(read_buf));
6602   called = false;
6603   boost::asio::async_read_at(s, 0, buffers, old_style_transfer_all,
6604       bindns::bind(async_read_handler,
6605         _1, _2, sizeof(read_data), &called));
6606   ioc.restart();
6607   ioc.run();
6608   BOOST_ASIO_CHECK(called);
6609   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
6610 
6611   s.reset(read_data, sizeof(read_data));
6612   s.next_read_length(1);
6613   memset(read_buf, 0, sizeof(read_buf));
6614   called = false;
6615   boost::asio::async_read_at(s, 1234, buffers, old_style_transfer_all,
6616       bindns::bind(async_read_handler,
6617         _1, _2, sizeof(read_data), &called));
6618   ioc.restart();
6619   ioc.run();
6620   BOOST_ASIO_CHECK(called);
6621   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
6622 
6623   s.reset(read_data, sizeof(read_data));
6624   s.next_read_length(10);
6625   memset(read_buf, 0, sizeof(read_buf));
6626   called = false;
6627   boost::asio::async_read_at(s, 0, buffers, old_style_transfer_all,
6628       bindns::bind(async_read_handler,
6629         _1, _2, sizeof(read_data), &called));
6630   ioc.restart();
6631   ioc.run();
6632   BOOST_ASIO_CHECK(called);
6633   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
6634 
6635   s.reset(read_data, sizeof(read_data));
6636   s.next_read_length(10);
6637   memset(read_buf, 0, sizeof(read_buf));
6638   called = false;
6639   boost::asio::async_read_at(s, 1234, buffers, old_style_transfer_all,
6640       bindns::bind(async_read_handler,
6641         _1, _2, sizeof(read_data), &called));
6642   ioc.restart();
6643   ioc.run();
6644   BOOST_ASIO_CHECK(called);
6645   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
6646 
6647   s.reset(read_data, sizeof(read_data));
6648   memset(read_buf, 0, sizeof(read_buf));
6649   called = false;
6650   boost::asio::async_read_at(s, 0, buffers, short_transfer(),
6651       bindns::bind(async_read_handler,
6652         _1, _2, sizeof(read_data), &called));
6653   ioc.restart();
6654   ioc.run();
6655   BOOST_ASIO_CHECK(called);
6656   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
6657 
6658   s.reset(read_data, sizeof(read_data));
6659   memset(read_buf, 0, sizeof(read_buf));
6660   called = false;
6661   boost::asio::async_read_at(s, 1234, buffers, short_transfer(),
6662       bindns::bind(async_read_handler,
6663         _1, _2, sizeof(read_data), &called));
6664   ioc.restart();
6665   ioc.run();
6666   BOOST_ASIO_CHECK(called);
6667   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
6668 
6669   s.reset(read_data, sizeof(read_data));
6670   s.next_read_length(1);
6671   memset(read_buf, 0, sizeof(read_buf));
6672   called = false;
6673   boost::asio::async_read_at(s, 0, buffers, short_transfer(),
6674       bindns::bind(async_read_handler,
6675         _1, _2, sizeof(read_data), &called));
6676   ioc.restart();
6677   ioc.run();
6678   BOOST_ASIO_CHECK(called);
6679   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
6680 
6681   s.reset(read_data, sizeof(read_data));
6682   s.next_read_length(1);
6683   memset(read_buf, 0, sizeof(read_buf));
6684   called = false;
6685   boost::asio::async_read_at(s, 1234, buffers, short_transfer(),
6686       bindns::bind(async_read_handler,
6687         _1, _2, sizeof(read_data), &called));
6688   ioc.restart();
6689   ioc.run();
6690   BOOST_ASIO_CHECK(called);
6691   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
6692 
6693   s.reset(read_data, sizeof(read_data));
6694   s.next_read_length(10);
6695   memset(read_buf, 0, sizeof(read_buf));
6696   called = false;
6697   boost::asio::async_read_at(s, 0, buffers, short_transfer(),
6698       bindns::bind(async_read_handler,
6699         _1, _2, sizeof(read_data), &called));
6700   ioc.restart();
6701   ioc.run();
6702   BOOST_ASIO_CHECK(called);
6703   BOOST_ASIO_CHECK(s.check_buffers(0, buffers, sizeof(read_data)));
6704 
6705   s.reset(read_data, sizeof(read_data));
6706   s.next_read_length(10);
6707   memset(read_buf, 0, sizeof(read_buf));
6708   called = false;
6709   boost::asio::async_read_at(s, 1234, buffers, short_transfer(),
6710       bindns::bind(async_read_handler,
6711         _1, _2, sizeof(read_data), &called));
6712   ioc.restart();
6713   ioc.run();
6714   BOOST_ASIO_CHECK(called);
6715   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
6716 
6717   s.reset(read_data, sizeof(read_data));
6718   memset(read_buf, 0, sizeof(read_buf));
6719   int i = boost::asio::async_read_at(s, 1234, buffers,
6720       short_transfer(), archetypes::lazy_handler());
6721   BOOST_ASIO_CHECK(i == 42);
6722   ioc.restart();
6723   ioc.run();
6724   BOOST_ASIO_CHECK(s.check_buffers(1234, buffers, sizeof(read_data)));
6725 }
6726 
test_5_arg_streambuf_async_read_at()6727 void test_5_arg_streambuf_async_read_at()
6728 {
6729 #if defined(BOOST_ASIO_HAS_BOOST_BIND)
6730   namespace bindns = boost;
6731 #else // defined(BOOST_ASIO_HAS_BOOST_BIND)
6732   namespace bindns = std;
6733   using std::placeholders::_1;
6734   using std::placeholders::_2;
6735 #endif // defined(BOOST_ASIO_HAS_BOOST_BIND)
6736 
6737   boost::asio::io_context ioc;
6738   test_random_access_device s(ioc);
6739   boost::asio::streambuf sb(sizeof(read_data));
6740 
6741   s.reset(read_data, sizeof(read_data));
6742   sb.consume(sb.size());
6743   bool called = false;
6744   boost::asio::async_read_at(s, 0, sb,
6745       boost::asio::transfer_all(),
6746       bindns::bind(async_read_handler,
6747         _1, _2, sizeof(read_data), &called));
6748   ioc.restart();
6749   ioc.run();
6750   BOOST_ASIO_CHECK(called);
6751   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
6752   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
6753 
6754   s.reset(read_data, sizeof(read_data));
6755   sb.consume(sb.size());
6756   called = false;
6757   boost::asio::async_read_at(s, 1234, sb,
6758       boost::asio::transfer_all(),
6759       bindns::bind(async_read_handler,
6760         _1, _2, sizeof(read_data), &called));
6761   ioc.restart();
6762   ioc.run();
6763   BOOST_ASIO_CHECK(called);
6764   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
6765   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
6766 
6767   s.reset(read_data, sizeof(read_data));
6768   s.next_read_length(1);
6769   sb.consume(sb.size());
6770   called = false;
6771   boost::asio::async_read_at(s, 0, sb,
6772       boost::asio::transfer_all(),
6773       bindns::bind(async_read_handler,
6774         _1, _2, sizeof(read_data), &called));
6775   ioc.restart();
6776   ioc.run();
6777   BOOST_ASIO_CHECK(called);
6778   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
6779   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
6780 
6781   s.reset(read_data, sizeof(read_data));
6782   s.next_read_length(1);
6783   sb.consume(sb.size());
6784   called = false;
6785   boost::asio::async_read_at(s, 1234, sb,
6786       boost::asio::transfer_all(),
6787       bindns::bind(async_read_handler,
6788         _1, _2, sizeof(read_data), &called));
6789   ioc.restart();
6790   ioc.run();
6791   BOOST_ASIO_CHECK(called);
6792   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
6793   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
6794 
6795   s.reset(read_data, sizeof(read_data));
6796   s.next_read_length(10);
6797   sb.consume(sb.size());
6798   called = false;
6799   boost::asio::async_read_at(s, 0, sb,
6800       boost::asio::transfer_all(),
6801       bindns::bind(async_read_handler,
6802         _1, _2, sizeof(read_data), &called));
6803   ioc.restart();
6804   ioc.run();
6805   BOOST_ASIO_CHECK(called);
6806   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
6807   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
6808 
6809   s.reset(read_data, sizeof(read_data));
6810   s.next_read_length(10);
6811   sb.consume(sb.size());
6812   called = false;
6813   boost::asio::async_read_at(s, 1234, sb,
6814       boost::asio::transfer_all(),
6815       bindns::bind(async_read_handler,
6816         _1, _2, sizeof(read_data), &called));
6817   ioc.restart();
6818   ioc.run();
6819   BOOST_ASIO_CHECK(called);
6820   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
6821   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
6822 
6823   s.reset(read_data, sizeof(read_data));
6824   sb.consume(sb.size());
6825   called = false;
6826   boost::asio::async_read_at(s, 0, sb,
6827       boost::asio::transfer_at_least(1),
6828       bindns::bind(async_read_handler,
6829         _1, _2, sizeof(read_data), &called));
6830   ioc.restart();
6831   ioc.run();
6832   BOOST_ASIO_CHECK(called);
6833   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
6834   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
6835 
6836   s.reset(read_data, sizeof(read_data));
6837   sb.consume(sb.size());
6838   called = false;
6839   boost::asio::async_read_at(s, 1234, sb,
6840       boost::asio::transfer_at_least(1),
6841       bindns::bind(async_read_handler,
6842         _1, _2, sizeof(read_data), &called));
6843   ioc.restart();
6844   ioc.run();
6845   BOOST_ASIO_CHECK(called);
6846   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
6847   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
6848 
6849   s.reset(read_data, sizeof(read_data));
6850   s.next_read_length(1);
6851   sb.consume(sb.size());
6852   called = false;
6853   boost::asio::async_read_at(s, 0, sb,
6854       boost::asio::transfer_at_least(1),
6855       bindns::bind(async_read_handler,
6856         _1, _2, 1, &called));
6857   ioc.restart();
6858   ioc.run();
6859   BOOST_ASIO_CHECK(called);
6860   BOOST_ASIO_CHECK(sb.size() == 1);
6861   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 1));
6862 
6863   s.reset(read_data, sizeof(read_data));
6864   s.next_read_length(1);
6865   sb.consume(sb.size());
6866   called = false;
6867   boost::asio::async_read_at(s, 1234, sb,
6868       boost::asio::transfer_at_least(1),
6869       bindns::bind(async_read_handler,
6870         _1, _2, 1, &called));
6871   ioc.restart();
6872   ioc.run();
6873   BOOST_ASIO_CHECK(called);
6874   BOOST_ASIO_CHECK(sb.size() == 1);
6875   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 1));
6876 
6877   s.reset(read_data, sizeof(read_data));
6878   s.next_read_length(10);
6879   sb.consume(sb.size());
6880   called = false;
6881   boost::asio::async_read_at(s, 0, sb,
6882       boost::asio::transfer_at_least(1),
6883       bindns::bind(async_read_handler,
6884         _1, _2, 10, &called));
6885   ioc.restart();
6886   ioc.run();
6887   BOOST_ASIO_CHECK(called);
6888   BOOST_ASIO_CHECK(sb.size() == 10);
6889   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 10));
6890 
6891   s.reset(read_data, sizeof(read_data));
6892   s.next_read_length(10);
6893   sb.consume(sb.size());
6894   called = false;
6895   boost::asio::async_read_at(s, 1234, sb,
6896       boost::asio::transfer_at_least(1),
6897       bindns::bind(async_read_handler,
6898         _1, _2, 10, &called));
6899   ioc.restart();
6900   ioc.run();
6901   BOOST_ASIO_CHECK(called);
6902   BOOST_ASIO_CHECK(sb.size() == 10);
6903   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 10));
6904 
6905   s.reset(read_data, sizeof(read_data));
6906   sb.consume(sb.size());
6907   called = false;
6908   boost::asio::async_read_at(s, 0, sb,
6909       boost::asio::transfer_at_least(10),
6910       bindns::bind(async_read_handler,
6911         _1, _2, sizeof(read_data), &called));
6912   ioc.restart();
6913   ioc.run();
6914   BOOST_ASIO_CHECK(called);
6915   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
6916   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
6917 
6918   s.reset(read_data, sizeof(read_data));
6919   sb.consume(sb.size());
6920   called = false;
6921   boost::asio::async_read_at(s, 1234, sb,
6922       boost::asio::transfer_at_least(10),
6923       bindns::bind(async_read_handler,
6924         _1, _2, sizeof(read_data), &called));
6925   ioc.restart();
6926   ioc.run();
6927   BOOST_ASIO_CHECK(called);
6928   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
6929   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
6930 
6931   s.reset(read_data, sizeof(read_data));
6932   s.next_read_length(1);
6933   sb.consume(sb.size());
6934   called = false;
6935   boost::asio::async_read_at(s, 0, sb,
6936       boost::asio::transfer_at_least(10),
6937       bindns::bind(async_read_handler,
6938         _1, _2, 10, &called));
6939   ioc.restart();
6940   ioc.run();
6941   BOOST_ASIO_CHECK(called);
6942   BOOST_ASIO_CHECK(sb.size() == 10);
6943   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 10));
6944 
6945   s.reset(read_data, sizeof(read_data));
6946   s.next_read_length(1);
6947   sb.consume(sb.size());
6948   called = false;
6949   boost::asio::async_read_at(s, 1234, sb,
6950       boost::asio::transfer_at_least(10),
6951       bindns::bind(async_read_handler,
6952         _1, _2, 10, &called));
6953   ioc.restart();
6954   ioc.run();
6955   BOOST_ASIO_CHECK(called);
6956   BOOST_ASIO_CHECK(sb.size() == 10);
6957   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 10));
6958 
6959   s.reset(read_data, sizeof(read_data));
6960   s.next_read_length(10);
6961   sb.consume(sb.size());
6962   called = false;
6963   boost::asio::async_read_at(s, 0, sb,
6964       boost::asio::transfer_at_least(10),
6965       bindns::bind(async_read_handler,
6966         _1, _2, 10, &called));
6967   ioc.restart();
6968   ioc.run();
6969   BOOST_ASIO_CHECK(called);
6970   BOOST_ASIO_CHECK(sb.size() == 10);
6971   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 10));
6972 
6973   s.reset(read_data, sizeof(read_data));
6974   s.next_read_length(10);
6975   sb.consume(sb.size());
6976   called = false;
6977   boost::asio::async_read_at(s, 1234, sb,
6978       boost::asio::transfer_at_least(10),
6979       bindns::bind(async_read_handler,
6980         _1, _2, 10, &called));
6981   ioc.restart();
6982   ioc.run();
6983   BOOST_ASIO_CHECK(called);
6984   BOOST_ASIO_CHECK(sb.size() == 10);
6985   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 10));
6986 
6987   s.reset(read_data, sizeof(read_data));
6988   sb.consume(sb.size());
6989   called = false;
6990   boost::asio::async_read_at(s, 0, sb,
6991       boost::asio::transfer_at_least(42),
6992       bindns::bind(async_read_handler,
6993         _1, _2, sizeof(read_data), &called));
6994   ioc.restart();
6995   ioc.run();
6996   BOOST_ASIO_CHECK(called);
6997   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
6998   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
6999 
7000   s.reset(read_data, sizeof(read_data));
7001   sb.consume(sb.size());
7002   called = false;
7003   boost::asio::async_read_at(s, 1234, sb,
7004       boost::asio::transfer_at_least(42),
7005       bindns::bind(async_read_handler,
7006         _1, _2, sizeof(read_data), &called));
7007   ioc.restart();
7008   ioc.run();
7009   BOOST_ASIO_CHECK(called);
7010   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
7011   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
7012 
7013   s.reset(read_data, sizeof(read_data));
7014   s.next_read_length(1);
7015   sb.consume(sb.size());
7016   called = false;
7017   boost::asio::async_read_at(s, 0, sb,
7018       boost::asio::transfer_at_least(42),
7019       bindns::bind(async_read_handler,
7020         _1, _2, 42, &called));
7021   ioc.restart();
7022   ioc.run();
7023   BOOST_ASIO_CHECK(called);
7024   BOOST_ASIO_CHECK(sb.size() == 42);
7025   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 42));
7026 
7027   s.reset(read_data, sizeof(read_data));
7028   s.next_read_length(1);
7029   sb.consume(sb.size());
7030   called = false;
7031   boost::asio::async_read_at(s, 1234, sb,
7032       boost::asio::transfer_at_least(42),
7033       bindns::bind(async_read_handler,
7034         _1, _2, 42, &called));
7035   ioc.restart();
7036   ioc.run();
7037   BOOST_ASIO_CHECK(called);
7038   BOOST_ASIO_CHECK(sb.size() == 42);
7039   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 42));
7040 
7041   s.reset(read_data, sizeof(read_data));
7042   s.next_read_length(10);
7043   sb.consume(sb.size());
7044   called = false;
7045   boost::asio::async_read_at(s, 0, sb,
7046       boost::asio::transfer_at_least(42),
7047       bindns::bind(async_read_handler,
7048         _1, _2, 50, &called));
7049   ioc.restart();
7050   ioc.run();
7051   BOOST_ASIO_CHECK(called);
7052   BOOST_ASIO_CHECK(sb.size() == 50);
7053   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 50));
7054 
7055   s.reset(read_data, sizeof(read_data));
7056   s.next_read_length(10);
7057   sb.consume(sb.size());
7058   called = false;
7059   boost::asio::async_read_at(s, 1234, sb,
7060       boost::asio::transfer_at_least(42),
7061       bindns::bind(async_read_handler,
7062         _1, _2, 50, &called));
7063   ioc.restart();
7064   ioc.run();
7065   BOOST_ASIO_CHECK(called);
7066   BOOST_ASIO_CHECK(sb.size() == 50);
7067   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 50));
7068 
7069   s.reset(read_data, sizeof(read_data));
7070   sb.consume(sb.size());
7071   called = false;
7072   boost::asio::async_read_at(s, 0, sb,
7073       boost::asio::transfer_exactly(1),
7074       bindns::bind(async_read_handler,
7075         _1, _2, 1, &called));
7076   ioc.restart();
7077   ioc.run();
7078   BOOST_ASIO_CHECK(called);
7079   BOOST_ASIO_CHECK(sb.size() == 1);
7080   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 1));
7081 
7082   s.reset(read_data, sizeof(read_data));
7083   sb.consume(sb.size());
7084   called = false;
7085   boost::asio::async_read_at(s, 1234, sb,
7086       boost::asio::transfer_exactly(1),
7087       bindns::bind(async_read_handler,
7088         _1, _2, 1, &called));
7089   ioc.restart();
7090   ioc.run();
7091   BOOST_ASIO_CHECK(called);
7092   BOOST_ASIO_CHECK(sb.size() == 1);
7093   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 1));
7094 
7095   s.reset(read_data, sizeof(read_data));
7096   s.next_read_length(1);
7097   sb.consume(sb.size());
7098   called = false;
7099   boost::asio::async_read_at(s, 0, sb,
7100       boost::asio::transfer_exactly(1),
7101       bindns::bind(async_read_handler,
7102         _1, _2, 1, &called));
7103   ioc.restart();
7104   ioc.run();
7105   BOOST_ASIO_CHECK(called);
7106   BOOST_ASIO_CHECK(sb.size() == 1);
7107   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 1));
7108 
7109   s.reset(read_data, sizeof(read_data));
7110   s.next_read_length(1);
7111   sb.consume(sb.size());
7112   called = false;
7113   boost::asio::async_read_at(s, 1234, sb,
7114       boost::asio::transfer_exactly(1),
7115       bindns::bind(async_read_handler,
7116         _1, _2, 1, &called));
7117   ioc.restart();
7118   ioc.run();
7119   BOOST_ASIO_CHECK(called);
7120   BOOST_ASIO_CHECK(sb.size() == 1);
7121   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 1));
7122 
7123   s.reset(read_data, sizeof(read_data));
7124   s.next_read_length(10);
7125   sb.consume(sb.size());
7126   called = false;
7127   boost::asio::async_read_at(s, 0, sb,
7128       boost::asio::transfer_exactly(1),
7129       bindns::bind(async_read_handler,
7130         _1, _2, 1, &called));
7131   ioc.restart();
7132   ioc.run();
7133   BOOST_ASIO_CHECK(called);
7134   BOOST_ASIO_CHECK(sb.size() == 1);
7135   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 1));
7136 
7137   s.reset(read_data, sizeof(read_data));
7138   s.next_read_length(10);
7139   sb.consume(sb.size());
7140   called = false;
7141   boost::asio::async_read_at(s, 1234, sb,
7142       boost::asio::transfer_exactly(1),
7143       bindns::bind(async_read_handler,
7144         _1, _2, 1, &called));
7145   ioc.restart();
7146   ioc.run();
7147   BOOST_ASIO_CHECK(called);
7148   BOOST_ASIO_CHECK(sb.size() == 1);
7149   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 1));
7150 
7151   s.reset(read_data, sizeof(read_data));
7152   sb.consume(sb.size());
7153   called = false;
7154   boost::asio::async_read_at(s, 0, sb,
7155       boost::asio::transfer_exactly(10),
7156       bindns::bind(async_read_handler,
7157         _1, _2, 10, &called));
7158   ioc.restart();
7159   ioc.run();
7160   BOOST_ASIO_CHECK(called);
7161   BOOST_ASIO_CHECK(sb.size() == 10);
7162   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 10));
7163 
7164   s.reset(read_data, sizeof(read_data));
7165   sb.consume(sb.size());
7166   called = false;
7167   boost::asio::async_read_at(s, 1234, sb,
7168       boost::asio::transfer_exactly(10),
7169       bindns::bind(async_read_handler,
7170         _1, _2, 10, &called));
7171   ioc.restart();
7172   ioc.run();
7173   BOOST_ASIO_CHECK(called);
7174   BOOST_ASIO_CHECK(sb.size() == 10);
7175   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 10));
7176 
7177   s.reset(read_data, sizeof(read_data));
7178   s.next_read_length(1);
7179   sb.consume(sb.size());
7180   called = false;
7181   boost::asio::async_read_at(s, 0, sb,
7182       boost::asio::transfer_exactly(10),
7183       bindns::bind(async_read_handler,
7184         _1, _2, 10, &called));
7185   ioc.restart();
7186   ioc.run();
7187   BOOST_ASIO_CHECK(called);
7188   BOOST_ASIO_CHECK(sb.size() == 10);
7189   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 10));
7190 
7191   s.reset(read_data, sizeof(read_data));
7192   s.next_read_length(1);
7193   sb.consume(sb.size());
7194   called = false;
7195   boost::asio::async_read_at(s, 1234, sb,
7196       boost::asio::transfer_exactly(10),
7197       bindns::bind(async_read_handler,
7198         _1, _2, 10, &called));
7199   ioc.restart();
7200   ioc.run();
7201   BOOST_ASIO_CHECK(called);
7202   BOOST_ASIO_CHECK(sb.size() == 10);
7203   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 10));
7204 
7205   s.reset(read_data, sizeof(read_data));
7206   s.next_read_length(10);
7207   sb.consume(sb.size());
7208   called = false;
7209   boost::asio::async_read_at(s, 0, sb,
7210       boost::asio::transfer_exactly(10),
7211       bindns::bind(async_read_handler,
7212         _1, _2, 10, &called));
7213   ioc.restart();
7214   ioc.run();
7215   BOOST_ASIO_CHECK(called);
7216   BOOST_ASIO_CHECK(sb.size() == 10);
7217   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 10));
7218 
7219   s.reset(read_data, sizeof(read_data));
7220   s.next_read_length(10);
7221   sb.consume(sb.size());
7222   called = false;
7223   boost::asio::async_read_at(s, 1234, sb,
7224       boost::asio::transfer_exactly(10),
7225       bindns::bind(async_read_handler,
7226         _1, _2, 10, &called));
7227   ioc.restart();
7228   ioc.run();
7229   BOOST_ASIO_CHECK(called);
7230   BOOST_ASIO_CHECK(sb.size() == 10);
7231   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 10));
7232 
7233   s.reset(read_data, sizeof(read_data));
7234   sb.consume(sb.size());
7235   called = false;
7236   boost::asio::async_read_at(s, 0, sb,
7237       boost::asio::transfer_exactly(42),
7238       bindns::bind(async_read_handler,
7239         _1, _2, 42, &called));
7240   ioc.restart();
7241   ioc.run();
7242   BOOST_ASIO_CHECK(called);
7243   BOOST_ASIO_CHECK(sb.size() == 42);
7244   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 42));
7245 
7246   s.reset(read_data, sizeof(read_data));
7247   sb.consume(sb.size());
7248   called = false;
7249   boost::asio::async_read_at(s, 1234, sb,
7250       boost::asio::transfer_exactly(42),
7251       bindns::bind(async_read_handler,
7252         _1, _2, 42, &called));
7253   ioc.restart();
7254   ioc.run();
7255   BOOST_ASIO_CHECK(called);
7256   BOOST_ASIO_CHECK(sb.size() == 42);
7257   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 42));
7258 
7259   s.reset(read_data, sizeof(read_data));
7260   s.next_read_length(1);
7261   sb.consume(sb.size());
7262   called = false;
7263   boost::asio::async_read_at(s, 0, sb,
7264       boost::asio::transfer_exactly(42),
7265       bindns::bind(async_read_handler,
7266         _1, _2, 42, &called));
7267   ioc.restart();
7268   ioc.run();
7269   BOOST_ASIO_CHECK(called);
7270   BOOST_ASIO_CHECK(sb.size() == 42);
7271   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 42));
7272 
7273   s.reset(read_data, sizeof(read_data));
7274   s.next_read_length(1);
7275   sb.consume(sb.size());
7276   called = false;
7277   boost::asio::async_read_at(s, 1234, sb,
7278       boost::asio::transfer_exactly(42),
7279       bindns::bind(async_read_handler,
7280         _1, _2, 42, &called));
7281   ioc.restart();
7282   ioc.run();
7283   BOOST_ASIO_CHECK(called);
7284   BOOST_ASIO_CHECK(sb.size() == 42);
7285   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 42));
7286 
7287   s.reset(read_data, sizeof(read_data));
7288   s.next_read_length(10);
7289   sb.consume(sb.size());
7290   called = false;
7291   boost::asio::async_read_at(s, 0, sb,
7292       boost::asio::transfer_exactly(42),
7293       bindns::bind(async_read_handler,
7294         _1, _2, 42, &called));
7295   ioc.restart();
7296   ioc.run();
7297   BOOST_ASIO_CHECK(called);
7298   BOOST_ASIO_CHECK(sb.size() == 42);
7299   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), 42));
7300 
7301   s.reset(read_data, sizeof(read_data));
7302   s.next_read_length(10);
7303   sb.consume(sb.size());
7304   called = false;
7305   boost::asio::async_read_at(s, 1234, sb,
7306       boost::asio::transfer_exactly(42),
7307       bindns::bind(async_read_handler,
7308         _1, _2, 42, &called));
7309   ioc.restart();
7310   ioc.run();
7311   BOOST_ASIO_CHECK(called);
7312   BOOST_ASIO_CHECK(sb.size() == 42);
7313   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), 42));
7314 
7315   s.reset(read_data, sizeof(read_data));
7316   sb.consume(sb.size());
7317   called = false;
7318   boost::asio::async_read_at(s, 0, sb, old_style_transfer_all,
7319       bindns::bind(async_read_handler,
7320         _1, _2, sizeof(read_data), &called));
7321   ioc.restart();
7322   ioc.run();
7323   BOOST_ASIO_CHECK(called);
7324   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
7325   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
7326 
7327   s.reset(read_data, sizeof(read_data));
7328   sb.consume(sb.size());
7329   called = false;
7330   boost::asio::async_read_at(s, 1234, sb, old_style_transfer_all,
7331       bindns::bind(async_read_handler,
7332         _1, _2, sizeof(read_data), &called));
7333   ioc.restart();
7334   ioc.run();
7335   BOOST_ASIO_CHECK(called);
7336   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
7337   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
7338 
7339   s.reset(read_data, sizeof(read_data));
7340   s.next_read_length(1);
7341   sb.consume(sb.size());
7342   called = false;
7343   boost::asio::async_read_at(s, 0, sb, old_style_transfer_all,
7344       bindns::bind(async_read_handler,
7345         _1, _2, sizeof(read_data), &called));
7346   ioc.restart();
7347   ioc.run();
7348   BOOST_ASIO_CHECK(called);
7349   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
7350   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
7351 
7352   s.reset(read_data, sizeof(read_data));
7353   s.next_read_length(1);
7354   sb.consume(sb.size());
7355   called = false;
7356   boost::asio::async_read_at(s, 1234, sb, old_style_transfer_all,
7357       bindns::bind(async_read_handler,
7358         _1, _2, sizeof(read_data), &called));
7359   ioc.restart();
7360   ioc.run();
7361   BOOST_ASIO_CHECK(called);
7362   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
7363   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
7364 
7365   s.reset(read_data, sizeof(read_data));
7366   s.next_read_length(10);
7367   sb.consume(sb.size());
7368   called = false;
7369   boost::asio::async_read_at(s, 0, sb, old_style_transfer_all,
7370       bindns::bind(async_read_handler,
7371         _1, _2, sizeof(read_data), &called));
7372   ioc.restart();
7373   ioc.run();
7374   BOOST_ASIO_CHECK(called);
7375   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
7376   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
7377 
7378   s.reset(read_data, sizeof(read_data));
7379   s.next_read_length(10);
7380   sb.consume(sb.size());
7381   called = false;
7382   boost::asio::async_read_at(s, 1234, sb, old_style_transfer_all,
7383       bindns::bind(async_read_handler,
7384         _1, _2, sizeof(read_data), &called));
7385   ioc.restart();
7386   ioc.run();
7387   BOOST_ASIO_CHECK(called);
7388   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
7389   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
7390 
7391   s.reset(read_data, sizeof(read_data));
7392   sb.consume(sb.size());
7393   called = false;
7394   boost::asio::async_read_at(s, 0, sb, short_transfer(),
7395       bindns::bind(async_read_handler,
7396         _1, _2, sizeof(read_data), &called));
7397   ioc.restart();
7398   ioc.run();
7399   BOOST_ASIO_CHECK(called);
7400   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
7401   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
7402 
7403   s.reset(read_data, sizeof(read_data));
7404   sb.consume(sb.size());
7405   called = false;
7406   boost::asio::async_read_at(s, 1234, sb, short_transfer(),
7407       bindns::bind(async_read_handler,
7408         _1, _2, sizeof(read_data), &called));
7409   ioc.restart();
7410   ioc.run();
7411   BOOST_ASIO_CHECK(called);
7412   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
7413   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
7414 
7415   s.reset(read_data, sizeof(read_data));
7416   s.next_read_length(1);
7417   sb.consume(sb.size());
7418   called = false;
7419   boost::asio::async_read_at(s, 0, sb, short_transfer(),
7420       bindns::bind(async_read_handler,
7421         _1, _2, sizeof(read_data), &called));
7422   ioc.restart();
7423   ioc.run();
7424   BOOST_ASIO_CHECK(called);
7425   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
7426   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
7427 
7428   s.reset(read_data, sizeof(read_data));
7429   s.next_read_length(1);
7430   sb.consume(sb.size());
7431   called = false;
7432   boost::asio::async_read_at(s, 1234, sb, short_transfer(),
7433       bindns::bind(async_read_handler,
7434         _1, _2, sizeof(read_data), &called));
7435   ioc.restart();
7436   ioc.run();
7437   BOOST_ASIO_CHECK(called);
7438   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
7439   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
7440 
7441   s.reset(read_data, sizeof(read_data));
7442   s.next_read_length(10);
7443   sb.consume(sb.size());
7444   called = false;
7445   boost::asio::async_read_at(s, 0, sb, short_transfer(),
7446       bindns::bind(async_read_handler,
7447         _1, _2, sizeof(read_data), &called));
7448   ioc.restart();
7449   ioc.run();
7450   BOOST_ASIO_CHECK(called);
7451   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
7452   BOOST_ASIO_CHECK(s.check_buffers(0, sb.data(), sizeof(read_data)));
7453 
7454   s.reset(read_data, sizeof(read_data));
7455   s.next_read_length(10);
7456   sb.consume(sb.size());
7457   called = false;
7458   boost::asio::async_read_at(s, 1234, sb, short_transfer(),
7459       bindns::bind(async_read_handler,
7460         _1, _2, sizeof(read_data), &called));
7461   ioc.restart();
7462   ioc.run();
7463   BOOST_ASIO_CHECK(called);
7464   BOOST_ASIO_CHECK(sb.size() == sizeof(read_data));
7465   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
7466 
7467   s.reset(read_data, sizeof(read_data));
7468   sb.consume(sb.size());
7469   int i = boost::asio::async_read_at(s, 1234, sb,
7470       short_transfer(), archetypes::lazy_handler());
7471   BOOST_ASIO_CHECK(i == 42);
7472   ioc.restart();
7473   ioc.run();
7474   BOOST_ASIO_CHECK(s.check_buffers(1234, sb.data(), sizeof(read_data)));
7475 }
7476 
7477 BOOST_ASIO_TEST_SUITE
7478 (
7479   "read_at",
7480   BOOST_ASIO_TEST_CASE(test_3_arg_mutable_buffer_read_at)
7481   BOOST_ASIO_TEST_CASE(test_3_arg_vector_buffers_read_at)
7482   BOOST_ASIO_TEST_CASE(test_3_arg_streambuf_read_at)
7483   BOOST_ASIO_TEST_CASE(test_4_arg_nothrow_mutable_buffer_read_at)
7484   BOOST_ASIO_TEST_CASE(test_4_arg_nothrow_vector_buffers_read_at)
7485   BOOST_ASIO_TEST_CASE(test_4_arg_nothrow_streambuf_read_at)
7486   BOOST_ASIO_TEST_CASE(test_4_arg_mutable_buffer_read_at)
7487   BOOST_ASIO_TEST_CASE(test_4_arg_vector_buffers_read_at)
7488   BOOST_ASIO_TEST_CASE(test_4_arg_streambuf_read_at)
7489   BOOST_ASIO_TEST_CASE(test_5_arg_mutable_buffer_read_at)
7490   BOOST_ASIO_TEST_CASE(test_5_arg_vector_buffers_read_at)
7491   BOOST_ASIO_TEST_CASE(test_5_arg_streambuf_read_at)
7492   BOOST_ASIO_TEST_CASE(test_4_arg_mutable_buffer_async_read_at)
7493   BOOST_ASIO_TEST_CASE(test_4_arg_boost_array_buffers_async_read_at)
7494   BOOST_ASIO_TEST_CASE(test_4_arg_std_array_buffers_async_read_at)
7495   BOOST_ASIO_TEST_CASE(test_4_arg_vector_buffers_async_read_at)
7496   BOOST_ASIO_TEST_CASE(test_4_arg_streambuf_async_read_at)
7497   BOOST_ASIO_TEST_CASE(test_5_arg_mutable_buffer_async_read_at)
7498   BOOST_ASIO_TEST_CASE(test_5_arg_boost_array_buffers_async_read_at)
7499   BOOST_ASIO_TEST_CASE(test_5_arg_std_array_buffers_async_read_at)
7500   BOOST_ASIO_TEST_CASE(test_5_arg_vector_buffers_async_read_at)
7501   BOOST_ASIO_TEST_CASE(test_5_arg_streambuf_async_read_at)
7502 )
7503