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