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