pRC
multi-purpose Tensor Train library for C++
Loading...
Searching...
No Matches
view_bool.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_CORE_TENSOR_VIEWS_VIEW_BOOL_H
4#define pRC_CORE_TENSOR_VIEWS_VIEW_BOOL_H
5
11
12namespace pRC::TensorViews
13{
14 template<Size... Ns, class F>
15 class View<Bool, Sizes<Ns...>, F> : public CRTP<F>
16 {
17
18 public:
19 using Type = Bool;
20 template<class C>
21 using ChangeType = Tensor<C, Ns...>;
22
24
25 using Sizes = pRC::Sizes<Ns...>;
26 template<Size... Ss>
27 using ChangeSizes = Tensor<Bool, Ss...>;
28
29 using Dimension = typename Sizes::Dimension;
30
31 template<class E = typename Sizes::IsLinearizable, If<E> = 0>
32 static constexpr auto size()
33 {
34 return Sizes::size();
35 }
36
37 static constexpr auto size(Index const dimension)
38 {
39 return Sizes::size(dimension);
40 }
41
42 template<class X, class... Is, If<IsConstructible<Bool, X>> = 0,
44 If<IsSatisfied<(sizeof...(Is) == Dimension())>> = 0>
45 static constexpr auto Single(X &&value, Is const... indices)
46 {
48 }
49
50 template<class X, If<IsConstructible<Bool, X>> = 0>
51 static constexpr auto Single(X &&value, Subscripts const &subscripts)
52 {
54 }
55
56 public:
57 template<class... Is, If<All<IsConvertible<Is, Index>...>> = 0,
58 If<IsSatisfied<(sizeof...(Is) == Dimension())>> = 0>
59 constexpr decltype(auto) operator()(Is const... indices)
60 {
61 return (this->self())(indices...);
62 }
63
64 template<class... Is, If<All<IsConvertible<Is, Index>...>> = 0,
65 If<IsSatisfied<(sizeof...(Is) == Dimension())>> = 0>
66 constexpr decltype(auto) operator()(Is const... indices) const
67 {
68 return (this->self())(indices...);
69 }
70
71 constexpr decltype(auto) operator()(Subscripts const &subscripts)
72 {
73 return (this->self())(subscripts);
74 }
75
76 constexpr decltype(auto) operator()(Subscripts const &subscripts) const
77 {
78 return (this->self())(subscripts);
79 }
80
81 template<class V = F, If<IsSubscriptable<V>> = 0>
82 constexpr decltype(auto) operator[](Index const index)
83 {
84 return (this->self())[index];
85 }
86
87 template<class V = F, If<IsSubscriptable<V>> = 0>
88 constexpr decltype(auto) operator[](Index const index) const
89 {
90 return (this->self())[index];
91 }
92
93 explicit constexpr operator Bool()
94 {
95 return static_cast<Bool>(eval(*this));
96 }
97
98 explicit constexpr operator Bool() const
99 {
100 return static_cast<Bool>(eval(*this));
101 }
102
103 protected:
104 ~View() = default;
105 constexpr View(View const &) = default;
106 constexpr View(View &&) = default;
107 constexpr View &operator=(View const &) = delete;
108 constexpr View &operator=(View &&) = delete;
109 constexpr View()
110 {
111 static_assert(IsInvocable<F, decltype(Ns)...>());
112 static_assert(IsInvocable<F, Subscripts>());
113 static_assert(IsBaseOf<View, F>());
114 }
115
116 constexpr decltype(auto) call(Subscripts const &subscripts)
117 {
118 return expand(
120 [this](auto const &subscripts,
121 auto const... seq) -> decltype(auto)
122 {
123 return (*this)(subscripts[seq]...);
124 },
125 subscripts);
126 }
127
128 constexpr decltype(auto) call(Subscripts const &subscripts) const
129 {
130 return expand(
132 [this](auto const &subscripts,
133 auto const... seq) -> decltype(auto)
134 {
135 return (*this)(subscripts[seq]...);
136 },
137 subscripts);
138 }
139 };
140}
141#endif // pRC_CORE_TENSOR_VIEWS_VIEW_BOOL_H
Definition crtp.hpp:12
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
static constexpr auto Single(X &&value, Is const ... indices)
Definition view_bool.hpp:45
static constexpr auto Single(X &&value, Subscripts const &subscripts)
Definition view_bool.hpp:51
constexpr decltype(auto) call(Subscripts const &subscripts) const
Definition view_bool.hpp:128
constexpr decltype(auto) operator()(Is const ... indices) const
Definition view_bool.hpp:66
constexpr View()
Definition view_bool.hpp:109
constexpr View & operator=(View &&)=delete
constexpr View & operator=(View const &)=delete
static constexpr auto size()
Definition view_bool.hpp:32
constexpr decltype(auto) operator()(Is const ... indices)
Definition view_bool.hpp:59
constexpr decltype(auto) call(Subscripts const &subscripts)
Definition view_bool.hpp:116
static constexpr auto size(Index const dimension)
Definition view_bool.hpp:37
typename Sizes::Dimension Dimension
Definition view_bool.hpp:29
Definition type_traits.hpp:32
Class storing tensors.
Definition tensor.hpp:44
static constexpr auto Single(X &&value, Is const ... indices)
Returns a Tensor of the Tensor class with a single non-zero entry.
Definition tensor.hpp:120
Definition diagonal.hpp:11
static constexpr X eval(X &&a)
Definition eval.hpp:11
bool Bool
Definition type_traits.hpp:18
std::enable_if_t< B{}, int > If
Definition type_traits.hpp:68
std::size_t Size
Definition type_traits.hpp:20
std::is_invocable< F, Args... > IsInvocable
Definition type_traits.hpp:134
Constant< Bool, B > IsSatisfied
Definition type_traits.hpp:71
static constexpr Conditional< IsSatisfied< C >, RemoveConstReference< X >, X > copy(X &&a)
Definition copy.hpp:13
static constexpr decltype(auto) expand(Sequence< T, Seq... > const, F &&f, Xs &&...args)
forwards the values in a pRC::Sequence to a function as parameters
Definition sequence.hpp:354
Size Index
Definition type_traits.hpp:21