TRIQS/nda
1.3.0
Multi-dimensional array library for C++
Loading...
Searching...
No Matches
complex.hpp
Go to the documentation of this file.
1
// Copyright (c) 2019-2023 Simons Foundation
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
// http://www.apache.org/licenses/LICENSE-2.0.txt
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
//
15
// Authors: Sergei Iskakov, Olivier Parcollet, Nils Wentzell
16
17
/**
18
* @file
19
* @brief Provides additional operators for std::complex and other arithmetic types.
20
*/
21
22
#
ifndef
STDUTILS_COMPLEX_H
23
#
define
STDUTILS_COMPLEX_H
24
25
#
include
<
complex
>
26
#
include
<
concepts
>
27
#
include
<
type_traits
>
28
29
using
namespace
std::literals::complex_literals;
30
31
namespace
std {
// has to be in the right namespace for ADL
32
33
/**
34
* @addtogroup utils_std
35
* @{
36
*/
37
38
// define operators (+,-,*,/) for std::complex and various other arithmetic types
39
#
define
IMPL_OP
(
OP
)
40
/** @brief Implementation of operator `OP` for std::complex and some other arithmetic type. */
41
template
<
typename
T
,
typename
U
>
42
requires
(
std
::
is_arithmetic_v
<
T
>
and
std
::
is_arithmetic_v
<
U
>
and
std
::
common_with
<
T
,
U
>
)
43
auto
operator
OP
(
std
::
complex
<
T
>
const
&
x
,
U
y
)
{
44
using
C
=
std
::
complex
<
std
::
common_type_t
<
T
,
U
>>
;
45
return
C
(
x
.
real
(
)
,
x
.
imag
(
)
)
OP
C
(
y
)
;
46
}
47
48
/** @brief Implementation of operator `OP` for some other arithmetic type and std::complex. */
49
template
<
typename
T
,
typename
U
>
50
requires
(
std
::
is_arithmetic_v
<
T
>
and
std
::
is_arithmetic_v
<
U
>
and
std
::
common_with
<
T
,
U
>
)
51
auto
operator
OP
(
T
x
,
std
::
complex
<
U
>
const
&
y
)
{
52
using
C
=
std
::
complex
<
std
::
common_type_t
<
T
,
U
>>
;
53
return
C
(
x
)
OP
C
(
y
.
real
(
)
,
y
.
imag
(
)
)
;
54
}
55
56
/** @brief Implementation of operator `OP` for two std::complex types with different value types. */
57
template
<
typename
T
,
typename
U
>
58
requires
(
std
::
is_arithmetic_v
<
T
>
and
std
::
is_arithmetic_v
<
U
>
and
std
::
common_with
<
T
,
U
>
and
!
std
::
is_same_v
<
T
,
U
>
)
59
auto
operator
OP
(
std
::
complex
<
T
>
const
&
x
,
std
::
complex
<
U
>
const
&
y
)
{
60
using
C
=
std
::
complex
<
std
::
common_type_t
<
T
,
U
>>
;
61
return
C
(
x
.
real
(
)
,
x
.
imag
(
)
)
OP
C
(
y
.
real
(
)
,
y
.
imag
(
)
)
;
62
}
63
64
IMPL_OP
(+)
65
IMPL_OP
(-)
66
IMPL_OP
(*)
67
IMPL_OP
(/)
68
69
#
undef
IMPL_OP
70
71
/** @} */
72
73
}
// namespace std
74
75
#
endif
// STDUTILS_COMPLEX_H
IMPL_OP
#define IMPL_OP(OP)
Definition
complex.hpp:39
nda
stdutil
complex.hpp
Generated by
1.11.0