10#ifndef XTENSOR_VIEW_UTILS_HPP
11#define XTENSOR_VIEW_UTILS_HPP
15#include "../core/xlayout.hpp"
16#include "../core/xtensor_forward.hpp"
17#include "../views/xslice.hpp"
28 constexpr std::size_t integral_count();
32 constexpr std::size_t integral_count_before(std::size_t i);
36 constexpr std::size_t integral_skip(std::size_t i);
40 constexpr std::size_t newaxis_count();
44 constexpr std::size_t newaxis_count_before(std::size_t i);
48 constexpr std::size_t newaxis_skip(std::size_t i);
50 template <
class S,
class It>
51 inline auto get_slice_value(
const S& slice, It& it)
noexcept
53 if constexpr (is_xslice<S>::value)
55 return slice(
typename S::size_type(*it));
59 return static_cast<std::size_t
>(slice);
69 template <
class T,
class S,
layout_type L,
class... SL>
70 struct view_temporary_type_impl
75 template <
class T,
class I, std::size_t N,
layout_type L,
class... SL>
76 struct view_temporary_type_impl<T, std::array<I, N>, L, SL...>
78 using type =
xt::xtensor<T, N + newaxis_count<SL...>() - integral_count<SL...>(), L>;
82 template <
class E,
class... SL>
85 using type =
typename detail::view_temporary_type_impl<
86 std::decay_t<typename E::value_type>,
87 typename E::shape_type,
92 template <
class E,
class... SL>
102 template <
class T,
class... S>
103 struct integral_count_impl
105 static constexpr std::size_t count(std::size_t i)
noexcept
108 ? (integral_count_impl<S...>::count(i - 1)
109 + (xtl::is_integral<std::remove_reference_t<T>>::value ? 1 : 0))
115 struct integral_count_impl<void>
117 static constexpr std::size_t count(std::size_t )
noexcept
124 template <
class... S>
125 constexpr std::size_t integral_count()
127 return detail::integral_count_impl<S..., void>::count(
sizeof...(S));
130 template <
class... S>
131 constexpr std::size_t integral_count_before(std::size_t i)
133 return detail::integral_count_impl<S..., void>::count(i);
143 struct is_newaxis : std::false_type
148 struct is_newaxis<xnewaxis<T>> :
public std::true_type
153 constexpr bool is_newaxis_v = is_newaxis<T>::value;
155 template <
class T,
class... S>
156 struct newaxis_count_impl
158 static constexpr std::size_t count(std::size_t i)
noexcept
161 ? (newaxis_count_impl<S...>::count(i - 1)
162 + (is_newaxis<std::remove_reference_t<T>>::value ? 1 : 0))
168 struct newaxis_count_impl<void>
170 static constexpr std::size_t count(std::size_t )
noexcept
177 template <
class... S>
178 constexpr std::size_t newaxis_count()
180 return detail::newaxis_count_impl<S..., void>::count(
sizeof...(S));
183 template <
class... S>
184 constexpr std::size_t newaxis_count_before(std::size_t i)
186 return detail::newaxis_count_impl<S..., void>::count(i);
196 template <
class T,
class... S>
197 struct integral_skip_impl
199 static constexpr std::size_t count(std::size_t i)
noexcept
201 return i == 0 ? count_impl() : count_impl(i);
206 static constexpr std::size_t count_impl(std::size_t i)
noexcept
209 + (xtl::is_integral<std::remove_reference_t<T>>::value
210 ? integral_skip_impl<S...>::count(i)
211 : integral_skip_impl<S...>::count(i - 1));
214 static constexpr std::size_t count_impl() noexcept
216 return xtl::is_integral<std::remove_reference_t<T>>::value
217 ? 1 + integral_skip_impl<S...>::count(0)
223 struct integral_skip_impl<void>
225 static constexpr std::size_t count(std::size_t i)
noexcept
232 template <
class... S>
233 constexpr std::size_t integral_skip(std::size_t i)
235 return detail::integral_skip_impl<S..., void>::count(i);
245 template <
class T,
class... S>
246 struct newaxis_skip_impl
248 static constexpr std::size_t count(std::size_t i)
noexcept
250 return i == 0 ? count_impl() : count_impl(i);
255 static constexpr std::size_t count_impl(std::size_t i)
noexcept
258 + (is_newaxis<std::remove_reference_t<T>>::value
259 ? newaxis_skip_impl<S...>::count(i)
260 : newaxis_skip_impl<S...>::count(i - 1));
263 static constexpr std::size_t count_impl() noexcept
265 return is_newaxis<std::remove_reference_t<T>>::value ? 1 + newaxis_skip_impl<S...>::count(0)
271 struct newaxis_skip_impl<void>
273 static constexpr std::size_t count(std::size_t i)
noexcept
280 template <
class... S>
281 constexpr std::size_t newaxis_skip(std::size_t i)
283 return detail::newaxis_skip_impl<S..., void>::count(i);
standard mathematical functions for xexpressions
xarray_container< uvector< T, A >, L, xt::svector< typename uvector< T, A >::size_type, 4, SA, true > > xarray
Alias template on xarray_container with default parameters for data container type and shape / stride...
xtensor_container< uvector< T, A >, N, L > xtensor
Alias template on xtensor_container with default parameters for data container type.