diff --git a/include/etl/span.h b/include/etl/span.h index c6f18799..8f57148f 100644 --- a/include/etl/span.h +++ b/include/etl/span.h @@ -1258,6 +1258,18 @@ namespace etl span(const etl::array&) -> span; + // Forward declaration of etl::ivector + template + class ivector; + + template + span(etl::ivector&) + -> span; + + template + span(const etl::ivector&) + -> span; + #if ETL_USING_STL && ETL_USING_CPP11 template span(std::array&) diff --git a/test/test_span_dynamic_extent.cpp b/test/test_span_dynamic_extent.cpp index e9045504..7fc1c8c0 100644 --- a/test/test_span_dynamic_extent.cpp +++ b/test/test_span_dynamic_extent.cpp @@ -31,6 +31,7 @@ SOFTWARE. #include "etl/span.h" #include "etl/array.h" #include "etl/unaligned_type.h" +#include "etl/vector.h" #include #include @@ -778,6 +779,92 @@ namespace CHECK((std::is_same_v>)); } + //************************************************************************* + TEST(test_template_deduction_guide_for_etl_vector) + { + const size_t max_size = 10; + const size_t size = 4; + + int buffer1[max_size]; + int buffer2[max_size]; + int * buffer3[max_size]; + int * buffer4[max_size]; + const int * buffer5[max_size]; + const int * buffer6[max_size]; + + etl::vector data(size, 0); + const etl::vector data2(size, 0); + etl::vector_ext data_ext(size, 0, buffer1, max_size); + const etl::vector_ext data2_ext(size, 0, buffer2, max_size); + + etl::span span = data; + etl::span span2 = data2; + etl::span span_ext = data_ext; + etl::span span2_ext = data2_ext; + + CHECK_EQUAL(etl::dynamic_extent, span.extent); + CHECK_EQUAL(ETL_OR_STD17::size(data), span.size()); + CHECK_EQUAL(etl::dynamic_extent, span2.extent); + CHECK_EQUAL(ETL_OR_STD17::size(data2), span2.size()); + CHECK_EQUAL(etl::dynamic_extent, span_ext.extent); + CHECK_EQUAL(ETL_OR_STD17::size(data_ext), span_ext.size()); + CHECK_EQUAL(etl::dynamic_extent, span2_ext.extent); + CHECK_EQUAL(ETL_OR_STD17::size(data2_ext), span2_ext.size()); + + CHECK((std::is_same_v>)); + CHECK((std::is_same_v>)); + CHECK((std::is_same_v>)); + CHECK((std::is_same_v>)); + + etl::vector pdata(size, nullptr); + const etl::vector pdata2(size, nullptr); + etl::vector pdata3(size, nullptr); + const etl::vector pdata4(size, nullptr); + + etl::span pspan = pdata; + etl::span pspan2 = pdata2; + etl::span pspan3 = pdata3; + etl::span pspan4 = pdata4; + + CHECK_EQUAL(etl::dynamic_extent, pspan.extent); + CHECK_EQUAL(ETL_OR_STD17::size(pdata), pspan.size()); + CHECK_EQUAL(etl::dynamic_extent, pspan2.extent); + CHECK_EQUAL(ETL_OR_STD17::size(pdata2), pspan2.size()); + CHECK_EQUAL(etl::dynamic_extent, pspan3.extent); + CHECK_EQUAL(ETL_OR_STD17::size(pdata3), pspan3.size()); + CHECK_EQUAL(etl::dynamic_extent, pspan4.extent); + CHECK_EQUAL(ETL_OR_STD17::size(pdata4), pspan4.size()); + + CHECK((std::is_same_v>)); + CHECK((std::is_same_v>)); + CHECK((std::is_same_v>)); + CHECK((std::is_same_v>)); + + etl::vector_ext pdata_ext(size, nullptr, buffer3, max_size); + const etl::vector_ext pdata2_ext(size, nullptr, buffer4, max_size); + etl::vector_ext pdata3_ext(size, nullptr, buffer5, max_size); + const etl::vector_ext pdata4_ext(size, nullptr, buffer6, max_size); + + etl::span pspan_ext = pdata_ext; + etl::span pspan2_ext = pdata2_ext; + etl::span pspan3_ext = pdata3_ext; + etl::span pspan4_ext = pdata4_ext; + + CHECK_EQUAL(etl::dynamic_extent, pspan_ext.extent); + CHECK_EQUAL(ETL_OR_STD17::size(pdata_ext), pspan_ext.size()); + CHECK_EQUAL(etl::dynamic_extent, pspan2_ext.extent); + CHECK_EQUAL(ETL_OR_STD17::size(pdata2_ext), pspan2_ext.size()); + CHECK_EQUAL(etl::dynamic_extent, pspan3_ext.extent); + CHECK_EQUAL(ETL_OR_STD17::size(pdata3_ext), pspan3_ext.size()); + CHECK_EQUAL(etl::dynamic_extent, pspan4_ext.extent); + CHECK_EQUAL(ETL_OR_STD17::size(pdata4_ext), pspan4_ext.size()); + + CHECK((std::is_same_v>)); + CHECK((std::is_same_v>)); + CHECK((std::is_same_v>)); + CHECK((std::is_same_v>)); + } + //************************************************************************* TEST(test_template_deduction_guide_for_iterators) {