Tatooine
complex_tensor_views.h
Go to the documentation of this file.
1#ifndef TATOOINE_COMPLEX_TENSOR_VIEWS_H
2#define TATOOINE_COMPLEX_TENSOR_VIEWS_H
3//==============================================================================
4#include <tatooine/tensor.h>
5//==============================================================================
6namespace tatooine {
7//==============================================================================
8template <typename Tensor, typename T, size_t... Dims>
10 : base_tensor<const_imag_complex_tensor<Tensor, T, Dims...>, T, Dims...> {
11 static_assert(std::is_same_v<typename Tensor::value_type, std::complex<T>>);
13 using parent_type = base_tensor<this_type, T, Dims...>;
15
16 //============================================================================
17 private:
19
20 //============================================================================
21 public:
22 explicit constexpr const_imag_complex_tensor(
23 base_tensor<Tensor, std::complex<T>, Dims...> const& internal_tensor)
25
26 //----------------------------------------------------------------------------
27 constexpr decltype(auto) operator()(integral auto const... is) const {
28 static_assert(sizeof...(is) == rank());
29 return m_internal_tensor(is...).imag();
30 }
31 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
32 constexpr decltype(auto) at(integral auto const... is) const {
33 static_assert(sizeof...(is) == rank());
34 return m_internal_tensor(is...).imag();
35 }
36
37 //----------------------------------------------------------------------------
38 auto internal_tensor() const -> auto const& { return m_internal_tensor; }
39};
40
41//==============================================================================
42template <typename Tensor, typename T, size_t... Dims>
44 : base_tensor<imag_complex_tensor<Tensor, T, Dims...>, T, Dims...> {
45 static_assert(std::is_same_v<typename Tensor::value_type, std::complex<T>>);
46 using this_type = imag_complex_tensor<Tensor, T, Dims...>;
47 using parent_type = base_tensor<this_type, T, Dims...>;
49 //============================================================================
50 private:
52
53 //============================================================================
54 public:
55 explicit constexpr imag_complex_tensor(
56 base_tensor<Tensor, std::complex<T>, Dims...>& internal_tensor)
58
59 //----------------------------------------------------------------------------
60 constexpr auto operator()(integral auto const... is) const -> decltype(auto) {
61 static_assert(sizeof...(is) == rank());
62 return m_internal_tensor(is...).imag();
63 }
64 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
65 constexpr auto operator()(integral auto const... is) -> decltype(auto) {
66 static_assert(sizeof...(is) == rank());
67 return m_internal_tensor(is...).imag();
68 }
69 //----------------------------------------------------------------------------
70 constexpr auto at(integral auto const... is) const -> decltype(auto) {
71 static_assert(sizeof...(is) == rank());
72 return m_internal_tensor(is...).imag();
73 }
74 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
75 constexpr auto at(integral auto const... is) -> decltype(auto) {
76 static_assert(sizeof...(is) == rank());
77 return m_internal_tensor(is...).imag();
78 }
79 //----------------------------------------------------------------------------
80 auto internal_tensor() -> auto& { return m_internal_tensor; }
81 auto internal_tensor() const -> auto const& { return m_internal_tensor; }
82};
83
84//------------------------------------------------------------------------------
85template <typename Tensor, typename T, size_t... Dims>
86auto imag(base_tensor<Tensor, std::complex<T>, Dims...> const& tensor) {
88}
89// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
90template <typename Tensor, typename T, size_t... Dims>
91auto imag(base_tensor<Tensor, std::complex<T>, Dims...>& tensor) {
92 return imag_complex_tensor<Tensor, T, Dims...>{tensor.as_derived()};
93}
94
95//==============================================================================
96template <typename Tensor, typename T, size_t... Dims>
98 : base_tensor<const_real_complex_tensor<Tensor, T, Dims...>, T, Dims...> {
99 static_assert(std::is_same_v<typename Tensor::value_type, std::complex<T>>);
101 using parent_type = base_tensor<this_type, T, Dims...>;
102 using parent_type::rank;
103 //============================================================================
104 private:
106
107 //============================================================================
108 public:
110 base_tensor<Tensor, std::complex<T>, Dims...> const& internal_tensor)
112
113 //----------------------------------------------------------------------------
114 constexpr auto operator()(integral auto const... is) const -> decltype(auto) {
115 static_assert(sizeof...(is) == rank());
116 return m_internal_tensor(is...).real();
117 }
118 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
119 constexpr auto at(integral auto const... is) const -> decltype(auto) {
120 static_assert(sizeof...(is) == rank());
121 return m_internal_tensor(is...).real();
122 }
123 //----------------------------------------------------------------------------
124 auto internal_tensor() const -> auto const& { return m_internal_tensor; }
125};
126
127//==============================================================================
128template <typename Tensor, typename T, size_t... Dims>
130 : base_tensor<real_complex_tensor<Tensor, T, Dims...>, T, Dims...> {
131 static_assert(std::is_same_v<typename Tensor::value_type, std::complex<T>>);
133 using parent_type = base_tensor<this_type, T, Dims...>;
134 using parent_type::rank;
135 //============================================================================
136 private:
138
139 //============================================================================
140 public:
142 base_tensor<Tensor, std::complex<T>, Dims...>& internal_tensor)
144
145 //----------------------------------------------------------------------------
146 constexpr auto operator()(integral auto const... is) const -> decltype(auto) {
147 static_assert(sizeof...(is) == rank());
148 return m_internal_tensor(is...).real();
149 }
150 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
151 constexpr auto operator()(integral auto const... is) -> decltype(auto) {
152 static_assert(sizeof...(is) == rank());
153 return m_internal_tensor(is...).real();
154 }
155 //----------------------------------------------------------------------------
156 constexpr auto at(integral auto const... is) const -> decltype(auto) {
157 static_assert(sizeof...(is) == rank());
158 return m_internal_tensor(is...).real();
159 }
160 // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
161 constexpr auto at(integral auto const... is) -> decltype(auto) {
162 static_assert(sizeof...(is) == rank());
163 return m_internal_tensor(is...).real();
164 }
165
166 //----------------------------------------------------------------------------
167 auto internal_tensor() -> auto& { return m_internal_tensor; }
168 auto internal_tensor() const -> auto const& { return m_internal_tensor; }
169};
170
171//------------------------------------------------------------------------------
172template <typename Tensor, typename T, size_t... Dims>
173auto real(base_tensor<Tensor, std::complex<T>, Dims...> const& t) {
174 return const_real_complex_tensor<Tensor, T, Dims...>{t.as_derived()};
175}
176// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
177template <typename Tensor, typename T, size_t... Dims>
178auto real(base_tensor<Tensor, std::complex<T>, Dims...>& t) {
179 return real_complex_tensor<Tensor, T, Dims...>{t.as_derived()};
180}
181//==============================================================================
182} // namespace tatooine
183//==============================================================================
184#endif
Definition: concepts.h:21
Definition: algorithm.h:6
auto real(base_tensor< Tensor, std::complex< T >, Dims... > const &t)
Definition: complex_tensor_views.h:173
tensor< real_number, Dimensions... > Tensor
Definition: tensor.h:184
auto imag(base_tensor< Tensor, std::complex< T >, Dims... > const &tensor)
Definition: complex_tensor_views.h:86
Definition: base_tensor.h:23
static auto constexpr rank()
Definition: base_tensor.h:41
Definition: complex_tensor_views.h:10
static auto constexpr rank()
Definition: base_tensor.h:41
constexpr const_imag_complex_tensor(base_tensor< Tensor, std::complex< T >, Dims... > const &internal_tensor)
Definition: complex_tensor_views.h:22
const_imag_complex_tensor< Tensor, T, Dims... > this_type
Definition: complex_tensor_views.h:12
Tensor const & m_internal_tensor
Definition: complex_tensor_views.h:18
auto internal_tensor() const -> auto const &
Definition: complex_tensor_views.h:38
constexpr decltype(auto) at(integral auto const ... is) const
Definition: complex_tensor_views.h:32
Definition: complex_tensor_views.h:98
static auto constexpr rank()
Definition: base_tensor.h:41
Tensor const & m_internal_tensor
Definition: complex_tensor_views.h:105
const_real_complex_tensor(base_tensor< Tensor, std::complex< T >, Dims... > const &internal_tensor)
Definition: complex_tensor_views.h:109
constexpr auto operator()(integral auto const ... is) const -> decltype(auto)
Definition: complex_tensor_views.h:114
const_real_complex_tensor< Tensor, T, Dims... > this_type
Definition: complex_tensor_views.h:100
auto internal_tensor() const -> auto const &
Definition: complex_tensor_views.h:124
constexpr auto at(integral auto const ... is) const -> decltype(auto)
Definition: complex_tensor_views.h:119
constexpr auto as_derived() -> derived_type &
returns casted as_derived data
Definition: crtp.h:11
Definition: complex_tensor_views.h:44
static auto constexpr rank()
Definition: base_tensor.h:41
constexpr auto at(integral auto const ... is) -> decltype(auto)
Definition: complex_tensor_views.h:75
constexpr auto at(integral auto const ... is) const -> decltype(auto)
Definition: complex_tensor_views.h:70
constexpr auto operator()(integral auto const ... is) const -> decltype(auto)
Definition: complex_tensor_views.h:60
imag_complex_tensor< Tensor, T, Dims... > this_type
Definition: complex_tensor_views.h:46
Tensor & m_internal_tensor
Definition: complex_tensor_views.h:51
constexpr imag_complex_tensor(base_tensor< Tensor, std::complex< T >, Dims... > &internal_tensor)
Definition: complex_tensor_views.h:55
constexpr auto operator()(integral auto const ... is) -> decltype(auto)
Definition: complex_tensor_views.h:65
auto internal_tensor() const -> auto const &
Definition: complex_tensor_views.h:81
auto internal_tensor() -> auto &
Definition: complex_tensor_views.h:80
Definition: complex_tensor_views.h:130
constexpr auto at(integral auto const ... is) -> decltype(auto)
Definition: complex_tensor_views.h:161
static auto constexpr rank()
Definition: base_tensor.h:41
real_complex_tensor< Tensor, T, Dims... > this_type
Definition: complex_tensor_views.h:132
constexpr auto operator()(integral auto const ... is) -> decltype(auto)
Definition: complex_tensor_views.h:151
auto internal_tensor() -> auto &
Definition: complex_tensor_views.h:167
constexpr auto at(integral auto const ... is) const -> decltype(auto)
Definition: complex_tensor_views.h:156
Tensor & m_internal_tensor
Definition: complex_tensor_views.h:137
real_complex_tensor(base_tensor< Tensor, std::complex< T >, Dims... > &internal_tensor)
Definition: complex_tensor_views.h:141
constexpr auto operator()(integral auto const ... is) const -> decltype(auto)
Definition: complex_tensor_views.h:146
auto internal_tensor() const -> auto const &
Definition: complex_tensor_views.h:168