]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/beast/test/beast/core/buffers_cat.cpp
Add patch for failing prerm scripts
[ceph.git] / ceph / src / boost / libs / beast / test / beast / core / buffers_cat.cpp
CommitLineData
7c673cae 1//
b32b8144 2// Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
7c673cae
FG
3//
4// Distributed under the Boost Software License, Version 1.0. (See accompanying
5// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6//
b32b8144
FG
7// Official repository: https://github.com/boostorg/beast
8//
7c673cae
FG
9
10// Test that header file is self-contained.
b32b8144 11#include <boost/beast/core/buffers_cat.hpp>
7c673cae 12
b32b8144 13#include <boost/beast/unit_test/suite.hpp>
7c673cae
FG
14#include <boost/asio/buffer.hpp>
15#include <boost/asio/streambuf.hpp>
16#include <iterator>
17#include <list>
18#include <type_traits>
19#include <vector>
20
b32b8144 21namespace boost {
7c673cae
FG
22namespace beast {
23
b32b8144 24class buffers_cat_test : public unit_test::suite
7c673cae
FG
25{
26public:
27 template<class Iterator>
28 static
29 std::reverse_iterator<Iterator>
30 make_reverse_iterator(Iterator i)
31 {
32 return std::reverse_iterator<Iterator>(i);
33 }
34
35 template<class ConstBufferSequence>
36 static
37 std::size_t
38 bsize1(ConstBufferSequence const& bs)
39 {
40 using boost::asio::buffer_size;
41 std::size_t n = 0;
42 for(auto it = bs.begin(); it != bs.end(); ++it)
43 n += buffer_size(*it);
44 return n;
45 }
46
47 template<class ConstBufferSequence>
48 static
49 std::size_t
50 bsize2(ConstBufferSequence const& bs)
51 {
52 using boost::asio::buffer_size;
53 std::size_t n = 0;
54 for(auto it = bs.begin(); it != bs.end(); it++)
55 n += buffer_size(*it);
56 return n;
57 }
58
59 template<class ConstBufferSequence>
60 static
61 std::size_t
62 bsize3(ConstBufferSequence const& bs)
63 {
64 using boost::asio::buffer_size;
65 std::size_t n = 0;
66 for(auto it = bs.end(); it != bs.begin();)
67 n += buffer_size(*--it);
68 return n;
69 }
70
71 template<class ConstBufferSequence>
72 static
73 std::size_t
74 bsize4(ConstBufferSequence const& bs)
75 {
76 using boost::asio::buffer_size;
77 std::size_t n = 0;
78 for(auto it = bs.end(); it != bs.begin();)
79 {
80 it--;
81 n += buffer_size(*it);
82 }
83 return n;
84 }
85
86 void testBufferCat()
87 {
88 using boost::asio::buffer_size;
89 using boost::asio::const_buffer;
90 char buf[10];
91 std::list<const_buffer> b1;
92 std::vector<const_buffer> b2{
93 const_buffer{buf+0, 1},
94 const_buffer{buf+1, 2}};
95 std::list<const_buffer> b3;
96 std::array<const_buffer, 3> b4{{
97 const_buffer{buf+3, 1},
98 const_buffer{buf+4, 2},
99 const_buffer{buf+6, 3}}};
100 std::list<const_buffer> b5{
101 const_buffer{buf+9, 1}};
102 std::list<const_buffer> b6;
b32b8144 103 auto bs = buffers_cat(
7c673cae
FG
104 b1, b2, b3, b4, b5, b6);
105 BEAST_EXPECT(buffer_size(bs) == 10);
106 BEAST_EXPECT(bsize1(bs) == 10);
107 BEAST_EXPECT(bsize2(bs) == 10);
108 BEAST_EXPECT(bsize3(bs) == 10);
109 BEAST_EXPECT(bsize4(bs) == 10);
110 std::vector<const_buffer> v;
111 for(auto iter = make_reverse_iterator(bs.end());
112 iter != make_reverse_iterator(bs.begin()); ++iter)
113 v.emplace_back(*iter);
114 BEAST_EXPECT(buffer_size(bs) == 10);
115 decltype(bs) bs2(bs);
116 auto bs3(std::move(bs));
117 {
118 boost::asio::streambuf sb1, sb2;
b32b8144 119 BEAST_EXPECT(buffer_size(buffers_cat(
7c673cae
FG
120 sb1.prepare(5), sb2.prepare(7))) == 12);
121 sb1.commit(5);
122 sb2.commit(7);
b32b8144 123 BEAST_EXPECT(buffer_size(buffers_cat(
7c673cae
FG
124 sb1.data(), sb2.data())) == 12);
125 }
126 for(auto it = bs.begin(); it != bs.end(); ++it)
127 {
128 decltype(bs)::const_iterator copy;
129 copy = it;
130 BEAST_EXPECT(copy == it);
131 copy = copy;
132 BEAST_EXPECT(copy == it);
133 }
134 }
135
136 void testIterators()
137 {
138 using boost::asio::buffer_size;
139 using boost::asio::const_buffer;
140 char buf[9];
141 std::vector<const_buffer> b1{
142 const_buffer{buf+0, 1},
143 const_buffer{buf+1, 2}};
144 std::array<const_buffer, 3> b2{{
145 const_buffer{buf+3, 1},
146 const_buffer{buf+4, 2},
147 const_buffer{buf+6, 3}}};
b32b8144 148 auto bs = buffers_cat(b1, b2);
7c673cae
FG
149 for(int n = 0;
150 n <= std::distance(bs.begin(), bs.end()); ++n)
151 {
152 auto it = std::next(bs.begin(), n);
153 decltype(it) it2(std::move(it));
154 it = std::move(it2);
155 auto pit = &it;
156 it = std::move(*pit);
157 }
158 try
159 {
160 std::size_t n = 0;
161 for(auto it = bs.begin(); n < 100; ++it)
162 ++n;
163 fail();
164 }
165 catch(std::exception const&)
166 {
167 pass();
168 }
169
170 // decrement iterator
b32b8144
FG
171 /* VFALCO
172 This causes a mysterious "uninitialized variable"
173 warning related to this function (see comment)
174 https://code.woboq.org/qt5/include/c++/6.3.1/bits/stl_iterator.h.html#159
175 */
176#if 0
7c673cae
FG
177 {
178 auto const rbegin =
179 make_reverse_iterator(bs.end());
180 auto const rend =
181 make_reverse_iterator(bs.begin());
182 std::size_t n = 0;
183 for(auto it = rbegin; it != rend; ++it)
184 n += buffer_size(*it);
185 BEAST_EXPECT(n == 9);
186 }
b32b8144 187#endif
7c673cae
FG
188
189 try
190 {
191 std::size_t n = 0;
192 for(auto it = bs.end(); n < 100; --it)
193 ++n;
194 fail();
195 }
196 catch(std::exception const&)
197 {
198 pass();
199 }
200
201 try
202 {
203 buffer_size(*bs.end());
204 fail();
205 }
206 catch(std::exception const&)
207 {
208 pass();
209 }
210 auto bs2 = bs;
211 BEAST_EXPECT(bs.begin() != bs2.begin());
212 BEAST_EXPECT(bs.end() != bs2.end());
213 decltype(bs)::const_iterator it;
214 decltype(bs2)::const_iterator it2;
215 BEAST_EXPECT(it == it2);
216 }
217
218 void run() override
219 {
220 using boost::asio::const_buffer;
b32b8144 221 using boost::asio::const_buffer;
7c673cae 222 using boost::asio::mutable_buffer;
7c673cae
FG
223 struct user_defined : mutable_buffer
224 {
225 };
226
b32b8144
FG
227 // Check is_all_const_buffer_sequence
228 BOOST_STATIC_ASSERT(
229 detail::is_all_const_buffer_sequence<const_buffer>::value);
230 BOOST_STATIC_ASSERT(
231 detail::is_all_const_buffer_sequence<const_buffer, const_buffer>::value);
232 BOOST_STATIC_ASSERT(
233 detail::is_all_const_buffer_sequence<mutable_buffer, mutable_buffer>::value);
234 BOOST_STATIC_ASSERT(
235 detail::is_all_const_buffer_sequence<const_buffer, mutable_buffer>::value);
236 BOOST_STATIC_ASSERT(
237 ! detail::is_all_const_buffer_sequence<const_buffer, mutable_buffer, int>::value);
7c673cae
FG
238
239 // Ensure that concatenating mutable buffer
240 // sequences results in a mutable buffer sequence
b32b8144 241 BOOST_STATIC_ASSERT(std::is_same<
7c673cae 242 mutable_buffer,
b32b8144 243 decltype(buffers_cat(
7c673cae
FG
244 std::declval<mutable_buffer>(),
245 std::declval<user_defined>(),
246 std::declval<mutable_buffer>()
b32b8144 247 ))::value_type>::value);
7c673cae
FG
248
249 // Ensure that concatenating mixed buffer
250 // sequences results in a const buffer sequence.
b32b8144 251 BOOST_STATIC_ASSERT(std::is_same<
7c673cae 252 const_buffer,
b32b8144 253 decltype(buffers_cat(
7c673cae
FG
254 std::declval<mutable_buffer>(),
255 std::declval<user_defined>(),
256 std::declval<const_buffer>()
b32b8144 257 ))::value_type>::value);
7c673cae
FG
258
259 testBufferCat();
260 testIterators();
261 }
262};
263
b32b8144 264BEAST_DEFINE_TESTSUITE(beast,core,buffers_cat);
7c673cae
FG
265
266} // beast
b32b8144 267} // boost