1#ifndef TATOOINE_TENSOR_TYPE_TRAITS_H
2#define TATOOINE_TENSOR_TYPE_TRAITS_H
8template <
typename Tensor>
11template <static_tensor Tensor>
13 : std::integral_constant<std::size_t, std::decay_t<Tensor>::rank()> {};
15template <arithmetic_or_complex Tensor>
18template <arithmetic_or_complex T, std::
size_t N>
20 : std::integral_constant<std::size_t, 1> {};
28template <static_tensor Tensor>
30 : std::integral_constant<std::size_t,
31 std::decay_t<Tensor>::num_components()> {};
33template <arithmetic_or_complex T>
37template <arithmetic_or_complex T, std::
size_t N>
39 : std::integral_constant<std::size_t, N> {};
48template <static_tensor Tensor>
50 static auto constexpr value = std::decay_t<Tensor>::dimensions();
53template <arithmetic_or_complex T, std::
size_t N>
55 static auto constexpr value = std::array{N};
61template <
typename T, std::
size_t I>
64template <static_tensor Tensor, std::
size_t I>
65requires(I < tensor_rank<Tensor>)
67 static auto constexpr value = std::decay_t<Tensor>::dimension(I);
70template <arithmetic_or_complex T, std::
size_t I>
72 static auto constexpr value = std::numeric_limits<T>::max();
75template <arithmetic_or_complex T, std::
size_t N>
77 static auto constexpr value = N;
80template <
typename T, std::
size_t I>
Definition: algorithm.h:6
static auto constexpr tensor_num_components
Definition: tensor_type_traits.h:42
static constexpr auto tensor_rank
Definition: tensor_type_traits.h:23
static auto constexpr tensor_dimensions
Definition: tensor_type_traits.h:59
static auto constexpr tensor_dimension
Definition: tensor_type_traits.h:81
Definition: tensor_type_traits.h:62
Definition: tensor_type_traits.h:46
Definition: tensor_type_traits.h:26
Definition: tensor_type_traits.h:9