Skip to content

Commit 3525c63

Browse files
authored
Bugfix: Issue 1212 span constructor (#1231)
* Quick fix for issue 1212 * #if macro around std array uses * Fix macro placement * Maybe size_t * Maybe SIZE_ * Check if old boost style works * Fix angle brackets * Cleanup traits and add const constructors * Add traits to C++03 constructors
1 parent 743ed78 commit 3525c63

File tree

2 files changed

+62
-1
lines changed

2 files changed

+62
-1
lines changed

include/etl/span.h

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,20 @@ SOFTWARE.
5555

5656
namespace etl
5757
{
58+
template <typename T> struct is_std_array : etl::false_type {};
59+
#if ETL_USING_STL && ETL_USING_CPP11
60+
template <typename T, size_t N> struct is_std_array<std::array<T, N>> : etl::true_type {};
61+
#endif
62+
template <typename T> struct is_std_array<const T> : is_std_array<T> {};
63+
template <typename T> struct is_std_array<volatile T> : is_std_array<T> {};
64+
template <typename T> struct is_std_array<const volatile T> : is_std_array<T> {};
65+
66+
template <typename T> struct is_etl_array : etl::false_type {};
67+
template <typename T, size_t N> struct is_etl_array<etl::array<T, N> > : etl::true_type {};
68+
template <typename T> struct is_etl_array<const T> : is_etl_array<T> {};
69+
template <typename T> struct is_etl_array<volatile T> : is_etl_array<T> {};
70+
template <typename T> struct is_etl_array<const volatile T> : is_etl_array<T> {};
71+
5872
//***************************************************************************
5973
// Tag to indicate a class is a span.
6074
//***************************************************************************
@@ -186,8 +200,10 @@ namespace etl
186200
/// data() and size() member functions.
187201
//*************************************************************************
188202
template <typename TContainer, typename = typename etl::enable_if<!etl::is_base_of<span_tag, etl::remove_reference_t<TContainer>>::value &&
203+
!etl::is_std_array<etl::remove_reference_t<TContainer>>::value &&
204+
!etl::is_etl_array<etl::remove_reference_t<TContainer>>::value &&
189205
!etl::is_pointer<etl::remove_reference_t<TContainer>>::value &&
190-
!etl::is_array<etl::remove_reference_t<TContainer>>::value&&
206+
!etl::is_array<etl::remove_reference_t<TContainer>>::value &&
191207
etl::is_same<etl::remove_cv_t<T>, etl::remove_cv_t<typename etl::remove_reference_t<TContainer>::value_type>>::value, void>::type>
192208
ETL_CONSTEXPR span(TContainer&& a) ETL_NOEXCEPT
193209
: pbegin(a.data())
@@ -200,6 +216,8 @@ namespace etl
200216
//*************************************************************************
201217
template <typename TContainer>
202218
span(TContainer& a, typename etl::enable_if<!etl::is_base_of<span_tag, typename etl::remove_reference<TContainer>::type>::value &&
219+
!etl::is_std_array<typename etl::remove_reference<TContainer>::type>::value &&
220+
!etl::is_etl_array<typename etl::remove_reference<TContainer>::type>::value &&
203221
!etl::is_pointer<typename etl::remove_reference<TContainer>::type>::value &&
204222
!etl::is_array<TContainer>::value &&
205223
etl::is_same<typename etl::remove_cv<T>::type, typename etl::remove_cv<typename etl::remove_reference<TContainer>::type::value_type>::type>::value, void>::type* = 0) ETL_NOEXCEPT
@@ -213,6 +231,8 @@ namespace etl
213231
//*************************************************************************
214232
template <typename TContainer>
215233
span(const TContainer& a, typename etl::enable_if<!etl::is_base_of<span_tag, typename etl::remove_reference<TContainer>::type>::value &&
234+
!etl::is_std_array<typename etl::remove_reference<TContainer>::type>::value &&
235+
!etl::is_etl_array<typename etl::remove_reference<TContainer>::type>::value &&
216236
!etl::is_pointer<typename etl::remove_reference<TContainer>::type>::value &&
217237
!etl::is_array<TContainer>::value&&
218238
etl::is_same<typename etl::remove_cv<T>::type, typename etl::remove_cv<typename etl::remove_reference<TContainer>::type::value_type>::type>::value, void>::type* = 0) ETL_NOEXCEPT
@@ -250,6 +270,44 @@ namespace etl
250270
ETL_ASSERT(other.size() == Extent, ETL_ERROR(span_size_mismatch));
251271
}
252272

273+
#if ETL_USING_STL && ETL_USING_CPP11
274+
//*************************************************************************
275+
/// Constructor from std array.
276+
//*************************************************************************
277+
template <typename U, size_t Size>
278+
ETL_CONSTEXPR span(std::array<U, Size>& other, typename etl::enable_if<Size == Extent, void>::type* = 0) ETL_NOEXCEPT
279+
: pbegin(other.data())
280+
{
281+
}
282+
283+
//*************************************************************************
284+
/// Constructor from const std array.
285+
//*************************************************************************
286+
template <typename U, size_t Size>
287+
ETL_CONSTEXPR span(const std::array<U, Size>& other, typename etl::enable_if<Size == Extent && etl::is_const<T>::value, void>::type* = 0) ETL_NOEXCEPT
288+
: pbegin(other.data())
289+
{
290+
}
291+
#endif
292+
293+
//*************************************************************************
294+
/// Constructor from etl array.
295+
//*************************************************************************
296+
template <typename U, size_t Size>
297+
ETL_CONSTEXPR span(etl::array<U, Size>& other, typename etl::enable_if<Size == Extent, void>::type* = 0) ETL_NOEXCEPT
298+
: pbegin(other.data())
299+
{
300+
}
301+
302+
//*************************************************************************
303+
/// Constructor from const etl array.
304+
//*************************************************************************
305+
template <typename U, size_t Size>
306+
ETL_CONSTEXPR span(const etl::array<U, Size>& other, typename etl::enable_if<Size == Extent && etl::is_const<T>::value, void>::type* = 0) ETL_NOEXCEPT
307+
: pbegin(other.data())
308+
{
309+
}
310+
253311
//*************************************************************************
254312
/// Returns a reference to the first element.
255313
//*************************************************************************

test/test_span_fixed_extent.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -848,12 +848,15 @@ namespace
848848
TEST(test_issue_486)
849849
{
850850
//std::array<char, 10> c;
851+
//etl::array<char, 10> c2;
851852

852853
// Should not compile.
853854
//etl::span<char, 11> value(c);
855+
//etl::span<char, 11> value2(c2);
854856

855857
// Should not compile.
856858
//f_issue_486(c);
859+
//f_issue_486(c2);
857860
}
858861

859862
//*************************************************************************

0 commit comments

Comments
 (0)