Ruben Perez wrote:
6) Can I write types that satisfy ConstBufferSequence or DynamicBuffer without explicitly depending on Capy? This would be useful for low-level protocol libraries that want to take as few dependencies as possible. Setting the concrete const_buffer and mutable_buffer types apart, the usual way of representing "raw bytes" would be span<const unsigned char>/span<std::byte>. For instance, std::as_bytes [12] uses std::byte. If I got the reasoning behind ConstBufferSequence right [13], the purpose is to avoid allocations with vectored I/O. I'd say it's reasonable to allow std::array<std::span<const unsigned char>> to satisfy ConstBufferSequence.
Note that I have read The Span Reflex [14]. I agree with the need of ConstBufferSequence. While I personally don't agree with the need of the concrete const_buffer and mutable_buffer types, I understand the rationale of avoiding std::byte. I'm not challenging these types, only asking for better compatibility with std::span.
I've never been particularly fond of the Asio requirement that buffers need to be convertible specifically to the concrete types const_buffer and mutable_buffer. (Among other things, this requires physical coupling.) It being 2026, maybe we should explore the more principled concept MutableBuffer; concept ConstBuffer; concept MutableBufferSequence = MutableBuffer or (Range of MutableBuffer); concept ConstBufferSequence = ConstBuffer or (Range of ConstBuffer); That's what we already have, so it's not that big of a leap; the only difference is how the MutableBuffer and ConstBuffer concepts are specified (via the convertibility requirement.) If we formalize the above, we'd then be able to explore more relaxed ConstBuffer and MutableBuffer concepts (ones that structurally match span<unsigned char> and span<byte>, for example.)