cMHN 1.2
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
block.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_CORE_TENSOR_VIEWS_BLOCK_H
4#define pRC_CORE_TENSOR_VIEWS_BLOCK_H
5
10
11namespace pRC::TensorViews
12{
13 template<class T, class N, class B, class V>
14 class Block;
15
16 template<class T, Size... Ns, Size... Bs, class V>
17 requires IsTensorView<V>
18 class Block<T, Sizes<Ns...>, Sizes<Bs...>, V>
19 : public Conditional<IsAssignable<V>,
20 Assignable<T, Sizes<Ns...>,
21 Block<T, Sizes<Ns...>, Sizes<Bs...>, V>>,
22 View<T, Sizes<Ns...>, Block<T, Sizes<Ns...>, Sizes<Bs...>, V>>>
23 {
24 private:
26 Assignable<T, Sizes<Ns...>, Block>, View<T, Sizes<Ns...>, Block>>;
27
28 public:
29 template<class X>
31 Block(X &&a, Subscripts<Bs...> const &offsets)
32 : mA(forward<X>(a))
33 , mOffsets(offsets)
34 {
35 if constexpr(cDebugLevel >= DebugLevel::Low)
36 {
37 if(mOffsets.isOutOfRange())
38 {
39 Logging::error("Block offset indices out of range.");
40 }
41 }
42 }
43
44 using Base::operator=;
45
46 template<IsConvertible<Index>... Is>
47 requires(sizeof...(Is) == Base::Dimension)
48 constexpr decltype(auto) operator()(Is const... indices)
49 {
50 return this->call(indices...);
51 }
52
53 template<IsConvertible<Index>... Is>
54 requires(sizeof...(Is) == Base::Dimension)
55 constexpr decltype(auto) operator()(Is const... indices) const
56 {
57 return this->call(indices...);
58 }
59
60 constexpr decltype(auto) operator()(
61 typename Base::Subscripts const &subscripts)
62 {
64 [this, &subscripts](auto const... seq) -> decltype(auto)
65 {
66 return mA((mOffsets[seq] * Ns + subscripts[seq])...);
67 });
68 }
69
70 constexpr decltype(auto) operator()(
71 typename Base::Subscripts const &subscripts) const
72 {
74 [this, &subscripts](auto const... seq) -> decltype(auto)
75 {
76 return mA((mOffsets[seq] * Ns + subscripts[seq])...);
77 });
78 }
79
80 constexpr decltype(auto) operator[](Index const index) = delete;
81 constexpr decltype(auto) operator[](Index const index) const = delete;
82
83 private:
84 V mA;
85 BEGIN_IGNORE_DIAGNOSTIC_GCC("-Wpedantic")
86 Subscripts<Bs...> const mOffsets;
88 };
89}
90#endif // pRC_CORE_TENSOR_VIEWS_BLOCK_H
Definition gtest_unittest.cc:5120
Definition value.hpp:12
Definition sequence.hpp:29
Definition subscripts.hpp:21
Definition assignable.hpp:21
Block(X &&a, Subscripts< Bs... > const &offsets)
Definition block.hpp:31
Definition block.hpp:14
Definition declarations.hpp:20
Definition concepts.hpp:28
Definition declarations.hpp:36
pRC::Float<> T
Definition externs_nonTT.hpp:1
static void error(Xs &&...args)
Definition log.hpp:14
Definition declarations.hpp:18
Size Index
Definition basics.hpp:32
std::size_t Size
Definition basics.hpp:31
static constexpr auto makeSeriesFor()
Definition sequence.hpp:399
constexpr auto cDebugLevel
Definition config.hpp:48
std::conditional_t< B, T, F > Conditional
Definition basics.hpp:56
static constexpr decltype(auto) expand(Sequence< T, Seq... > const, F &&f, Xs &&...args)
Definition sequence.hpp:383
#define BEGIN_IGNORE_DIAGNOSTIC_GCC(warning)
Definition pragma.hpp:42
#define END_IGNORE_DIAGNOSTIC_GCC
Definition pragma.hpp:43