cMHN 1.1
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
view.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_CORE_TENSOR_VIEWS_VIEW_H
4#define pRC_CORE_TENSOR_VIEWS_VIEW_H
5
14
15namespace pRC::TensorViews
16{
17 template<class T, Size... Ns, class F>
18 class View<T, Sizes<Ns...>, F> : public CRTP<F>
19 {
20 static_assert(IsValue<T>() || IsComplex<T>(),
21 "Tensor<T, Ns..>: T has to be of type Value, Complex, or Bool.");
22
23 public:
24 using Type = T;
25 template<class C>
26 using ChangeType = Tensor<C, Ns...>;
27
29
30 using Sizes = pRC::Sizes<Ns...>;
31 template<Size... Ss>
32 using ChangeSizes = Tensor<T, Ss...>;
33
34 using Dimension = typename Sizes::Dimension;
35
36 using Value = typename T::Value;
37 template<class V, If<IsValue<V>> = 0>
39
40 using Signed = typename T::Signed;
41 template<Bool R>
44
45 using Width = typename T::Width;
46 template<Size Q>
48
50 using Complexify = Tensor<typename T::Complexify, Ns...>;
51 using NonComplex = Tensor<typename T::NonComplex, Ns...>;
52
53 template<class E = typename Sizes::IsLinearizable, If<E> = 0>
54 static constexpr auto size()
55 {
56 return Sizes::size();
57 }
58
59 static constexpr auto size(Index const dimension)
60 {
61 return Sizes::size(dimension);
62 }
63
64 template<class X, class... Is, If<IsConstructible<T, X>> = 0,
66 If<IsSatisfied<(sizeof...(Is) == Dimension())>> = 0>
67 static constexpr auto Single(X &&value, Is const... indices)
68 {
69 return Tensor<T, Ns...>::Single(forward<X>(value), indices...);
70 }
71
72 template<class X, If<IsConstructible<T, X>> = 0>
73 static constexpr auto Single(X &&value, Subscripts const &subscripts)
74 {
75 return Tensor<T, Ns...>::Single(forward<X>(value), subscripts);
76 }
77
78 public:
79 template<class... Is, If<All<IsConvertible<Is, Index>...>> = 0,
80 If<IsSatisfied<(sizeof...(Is) == Dimension())>> = 0>
81 constexpr decltype(auto) operator()(Is const... indices)
82 {
83 return (this->self())(indices...);
84 }
85
86 template<class... Is, If<All<IsConvertible<Is, Index>...>> = 0,
87 If<IsSatisfied<(sizeof...(Is) == Dimension())>> = 0>
88 constexpr decltype(auto) operator()(Is const... indices) const
89 {
90 return (this->self())(indices...);
91 }
92
93 constexpr decltype(auto) operator()(Subscripts const &subscripts)
94 {
95 return (this->self())(subscripts);
96 }
97
98 constexpr decltype(auto) operator()(Subscripts const &subscripts) const
99 {
100 return (this->self())(subscripts);
101 }
102
103 template<class V = F, If<IsSubscriptable<V>> = 0>
104 constexpr decltype(auto) operator[](Index const index)
105 {
106 return (this->self())[index];
107 }
108
109 template<class V = F, If<IsSubscriptable<V>> = 0>
110 constexpr decltype(auto) operator[](Index const index) const
111 {
112 return (this->self())[index];
113 }
114
115 template<class E = IsSatisfied<(Dimension() == 0)>, If<E> = 0>
116 explicit constexpr operator T()
117 {
118 return operator()();
119 }
120
121 template<class E = IsSatisfied<(Dimension() == 0)>, If<E> = 0>
122 explicit constexpr operator T() const
123 {
124 return operator()();
125 }
126
127 protected:
128 ~View() = default;
129 constexpr View(View const &) = default;
130 constexpr View(View &&) = default;
131 constexpr View &operator=(View const &) = delete;
132 constexpr View &operator=(View &&) = delete;
133 constexpr View()
134 {
135 static_assert(IsInvocable<F, decltype(Ns)...>());
136 static_assert(IsInvocable<F, Subscripts>());
137 static_assert(IsBaseOf<View, F>());
138 }
139
140 constexpr decltype(auto) call(Subscripts const &subscripts)
141 {
142 return expand(
144 [this](auto const &subscripts,
145 auto const... seq) -> decltype(auto)
146 {
147 return (*this)(subscripts[seq]...);
148 },
149 subscripts);
150 }
151
152 constexpr decltype(auto) call(Subscripts const &subscripts) const
153 {
154 return expand(
156 [this](auto const &subscripts,
157 auto const... seq) -> decltype(auto)
158 {
159 return (*this)(subscripts[seq]...);
160 },
161 subscripts);
162 }
163 };
164}
165#endif // pRC_CORE_TENSOR_VIEWS_VIEW_H
Definition crtp.hpp:12
Float< W > NonComplex
Definition float.hpp:45
pRC::Constant< Size, W > Width
Definition float.hpp:39
Float< W > Value
Definition float.hpp:31
Complex< Float< W > > Complexify
Definition float.hpp:44
False<> IsComplexified
Definition float.hpp:43
True<> Signed
Definition float.hpp:35
Definition sequence.hpp:56
static constexpr auto size()
Definition sequence.hpp:88
Constant< Size, sizeof...(Ns)> Dimension
Definition sequence.hpp:74
Definition subscripts.hpp:20
constexpr View & operator=(View const &)=delete
static constexpr auto Single(X &&value, Is const ... indices)
Definition view.hpp:67
constexpr decltype(auto) call(Subscripts const &subscripts) const
Definition view.hpp:152
typename T::Width Width
Definition view.hpp:45
static constexpr auto Single(X &&value, Subscripts const &subscripts)
Definition view.hpp:73
static constexpr auto size(Index const dimension)
Definition view.hpp:59
constexpr View()
Definition view.hpp:133
typename T::IsComplexified IsComplexified
Definition view.hpp:49
static constexpr auto size()
Definition view.hpp:54
constexpr View(View const &)=default
constexpr decltype(auto) operator()(Is const ... indices) const
Definition view.hpp:88
typename T::Signed Signed
Definition view.hpp:40
constexpr decltype(auto) call(Subscripts const &subscripts)
Definition view.hpp:140
constexpr decltype(auto) operator()(Is const ... indices)
Definition view.hpp:81
constexpr View & operator=(View &&)=delete
typename T::Value Value
Definition view.hpp:36
typename Sizes::Dimension Dimension
Definition view.hpp:34
Definition type_traits.hpp:32
Definition tensor.hpp:28
static constexpr auto Single(X &&value, Is const ... indices)
Definition tensor.hpp:78
pRC::Float<> T
Definition externs_nonTT.hpp:1
Definition diagonal.hpp:11
static constexpr auto makeConstantSequence()
Definition sequence.hpp:402
Size Index
Definition type_traits.hpp:21
std::size_t Size
Definition type_traits.hpp:20
std::enable_if_t< B{}, int > If
Definition type_traits.hpp:68
Constant< Bool, B > IsSatisfied
Definition type_traits.hpp:71
static constexpr decltype(auto) expand(Sequence< T, Seq... > const, F &&f, Xs &&...args)
Definition sequence.hpp:344
std::is_invocable< F, Args... > IsInvocable
Definition type_traits.hpp:134
Definition type_traits.hpp:15