cMHN 1.1
C++ library for learning MHNs with pRC
Loading...
Searching...
No Matches
slice.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSD-2-Clause
2
3#ifndef pRC_CORE_TENSOR_VIEWS_SLICE_H
4#define pRC_CORE_TENSOR_VIEWS_SLICE_H
5
9
10namespace pRC::TensorViews
11{
12 template<class T, class N, class O, class V>
13 class Slice;
14
15 template<class T, class N, Size... Os, class V>
16 class Slice<T, N, Sizes<Os...>, V>
17 : public Conditional<IsAssignable<V>,
18 Assignable<T, N, Slice<T, N, Sizes<Os...>, V>>,
19 View<T, N, Slice<T, N, Sizes<Os...>, V>>>
20 {
21 static_assert(IsTensorView<V>());
22
23 private:
26
27 public:
28 template<class X, If<IsSame<V, RemoveReference<X>>> = 0>
30 : mA(forward<X>(a))
31 , mOffsets(offsets)
32 {
33 if constexpr(cDebugLevel >= DebugLevel::Low)
34 {
35 if(mOffsets.isOutOfRange())
36 {
37 Logging::error("Slice offset indices out of range.");
38 }
39 }
40 }
41
42 using Base::operator=;
43
44 template<class... Is, If<All<IsConvertible<Is, Index>...>> = 0,
45 If<IsSatisfied<(sizeof...(Is) == typename Base::Dimension())>> = 0>
46 constexpr decltype(auto) operator()(Is const... indices)
47 {
48 return expand(
49 makeSeries<Index, typename Base::Dimension{}>(),
50 [this](auto const &indices, auto const... seq) -> decltype(auto)
51 {
52 return mA((mOffsets[seq] + indices[seq])...);
53 },
54 Indices<sizeof...(Is)>(indices...));
55 }
56
57 template<class... Is, If<All<IsConvertible<Is, Index>...>> = 0,
58 If<IsSatisfied<(sizeof...(Is) == typename Base::Dimension())>> = 0>
59 constexpr decltype(auto) operator()(Is const... indices) const
60 {
61 return expand(
62 makeSeries<Index, typename Base::Dimension{}>(),
63 [this](auto const &indices, auto const... seq) -> decltype(auto)
64 {
65 return mA((mOffsets[seq] + indices[seq])...);
66 },
67 Indices<sizeof...(Is)>(indices...));
68 }
69
70 constexpr decltype(auto) operator()(
71 typename Base::Subscripts const &subscripts)
72 {
73 return this->call(subscripts);
74 }
75
76 constexpr decltype(auto) operator()(
77 typename Base::Subscripts const &subscripts) const
78 {
79 return this->call(subscripts);
80 }
81
82 private:
83 V mA;
84 Subscripts<Os...> const mOffsets;
85 };
86}
87#endif // pRC_CORE_TENSOR_VIEWS_SLICE_H
Definition indices.hpp:15
Definition sequence.hpp:56
Definition subscripts.hpp:20
Definition assignable.hpp:22
Slice(X &&a, Subscripts< Os... > const &offsets)
Definition slice.hpp:29
constexpr decltype(auto) operator()(Is const ... indices)
Definition slice.hpp:46
constexpr decltype(auto) operator()(Is const ... indices) const
Definition slice.hpp:59
Definition slice.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
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 auto makeSeries()
Definition sequence.hpp:351
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