100.00% Lines (2/2)
100.00% Functions (1/1)
| TLA | Baseline | Branch | ||||||
|---|---|---|---|---|---|---|---|---|
| Line | Hits | Code | Line | Hits | Code | |||
| 1 | + | // | ||||||
| 2 | + | // Copyright (c) 2026 Michael Vandeberg | ||||||
| 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_BUFFERS_BUFFER_SLICE_HPP | ||||||
| 11 | + | #define BOOST_CAPY_BUFFERS_BUFFER_SLICE_HPP | ||||||
| 12 | + | |||||||
| 13 | + | #include <boost/capy/detail/config.hpp> | ||||||
| 14 | + | #include <boost/capy/buffers.hpp> | ||||||
| 15 | + | #include <boost/capy/detail/slice_impl.hpp> | ||||||
| 16 | + | |||||||
| 17 | + | #include <cstddef> | ||||||
| 18 | + | #include <limits> | ||||||
| 19 | + | |||||||
| 20 | + | namespace boost { | ||||||
| 21 | + | namespace capy { | ||||||
| 22 | + | |||||||
| 23 | + | /** Return a byte-range slice of a buffer sequence. | ||||||
| 24 | + | |||||||
| 25 | + | Constructs a view over a contiguous byte range of `seq`. The | ||||||
| 26 | + | slice exposes its current bytes via `data()` (a buffer sequence) | ||||||
| 27 | + | and supports incremental consumption via `remove_prefix(n)` and | ||||||
| 28 | + | `remove_suffix(n)`. | ||||||
| 29 | + | |||||||
| 30 | + | @par Return Value | ||||||
| 31 | + | An object of unspecified type satisfying the @ref Slice concept. | ||||||
| 32 | + | Bind with `auto` and operate through the concept's members. When | ||||||
| 33 | + | `seq` models @ref MutableBufferSequence, the returned object | ||||||
| 34 | + | additionally models @ref MutableSlice. | ||||||
| 35 | + | |||||||
| 36 | + | @par Lifetime | ||||||
| 37 | + | The returned object holds a non-owning reference to data within | ||||||
| 38 | + | `seq`. `seq` must remain valid until the returned object is | ||||||
| 39 | + | destroyed. Iterators and buffer descriptors obtained through | ||||||
| 40 | + | `data()` follow the same invalidation rules as those of `seq`. | ||||||
| 41 | + | |||||||
| 42 | + | @par Parameters | ||||||
| 43 | + | @li `seq` The underlying buffer sequence. | ||||||
| 44 | + | @li `offset` Number of bytes to skip from the start of `seq`. | ||||||
| 45 | + | Clamped to `buffer_size(seq)`. | ||||||
| 46 | + | @li `length` Maximum number of bytes the slice will expose, | ||||||
| 47 | + | starting at `offset`. Clamped to `buffer_size(seq) - offset`. | ||||||
| 48 | + | Defaults to the maximum value of `std::size_t`, i.e. "to end". | ||||||
| 49 | + | |||||||
| 50 | + | @par Example | ||||||
| 51 | + | @code | ||||||
| 52 | + | template< ReadStream Stream, MutableBufferSequence MB > | ||||||
| 53 | + | task< io_result< std::size_t > > | ||||||
| 54 | + | read_all( Stream& stream, MB buffers ) | ||||||
| 55 | + | { | ||||||
| 56 | + | auto s = buffer_slice( buffers ); | ||||||
| 57 | + | std::size_t const total_size = buffer_size( buffers ); | ||||||
| 58 | + | std::size_t total = 0; | ||||||
| 59 | + | while( total < total_size ) | ||||||
| 60 | + | { | ||||||
| 61 | + | auto [ec, n] = co_await stream.read_some( s.data() ); | ||||||
| 62 | + | s.remove_prefix( n ); | ||||||
| 63 | + | total += n; | ||||||
| 64 | + | if( ec ) | ||||||
| 65 | + | co_return {ec, total}; | ||||||
| 66 | + | } | ||||||
| 67 | + | co_return {{}, total}; | ||||||
| 68 | + | } | ||||||
| 69 | + | @endcode | ||||||
| 70 | + | |||||||
| 71 | + | @see Slice, MutableSlice | ||||||
| 72 | + | */ | ||||||
| 73 | + | template<class BufferSequence> | ||||||
| 74 | + | requires MutableBufferSequence<BufferSequence> | ||||||
| 75 | + | || ConstBufferSequence<BufferSequence> | ||||||
| 76 | + | auto | ||||||
| HITGNC | 77 | + | 205 | buffer_slice( | ||||
| 78 | + | BufferSequence const& seq, | ||||||
| 79 | + | std::size_t offset = 0, | ||||||
| 80 | + | std::size_t length = | ||||||
| 81 | + | (std::numeric_limits<std::size_t>::max)()) noexcept | ||||||
| 82 | + | { | ||||||
| HITGNC | 83 | + | 205 | return detail::slice_impl<BufferSequence>(seq, offset, length); | ||||
| 84 | + | } | ||||||
| 85 | + | |||||||
| 86 | + | } // namespace capy | ||||||
| 87 | + | } // namespace boost | ||||||
| 88 | + | |||||||
| 89 | + | #endif | ||||||