Skip to content

Commit f786365

Browse files
committed
refactor: add specific slice concepts and replace traits with fold expressions
1 parent ab17eef commit f786365

File tree

2 files changed

+48
-72
lines changed

2 files changed

+48
-72
lines changed

include/xtensor/views/xslice.hpp

Lines changed: 47 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

include/xtensor/views/xview.hpp

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -135,27 +135,12 @@ namespace xt
135135
: false;
136136
};
137137

138-
template <class S>
139-
struct is_strided_slice_impl : std::true_type
140-
{
141-
};
142-
143-
template <class T>
144-
struct is_strided_slice_impl<xkeep_slice<T>> : std::false_type
145-
{
146-
};
147-
148-
template <class T>
149-
struct is_strided_slice_impl<xdrop_slice<T>> : std::false_type
150-
{
151-
};
152-
153138
// If we have no discontiguous slices, we can calculate strides for this view.
154139
template <class E, class... S>
155140
struct is_strided_view
156141
: std::integral_constant<
157142
bool,
158-
std::conjunction<has_data_interface<E>, is_strided_slice_impl<std::decay_t<S>>...>::value>
143+
has_data_interface<E>::value && (strided_compatible_concept<std::decay_t<S>> && ...)>
159144
{
160145
};
161146

0 commit comments

Comments
 (0)