ConstBufferSequence

A ConstBufferSequence represents zero or more contiguous memory regions as a bidirectional range whose value type is convertible to const_buffer, or as an object which is convertible to const_buffer.

Concept Definition

template<typename T>
concept const_buffer_sequence =
    std::is_convertible_v<T, const_buffer> || (
        std::ranges::bidirectional_range<T> &&
        std::is_convertible_v<std::ranges::range_value_t<T>, const_buffer>);

Requirements

  • T denotes a type meeting the ConstBufferSequence requirements.

  • t denotes a value of type T.

  • u denotes a value of type T.

Expression Type Semantics, Pre/Post-conditions

const_buffer_sequence<T>

bool

true if T models ConstBufferSequence.

buffers::begin(t)

Iterator

Returns a bidirectional iterator to the first buffer, or buffers::end(t) if the sequence is empty.

buffers::end(t)

Iterator

Returns a bidirectional iterator one past the last buffer.

*it

Convertible to const_buffer

Where it is an iterator obtained from buffers::begin(t).

T u(t)

Copy construction. u must reference the same memory regions as t.

Iteration

While std::ranges::begin and std::ranges::end work on bidirectional ranges, they do not handle objects merely convertible to const_buffer. Use buffers::begin and buffers::end for uniform handling:

template<class ConstBufferSequence>
void print_buffers(ConstBufferSequence const& bs)
{
    for(auto it = buffers::begin(bs); it != buffers::end(bs); ++it)
    {
        const_buffer b = *it;
        std::cout << "Buffer: " << b.size() << " bytes\n";
    }
}

// Works with ranges
std::vector<const_buffer> v = /* ... */;
print_buffers(v);

// Also works with single buffers
const_buffer cb(data, len);
print_buffers(cb);

Copy Semantics

Copies of a buffer sequence must reference the same underlying memory:

T t(u);
static_assert(const_buffer_sequence<T>);
assert(std::equal(
    buffers::begin(t), buffers::end(t),
    buffers::begin(u), buffers::end(u),
    [](const_buffer const& b1, const_buffer const& b2)
    {
        return b1.data() == b2.data() && b1.size() == b2.size();
    }));

This property enables efficient pass-by-value semantics. Copying a buffer sequence is cheap because only the handle is copied, not the underlying data.

Models

The following types model ConstBufferSequence:

See Also