1 ////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (C) 1996-2021 The Octave Project Developers
4 //
5 // See the file COPYRIGHT.md in the top-level directory of this
6 // distribution or <https://octave.org/copyright/>.
7 //
8 // This file is part of Octave.
9 //
10 // Octave is free software: you can redistribute it and/or modify it
11 // under the terms of the GNU General Public License as published by
12 // the Free Software Foundation, either version 3 of the License, or
13 // (at your option) any later version.
14 //
15 // Octave is distributed in the hope that it will be useful, but
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 // GNU General Public License for more details.
19 //
20 // You should have received a copy of the GNU General Public License
21 // along with Octave; see the file COPYING. If not, see
22 // <https://www.gnu.org/licenses/>.
23 //
24 ////////////////////////////////////////////////////////////////////////
25
26 #if defined (HAVE_CONFIG_H)
27 # include "config.h"
28 #endif
29
30 #include "ovl.h"
31 #include "ov.h"
32 #include "ov-scalar.h"
33 #include "ov-float.h"
34 #include "ov-complex.h"
35 #include "ov-cx-mat.h"
36 #include "ov-flt-cx-mat.h"
37 #include "ov-typeinfo.h"
38 #include "ops.h"
39 #include "xdiv.h"
40 #include "xpow.h"
41
42 // scalar by complex scalar ops.
43
44 DEFBINOP_OP (add, scalar, complex, +)
45 DEFBINOP_OP (sub, scalar, complex, -)
46 DEFBINOP_OP (mul, scalar, complex, *)
47
DEFBINOP(div,scalar,complex)48 DEFBINOP (div, scalar, complex)
49 {
50 const octave_scalar& v1 = dynamic_cast<const octave_scalar&> (a1);
51 const octave_complex& v2 = dynamic_cast<const octave_complex&> (a2);
52
53 return octave_value (v1.double_value () / v2.complex_value ());
54 }
55
DEFBINOP_FN(pow,scalar,complex,xpow)56 DEFBINOP_FN (pow, scalar, complex, xpow)
57
58 DEFBINOP (ldiv, scalar, complex)
59 {
60 const octave_scalar& v1 = dynamic_cast<const octave_scalar&> (a1);
61 const octave_complex& v2 = dynamic_cast<const octave_complex&> (a2);
62
63 return octave_value (v2.complex_value () / v1.double_value ());
64 }
65
66 DEFCMPLXCMPOP_OP (lt, scalar, complex, <)
67 DEFCMPLXCMPOP_OP (le, scalar, complex, <=)
68 DEFCMPLXCMPOP_OP (eq, scalar, complex, ==)
69 DEFCMPLXCMPOP_OP (ge, scalar, complex, >=)
70 DEFCMPLXCMPOP_OP (gt, scalar, complex, >)
71 DEFCMPLXCMPOP_OP (ne, scalar, complex, !=)
72
73 DEFBINOP_OP (el_mul, scalar, complex, *)
74
DEFBINOP(el_div,scalar,complex)75 DEFBINOP (el_div, scalar, complex)
76 {
77 const octave_scalar& v1 = dynamic_cast<const octave_scalar&> (a1);
78 const octave_complex& v2 = dynamic_cast<const octave_complex&> (a2);
79
80 return octave_value (v1.double_value () / v2.complex_value ());
81 }
82
DEFBINOP_FN(el_pow,scalar,complex,xpow)83 DEFBINOP_FN (el_pow, scalar, complex, xpow)
84
85 DEFBINOP (el_ldiv, scalar, complex)
86 {
87 const octave_scalar& v1 = dynamic_cast<const octave_scalar&> (a1);
88 const octave_complex& v2 = dynamic_cast<const octave_complex&> (a2);
89
90 return octave_value (v2.complex_value () / v1.double_value ());
91 }
92
DEFBINOP(el_and,scalar,complex)93 DEFBINOP (el_and, scalar, complex)
94 {
95 const octave_scalar& v1 = dynamic_cast<const octave_scalar&> (a1);
96 const octave_complex& v2 = dynamic_cast<const octave_complex&> (a2);
97
98 return octave_value (v1.double_value () && (v2.complex_value () != 0.0));
99 }
100
DEFBINOP(el_or,scalar,complex)101 DEFBINOP (el_or, scalar, complex)
102 {
103 const octave_scalar& v1 = dynamic_cast<const octave_scalar&> (a1);
104 const octave_complex& v2 = dynamic_cast<const octave_complex&> (a2);
105
106 return octave_value (v1.double_value () || (v2.complex_value () != 0.0));
107 }
108
DEFNDCATOP_FN(s_cs,scalar,complex,array,complex_array,concat)109 DEFNDCATOP_FN (s_cs, scalar, complex, array, complex_array, concat)
110
111 void
112 install_s_cs_ops (octave::type_info& ti)
113 {
114 INSTALL_BINOP_TI (ti, op_add, octave_scalar, octave_complex, add);
115 INSTALL_BINOP_TI (ti, op_sub, octave_scalar, octave_complex, sub);
116 INSTALL_BINOP_TI (ti, op_mul, octave_scalar, octave_complex, mul);
117 INSTALL_BINOP_TI (ti, op_div, octave_scalar, octave_complex, div);
118 INSTALL_BINOP_TI (ti, op_pow, octave_scalar, octave_complex, pow);
119 INSTALL_BINOP_TI (ti, op_ldiv, octave_scalar, octave_complex, ldiv);
120 INSTALL_BINOP_TI (ti, op_lt, octave_scalar, octave_complex, lt);
121 INSTALL_BINOP_TI (ti, op_le, octave_scalar, octave_complex, le);
122 INSTALL_BINOP_TI (ti, op_eq, octave_scalar, octave_complex, eq);
123 INSTALL_BINOP_TI (ti, op_ge, octave_scalar, octave_complex, ge);
124 INSTALL_BINOP_TI (ti, op_gt, octave_scalar, octave_complex, gt);
125 INSTALL_BINOP_TI (ti, op_ne, octave_scalar, octave_complex, ne);
126 INSTALL_BINOP_TI (ti, op_el_mul, octave_scalar, octave_complex, el_mul);
127 INSTALL_BINOP_TI (ti, op_el_div, octave_scalar, octave_complex, el_div);
128 INSTALL_BINOP_TI (ti, op_el_pow, octave_scalar, octave_complex, el_pow);
129 INSTALL_BINOP_TI (ti, op_el_ldiv, octave_scalar, octave_complex, el_ldiv);
130 INSTALL_BINOP_TI (ti, op_el_and, octave_scalar, octave_complex, el_and);
131 INSTALL_BINOP_TI (ti, op_el_or, octave_scalar, octave_complex, el_or);
132
133 INSTALL_CATOP_TI (ti, octave_scalar, octave_complex, s_cs);
134
135 INSTALL_ASSIGNCONV_TI (ti, octave_scalar, octave_complex,
136 octave_complex_matrix);
137 INSTALL_ASSIGNCONV_TI (ti, octave_float_scalar, octave_complex,
138 octave_float_complex_matrix);
139 }
140