@@ -61,38 +61,25 @@ namespace xt
6161
6262 namespace detail
6363 {
64- template <class S >
65- struct is_xslice_impl : std::false_type
66- {
67- };
68-
69- template <class T >
70- struct is_xslice_impl <xrange<T>> : std::true_type
71- {
72- };
73-
74- template <class T >
75- struct is_xslice_impl <xstepped_range<T>> : std::true_type
76- {
77- };
78-
79- template <class T >
80- struct is_xslice_impl <xall<T>> : std::true_type
64+ template <class S , template <class > class SliceType >
65+ struct is_specific_slice_impl : std::false_type
8166 {
8267 };
8368
84- template <class T >
85- struct is_xslice_impl <xnewaxis <T>> : std::true_type
69+ template <class T , template < class > class SliceType >
70+ struct is_specific_slice_impl <SliceType <T>, SliceType > : std::true_type
8671 {
8772 };
8873
89- template <class T >
90- struct is_xslice_impl <xkeep_slice<T>> : std::true_type
91- {
92- };
93-
94- template <class T >
95- struct is_xslice_impl <xdrop_slice<T>> : std::true_type
74+ template <class S >
75+ struct is_xslice_impl : std::disjunction<
76+ is_specific_slice_impl<S, xrange>,
77+ is_specific_slice_impl<S, xstepped_range>,
78+ is_specific_slice_impl<S, xall>,
79+ is_specific_slice_impl<S, xnewaxis>,
80+ is_specific_slice_impl<S, xkeep_slice>,
81+ is_specific_slice_impl<S, xdrop_slice>
82+ >
9683 {
9784 };
9885 }
@@ -105,6 +92,36 @@ namespace xt
10592 template <class S >
10693 concept xslice_concept = is_xslice<S>::value;
10794
95+ template <class S >
96+ concept xrange_concept = detail::is_specific_slice_impl<std::remove_cvref_t <S>, xrange>::value;
97+
98+ template <class S >
99+ concept xstepped_range_concept = detail::is_specific_slice_impl<std::remove_cvref_t <S>, xstepped_range>::value;
100+
101+ template <class S >
102+ concept xall_concept = detail::is_specific_slice_impl<std::remove_cvref_t <S>, xall>::value;
103+
104+ template <class S >
105+ concept xnewaxis_concept = detail::is_specific_slice_impl<std::remove_cvref_t <S>, xnewaxis>::value;
106+
107+ template <class S >
108+ concept xkeep_slice_concept = detail::is_specific_slice_impl<std::remove_cvref_t <S>, xkeep_slice>::value;
109+
110+ template <class S >
111+ concept xdrop_slice_concept = detail::is_specific_slice_impl<std::remove_cvref_t <S>, xdrop_slice>::value;
112+
113+ template <class S >
114+ concept nonstrided_slice_concept = xkeep_slice_concept<S> || xdrop_slice_concept<S>;
115+
116+ template <class S >
117+ concept strided_slice_concept = xslice_concept<S> && !nonstrided_slice_concept<S>;
118+
119+ template <class S >
120+ concept slice_or_scalar_concept = xslice_concept<S> || xtl::integral_concept<S>;
121+
122+ template <class S >
123+ concept strided_compatible_concept = slice_or_scalar_concept<S> && !nonstrided_slice_concept<S>;
124+
108125 template <class ... E>
109126 using has_xslice = std::disjunction<is_xslice<E>...>;
110127
@@ -348,19 +365,6 @@ namespace xt
348365 template <class T >
349366 class xkeep_slice ;
350367
351- namespace detail
352- {
353- template <class T >
354- struct is_xkeep_slice : std::false_type
355- {
356- };
357-
358- template <class T >
359- struct is_xkeep_slice <xkeep_slice<T>> : std::true_type
360- {
361- };
362- }
363-
364368 template <class T >
365369 class xkeep_slice
366370 {
@@ -372,7 +376,7 @@ namespace xt
372376
373377 template <class C >
374378 explicit xkeep_slice (C& cont)
375- requires(!detail::is_xkeep_slice<std:: decay_t <C>>::value );
379+ requires(!xkeep_slice_concept<C> );
376380 explicit xkeep_slice (container_type&& cont);
377381
378382 template <class S >
@@ -456,19 +460,6 @@ namespace xt
456460 template <class T >
457461 class xdrop_slice ;
458462
459- namespace detail
460- {
461- template <class T >
462- struct is_xdrop_slice : std::false_type
463- {
464- };
465-
466- template <class T >
467- struct is_xdrop_slice <xdrop_slice<T>> : std::true_type
468- {
469- };
470- }
471-
472463 template <class T >
473464 class xdrop_slice
474465 {
@@ -480,7 +471,7 @@ namespace xt
480471
481472 template <class C >
482473 explicit xdrop_slice (C& cont)
483- requires(!detail::is_xdrop_slice<std:: decay_t <C>>::value );
474+ requires(!xdrop_slice_concept<C> );
484475 explicit xdrop_slice (container_type&& cont);
485476
486477 template <class S >
@@ -1307,7 +1298,7 @@ namespace xt
13071298 template <class T >
13081299 template <class C >
13091300 inline xkeep_slice<T>::xkeep_slice(C& cont)
1310- requires (!detail::is_xkeep_slice<std:: decay_t <C>>::value )
1301+ requires (!xkeep_slice_concept<C> )
13111302 : m_raw_indices(cont.begin(), cont.end())
13121303 {
13131304 }
@@ -1451,7 +1442,7 @@ namespace xt
14511442 template <class T >
14521443 template <class C >
14531444 inline xdrop_slice<T>::xdrop_slice(C& cont)
1454- requires (!detail::is_xdrop_slice<std:: decay_t <C>>::value )
1445+ requires (!xdrop_slice_concept<C> )
14551446 : m_raw_indices(cont.begin(), cont.end())
14561447 {
14571448 }
0 commit comments