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