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
152 template <
class T,
class... S>
153 struct newaxis_count_impl
155 static constexpr std::size_t count(std::size_t i)
noexcept
158 ? (newaxis_count_impl<S...>::count(i - 1)
159 + (is_newaxis<std::remove_reference_t<T>>::value ? 1 : 0))
165 struct newaxis_count_impl<void>
167 static constexpr std::size_t count(std::size_t )
noexcept
174 template <
class... S>
175 constexpr std::size_t newaxis_count()
177 return detail::newaxis_count_impl<S..., void>::count(
sizeof...(S));
180 template <
class... S>
181 constexpr std::size_t newaxis_count_before(std::size_t i)
183 return detail::newaxis_count_impl<S..., void>::count(i);
193 template <
class T,
class... S>
194 struct integral_skip_impl
196 static constexpr std::size_t count(std::size_t i)
noexcept
198 return i == 0 ? count_impl() : count_impl(i);
203 static constexpr std::size_t count_impl(std::size_t i)
noexcept
206 + (xtl::is_integral<std::remove_reference_t<T>>::value
207 ? integral_skip_impl<S...>::count(i)
208 : integral_skip_impl<S...>::count(i - 1));
211 static constexpr std::size_t count_impl() noexcept
213 return xtl::is_integral<std::remove_reference_t<T>>::value
214 ? 1 + integral_skip_impl<S...>::count(0)
220 struct integral_skip_impl<void>
222 static constexpr std::size_t count(std::size_t i)
noexcept
229 template <
class... S>
230 constexpr std::size_t integral_skip(std::size_t i)
232 return detail::integral_skip_impl<S..., void>::count(i);
242 template <
class T,
class... S>
243 struct newaxis_skip_impl
245 static constexpr std::size_t count(std::size_t i)
noexcept
247 return i == 0 ? count_impl() : count_impl(i);
252 static constexpr std::size_t count_impl(std::size_t i)
noexcept
255 + (is_newaxis<std::remove_reference_t<T>>::value
256 ? newaxis_skip_impl<S...>::count(i)
257 : newaxis_skip_impl<S...>::count(i - 1));
260 static constexpr std::size_t count_impl() noexcept
262 return is_newaxis<std::remove_reference_t<T>>::value ? 1 + newaxis_skip_impl<S...>::count(0)
268 struct newaxis_skip_impl<void>
270 static constexpr std::size_t count(std::size_t i)
noexcept
277 template <
class... S>
278 constexpr std::size_t newaxis_skip(std::size_t i)
280 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.