@@ -55,6 +55,20 @@ SOFTWARE.
5555
5656namespace 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 // *************************************************************************
0 commit comments