cMHN 1.2
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
11
12namespace pRC::TensorViews
13{
14 template<class T, Size... Ns, class F>
15 requires IsDefined<Tensor<T, Ns...>>
16 class View<T, Sizes<Ns...>, F> : public CRTP<F>
17 {
18 public:
19 using Type = T;
20 template<class C>
21 using ChangeType = Tensor<C, Ns...>;
22
23 using Sizes = pRC::Sizes<Ns...>;
24 template<Size... Ss>
25 using ChangeSizes = Tensor<T, Ss...>;
26
28
29 static constexpr auto Dimension = Sizes::Dimension;
30
31 static constexpr auto size()
32 {
33 return Sizes::size();
34 }
35
36 static constexpr auto size(Index const dimension)
37 {
38 return Sizes::size(dimension);
39 }
40
41 template<class X, IsConvertible<Index>... Is>
42 requires IsConstructible<T, X> && (sizeof...(Is) == Dimension)
43 static constexpr auto Single(X &&value, Is const... indices)
44 {
45 return Tensor<T, Ns...>::Single(forward<X>(value), indices...);
46 }
47
48 template<class X>
50 static constexpr auto Single(X &&value, Subscripts const &subscripts)
51 {
52 return Tensor<T, Ns...>::Single(forward<X>(value), subscripts);
53 }
54
55 public:
56 template<IsConvertible<Index>... Is>
57 requires(sizeof...(Is) == Dimension)
58 constexpr decltype(auto) operator()(Is const... indices)
59 {
60 return (this->self())(indices...);
61 }
62
63 template<IsConvertible<Index>... Is>
64 requires(sizeof...(Is) == Dimension)
65 constexpr decltype(auto) operator()(Is const... indices) const
66 {
67 return (this->self())(indices...);
68 }
69
70 constexpr decltype(auto) operator()(Subscripts const &subscripts)
71 {
72 return (this->self())(subscripts);
73 }
74
75 constexpr decltype(auto) operator()(Subscripts const &subscripts) const
76 {
77 return (this->self())(subscripts);
78 }
79
80 constexpr decltype(auto) operator[](Index const index)
81 requires IsSubscriptable<F>
82 {
83 return (this->self())[index];
84 }
85
86 constexpr decltype(auto) operator[](Index const index) const
87 requires IsSubscriptable<F>
88 {
89 return (this->self())[index];
90 }
91
92 explicit constexpr operator T()
93 requires(Dimension == 0)
94 {
95 return operator()();
96 }
97
98 explicit constexpr operator T() const
99 requires(Dimension == 0)
100 {
101 return operator()();
102 }
103
104 explicit constexpr operator Bool()
105 requires IsSame<T, Bool> && (Dimension > 0)
106 {
107 return static_cast<Bool>(eval(*this));
108 }
109
110 explicit constexpr operator Bool() const
111 requires IsSame<T, Bool> && (Dimension > 0)
112 {
113 return static_cast<Bool>(eval(*this));
114 }
115
116 protected:
117 ~View() = default;
118 constexpr View(View const &) = default;
119 constexpr View(View &&) = default;
120 constexpr View &operator=(View const &) = delete;
121 constexpr View &operator=(View &&) = delete;
122 constexpr View() = default;
123
124 template<IsConvertible<Index>... Is>
125 requires(sizeof...(Is) == Dimension)
126 constexpr decltype(auto) call(Is const... indices)
127 {
128 return (*this)(Subscripts(indices...));
129 }
130
131 template<IsConvertible<Index>... Is>
132 requires(sizeof...(Is) == Dimension)
133 constexpr decltype(auto) call(Is const... indices) const
134 {
135 return (*this)(Subscripts(indices...));
136 }
137
138 constexpr decltype(auto) call(Subscripts const &subscripts)
139 {
140 return expand(
142 [this](auto const &subscripts,
143 auto const... seq) -> decltype(auto)
144 {
145 return (*this)(subscripts[seq]...);
146 },
147 subscripts);
148 }
149
150 constexpr decltype(auto) call(Subscripts const &subscripts) const
151 {
152 return expand(
154 [this](auto const &subscripts,
155 auto const... seq) -> decltype(auto)
156 {
157 return (*this)(subscripts[seq]...);
158 },
159 subscripts);
160 }
161 };
162}
163#endif // pRC_CORE_TENSOR_VIEWS_VIEW_H
Definition crtp.hpp:12
Definition value.hpp:12
Definition sequence.hpp:29
static constexpr Size Dimension
Definition sequence.hpp:47
static constexpr auto size()
Definition sequence.hpp:69
Definition subscripts.hpp:21
Definition single.hpp:13
constexpr View & operator=(View const &)=delete
constexpr decltype(auto) call(Subscripts const &subscripts) const
Definition view.hpp:150
static constexpr auto size(Index const dimension)
Definition view.hpp:36
static constexpr auto size()
Definition view.hpp:31
constexpr decltype(auto) call(Is const ... indices)
Definition view.hpp:126
constexpr decltype(auto) call(Is const ... indices) const
Definition view.hpp:133
constexpr View(View const &)=default
constexpr decltype(auto) call(Subscripts const &subscripts)
Definition view.hpp:138
static constexpr auto Single(X &&value, Subscripts const &subscripts)
Definition view.hpp:50
constexpr View & operator=(View &&)=delete
Definition declarations.hpp:20
Definition tensor.hpp:25
static constexpr auto Single(X &&value, Is const ... indices)
Definition tensor.hpp:51
Definition concepts.hpp:37
Definition concepts.hpp:28
Definition subscript.hpp:21
pRC::Float<> T
Definition externs_nonTT.hpp:1
int value
Definition gmock-actions_test.cc:1714
Definition declarations.hpp:18
bool Bool
Definition basics.hpp:29
Size Index
Definition basics.hpp:32
std::size_t Size
Definition basics.hpp:31
static constexpr auto makeSeriesFor()
Definition sequence.hpp:399
Tensor(TensorViews::View< T, Sizes< Ns... >, F > const &) -> Tensor< T, Ns... >
static constexpr decltype(auto) expand(Sequence< T, Seq... > const, F &&f, Xs &&...args)
Definition sequence.hpp:383
static constexpr decltype(auto) eval(X &&a)
Definition eval.hpp:12
Definition gtest_pred_impl_unittest.cc:54