TLA Line data Source code
1 : //
2 : // Copyright (c) 2025 Vinnie Falco (vinnie.falco@gmail.com)
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 : //
7 : // Official repository: https://github.com/cppalliance/capy
8 : //
9 :
10 : #ifndef BOOST_CAPY_TEST_BUFFER_TO_STRING_HPP
11 : #define BOOST_CAPY_TEST_BUFFER_TO_STRING_HPP
12 :
13 : #include <boost/capy/detail/config.hpp>
14 : #include <boost/capy/buffers.hpp>
15 :
16 : #include <string>
17 :
18 : namespace boost {
19 : namespace capy {
20 : namespace test {
21 :
22 : /** Convert one or more buffer sequences to a string.
23 :
24 : This function concatenates the bytes from all provided buffer
25 : sequences into a single string. With a single argument, it
26 : converts that buffer sequence to a string. With multiple
27 : arguments, it concatenates them in order.
28 :
29 : @par Example
30 : @code
31 : // Single buffer sequence
32 : const_buffer cb( "hello", 5 );
33 : std::string s = buffer_to_string( cb ); // "hello"
34 :
35 : // Multiple buffer sequences (concatenation)
36 : const_buffer b1( "hello", 5 );
37 : const_buffer b2( " world", 6 );
38 : std::string s = buffer_to_string( b1, b2 ); // "hello world"
39 :
40 : // With bufgrind splits: each half is itself a buffer sequence,
41 : // so pass it directly -- there is no .data() to unwrap.
42 : bufgrind bg( cb );
43 : while( bg ) {
44 : auto [b1, b2] = co_await bg.next();
45 : BOOST_TEST_EQ( buffer_to_string( b1, b2 ), "hello" );
46 : }
47 : @endcode
48 :
49 : @param bufs One or more buffer sequences to concatenate.
50 :
51 : @return A string containing all bytes from the buffer sequences.
52 : */
53 : template<ConstBufferSequence... Buffers>
54 : std::string
55 HIT 176 : buffer_to_string(Buffers const&... bufs)
56 : {
57 176 : std::string result;
58 176 : result.reserve((buffer_size(bufs) + ...));
59 488 : auto append = [&](auto const& bs) {
60 312 : auto const e = end(bs);
61 634 : for(auto it = begin(bs); it != e; ++it)
62 : {
63 319 : const_buffer b(*it);
64 644 : result.append(
65 322 : static_cast<char const*>(b.data()),
66 : b.size());
67 : }
68 : };
69 176 : (append(bufs), ...);
70 352 : return result;
71 MIS 0 : }
72 :
73 : } // test
74 : } // capy
75 : } // boost
76 :
77 : #endif
|