From 3ff6ca1efc8cc825d08f6b86d6897d85cde973a1 Mon Sep 17 00:00:00 2001 From: Roland Reichwein Date: Sun, 16 Aug 2026 17:31:19 +0200 Subject: [PATCH] Fix ambiguous byte_stream_reader construction from etl::span (#1537) Add unsigned char/const unsigned char span overloads to byte_stream_reader to match byte_stream_writer, resolving overload ambiguity (#1533). Add tests covering span construction for both classes. Co-authored-by: John Wellbelove --- include/etl/byte_stream.h | 22 ++++++++++++++++ test/test_byte_stream.cpp | 53 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/include/etl/byte_stream.h b/include/etl/byte_stream.h index 51dc9e92..76a4bf04 100644 --- a/include/etl/byte_stream.h +++ b/include/etl/byte_stream.h @@ -508,6 +508,28 @@ namespace etl { } + //*************************************************************************** + /// Construct from span. + //*************************************************************************** + byte_stream_reader(etl::span span_, etl::endian stream_endianness_) + : pdata(reinterpret_cast(span_.begin())) + , pcurrent(reinterpret_cast(span_.begin())) + , stream_length(span_.size_bytes()) + , stream_endianness(stream_endianness_) + { + } + + //*************************************************************************** + /// Construct from span. + //*************************************************************************** + byte_stream_reader(etl::span span_, etl::endian stream_endianness_) + : pdata(reinterpret_cast(span_.begin())) + , pcurrent(reinterpret_cast(span_.begin())) + , stream_length(span_.size_bytes()) + , stream_endianness(stream_endianness_) + { + } + //*************************************************************************** /// Construct from range. //*************************************************************************** diff --git a/test/test_byte_stream.cpp b/test/test_byte_stream.cpp index 06b2a453..514dbd81 100644 --- a/test/test_byte_stream.cpp +++ b/test/test_byte_stream.cpp @@ -188,6 +188,59 @@ namespace CHECK(reader_little.get_endianness() == etl::endian::little); } + //************************************************************************* + TEST(byte_stream_writer_construct_from_span) + { + char storage[8]; + + etl::span char_span(storage, storage + ETL_OR_STD17::size(storage)); + etl::byte_stream_writer writer_char(char_span, etl::endian::little); + CHECK_EQUAL(char_span.size(), writer_char.capacity()); + + etl::span uchar_span(reinterpret_cast(storage), ETL_OR_STD17::size(storage)); + etl::byte_stream_writer writer_uchar(uchar_span, etl::endian::little); + CHECK_EQUAL(uchar_span.size(), writer_uchar.capacity()); + } + + //************************************************************************* + TEST(byte_stream_reader_construct_from_span) + { + char storage[8] = {0}; + + etl::span char_span(storage, storage + ETL_OR_STD17::size(storage)); + etl::byte_stream_reader reader_char(char_span, etl::endian::little); + CHECK_EQUAL(char_span.size(), reader_char.size_bytes()); + + etl::span const_char_span(storage, storage + ETL_OR_STD17::size(storage)); + etl::byte_stream_reader reader_const_char(const_char_span, etl::endian::little); + CHECK_EQUAL(const_char_span.size(), reader_const_char.size_bytes()); + + etl::span uchar_span(reinterpret_cast(storage), ETL_OR_STD17::size(storage)); + etl::byte_stream_reader reader_uchar(uchar_span, etl::endian::little); + CHECK_EQUAL(uchar_span.size(), reader_uchar.size_bytes()); + + etl::span const_uchar_span(reinterpret_cast(storage), ETL_OR_STD17::size(storage)); + etl::byte_stream_reader reader_const_uchar(const_uchar_span, etl::endian::little); + CHECK_EQUAL(const_uchar_span.size(), reader_const_uchar.size_bytes()); + } + + //************************************************************************* + // https://github.com/ETLCPP/etl/issues/1533 + // Passing an etl::span to byte_stream_writer/byte_stream_reader + // must not be ambiguous. + TEST(byte_stream_reader_writer_construct_from_span_uint8_t_no_ambiguity) + { + uint8_t storage[8] = {0}; + + etl::span data(storage, ETL_OR_STD17::size(storage)); + + etl::byte_stream_writer writer(etl::span(data), etl::endian::little); + etl::byte_stream_reader reader(etl::span(data), etl::endian::little); + + CHECK_EQUAL(data.size(), writer.capacity()); + CHECK_EQUAL(data.size(), reader.size_bytes()); + } + //************************************************************************* TEST(write_bool) {