cMHN 1.1
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
9
10namespace pRC::TensorViews
11{
12 template<class T, class N, class B, class V>
13 class Block;
14
15 template<class T, Size... Ns, Size... Bs, class V>
16 class Block<T, Sizes<Ns...>, Sizes<Bs...>, V>
17 : public Conditional<IsAssignable<V>,
18 Assignable<T, Sizes<Ns...>,
19 Block<T, Sizes<Ns...>, Sizes<Bs...>, V>>,
20 View<T, Sizes<Ns...>, Block<T, Sizes<Ns...>, Sizes<Bs...>, V>>>
21 {
22 static_assert(IsTensorView<V>());
23
24 private:
25 using Base = Conditional<IsAssignable<V>,
26 Assignable<T, Sizes<Ns...>, Block>, View<T, Sizes<Ns...>, Block>>;
27
28 public:
29 template<class X, If<IsSame<V, RemoveReference<X>>> = 0>
31 : mA(forward<X>(a))
32 , mOffsets(offsets)
33 {
34 if constexpr(cDebugLevel >= DebugLevel::Low)
35 {
36 if(mOffsets.isOutOfRange())
37 {
38 Logging::error("Block offset indices out of range.");
39 }
40 }
41 }
42
43 using Base::operator=;
44
45 template<class... Is, If<All<IsConvertible<Is, Index>...>> = 0,
46 If<IsSatisfied<(sizeof...(Is) == typename Base::Dimension())>> = 0>
47 constexpr decltype(auto) operator()(Is const... indices)
48 {
49 return expand(
51 [this](auto const &indices, auto const... seq) -> decltype(auto)
52 {
53 return mA((mOffsets[seq] * Ns + indices[seq])...);
54 },
55 Indices<sizeof...(Is)>(indices...));
56 }
57
58 template<class... Is, If<All<IsConvertible<Is, Index>...>> = 0,
59 If<IsSatisfied<(sizeof...(Is) == typename Base::Dimension())>> = 0>
60 constexpr decltype(auto) operator()(Is const... indices) const
61 {
62 return expand(
64 [this](auto const &indices, auto const... seq) -> decltype(auto)
65 {
66 return mA((mOffsets[seq] * Ns + indices[seq])...);
67 },
68 Indices<sizeof...(Is)>(indices...));
69 }
70
71 constexpr decltype(auto) operator()(
72 typename Base::Subscripts const &subscripts)
73 {
74 return this->call(subscripts);
75 }
76
77 constexpr decltype(auto) operator()(
78 typename Base::Subscripts const &subscripts) const
79 {
80 return this->call(subscripts);
81 }
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 indices.hpp:15
Definition sequence.hpp:56
Definition subscripts.hpp:20
Definition assignable.hpp:22
constexpr decltype(auto) operator()(Is const ... indices) const
Definition block.hpp:60
constexpr decltype(auto) operator()(Is const ... indices)
Definition block.hpp:47
Block(X &&a, Subscripts< Bs... > const &offsets)
Definition block.hpp:30
Definition block.hpp:13
Definition type_traits.hpp:32
pRC::Float<> T
Definition externs_nonTT.hpp:1
static void error(Xs &&...args)
Definition log.hpp:14
Definition diagonal.hpp:11
static constexpr auto makeConstantSequence()
Definition sequence.hpp:402
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
constexpr auto cDebugLevel
Definition config.hpp:46
std::conditional_t< B{}, T, F > Conditional
Definition type_traits.hpp:131
static constexpr decltype(auto) expand(Sequence< T, Seq... > const, F &&f, Xs &&...args)
Definition sequence.hpp:344
#define BEGIN_IGNORE_DIAGNOSTIC_GCC(warning)
Definition pragma.hpp:42
#define END_IGNORE_DIAGNOSTIC_GCC
Definition pragma.hpp:43