comparison libinterp/operators/ops.h @ 22197:e43d83253e28

refill multi-line macro definitions Use the Emacs C++ mode style for line continuation markers in multi-line macro definitions. * make_int.cc, __dsearchn__.cc, __magick_read__.cc, besselj.cc, bitfcns.cc, bsxfun.cc, cellfun.cc, data.cc, defun-dld.h, defun-int.h, defun.h, det.cc, error.h, find.cc, gcd.cc, graphics.cc, interpreter.h, jit-ir.h, jit-typeinfo.h, lookup.cc, ls-mat5.cc, max.cc, mexproto.h, mxarray.in.h, oct-stream.cc, ordschur.cc, pr-output.cc, profiler.h, psi.cc, regexp.cc, sparse-xdiv.cc, sparse-xpow.cc, tril.cc, txt-eng.h, utils.cc, variables.cc, variables.h, xdiv.cc, xpow.cc, __glpk__.cc, ov-base.cc, ov-base.h, ov-cell.cc, ov-ch-mat.cc, ov-classdef.cc, ov-complex.cc, ov-cx-mat.cc, ov-cx-sparse.cc, ov-float.cc, ov-float.h, ov-flt-complex.cc, ov-flt-cx-mat.cc, ov-flt-re-mat.cc, ov-int-traits.h, ov-lazy-idx.h, ov-perm.cc, ov-re-mat.cc, ov-re-sparse.cc, ov-scalar.cc, ov-scalar.h, ov-str-mat.cc, ov-type-conv.h, ov.cc, ov.h, op-class.cc, op-int-conv.cc, op-int.h, op-str-str.cc, ops.h, lex.ll, Array.cc, CMatrix.cc, CSparse.cc, MArray.cc, MArray.h, MDiagArray2.cc, MDiagArray2.h, MSparse.h, Sparse.cc, dMatrix.cc, dSparse.cc, fCMatrix.cc, fMatrix.cc, idx-vector.cc, f77-fcn.h, quit.h, bsxfun-decl.h, bsxfun-defs.cc, lo-specfun.cc, oct-convn.cc, oct-convn.h, oct-norm.cc, oct-norm.h, oct-rand.cc, Sparse-op-decls.h, Sparse-op-defs.h, mx-inlines.cc, mx-op-decl.h, mx-op-defs.h, mach-info.cc, oct-group.cc, oct-passwd.cc, oct-syscalls.cc, oct-time.cc, data-conv.cc, kpse.cc, lo-ieee.h, lo-macros.h, oct-cmplx.h, oct-glob.cc, oct-inttypes.cc, oct-inttypes.h, oct-locbuf.h, oct-sparse.h, url-transfer.cc, oct-conf-post.in.h, shared-fcns.h: Refill macro definitions.
author John W. Eaton <jwe@octave.org>
date Mon, 01 Aug 2016 12:40:18 -0400
parents 2aef506f3fec
children 8b18f46f6427
comparison
equal deleted inserted replaced
22196:dd992fd74fce 22197:e43d83253e28
35 #define CONCAT3X(x, y, z) x ## y ## z 35 #define CONCAT3X(x, y, z) x ## y ## z
36 #define CONCAT3(x, y, z) CONCAT3X (x, y, z) 36 #define CONCAT3(x, y, z) CONCAT3X (x, y, z)
37 37
38 extern void install_ops (void); 38 extern void install_ops (void);
39 39
40 #define INSTALL_UNOP(op, t, f) \ 40 #define INSTALL_UNOP(op, t, f) \
41 octave_value_typeinfo::register_unary_op \ 41 octave_value_typeinfo::register_unary_op \
42 (octave_value::op, t::static_type_id (), CONCAT2 (oct_unop_, f)); 42 (octave_value::op, t::static_type_id (), CONCAT2 (oct_unop_, f));
43 43
44 #define INSTALL_NCUNOP(op, t, f) \ 44 #define INSTALL_NCUNOP(op, t, f) \
45 octave_value_typeinfo::register_non_const_unary_op \ 45 octave_value_typeinfo::register_non_const_unary_op \
46 (octave_value::op, t::static_type_id (), CONCAT2 (oct_unop_, f)); 46 (octave_value::op, t::static_type_id (), CONCAT2 (oct_unop_, f));
47 47
48 #define INSTALL_BINOP(op, t1, t2, f) \ 48 #define INSTALL_BINOP(op, t1, t2, f) \
49 octave_value_typeinfo::register_binary_op \ 49 octave_value_typeinfo::register_binary_op \
50 (octave_value::op, t1::static_type_id (), t2::static_type_id (), \ 50 (octave_value::op, t1::static_type_id (), t2::static_type_id (), \
51 CONCAT2 (oct_binop_, f)); 51 CONCAT2 (oct_binop_, f));
52 52
53 #define INSTALL_CATOP(t1, t2, f) \ 53 #define INSTALL_CATOP(t1, t2, f) \
54 octave_value_typeinfo::register_cat_op \ 54 octave_value_typeinfo::register_cat_op \
55 (t1::static_type_id (), t2::static_type_id (), CONCAT2 (oct_catop_, f)); 55 (t1::static_type_id (), t2::static_type_id (), CONCAT2 (oct_catop_, f));
56 56
57 #define INSTALL_ASSIGNOP(op, t1, t2, f) \ 57 #define INSTALL_ASSIGNOP(op, t1, t2, f) \
58 octave_value_typeinfo::register_assign_op \ 58 octave_value_typeinfo::register_assign_op \
59 (octave_value::op, t1::static_type_id (), t2::static_type_id (), \ 59 (octave_value::op, t1::static_type_id (), t2::static_type_id (), \
60 CONCAT2 (oct_assignop_, f)); 60 CONCAT2 (oct_assignop_, f));
61 61
62 #define INSTALL_ASSIGNANYOP(op, t1, f) \ 62 #define INSTALL_ASSIGNANYOP(op, t1, f) \
63 octave_value_typeinfo::register_assignany_op \ 63 octave_value_typeinfo::register_assignany_op \
64 (octave_value::op, t1::static_type_id (), CONCAT2 (oct_assignop_, f)); 64 (octave_value::op, t1::static_type_id (), CONCAT2 (oct_assignop_, f));
65 65
66 #define INSTALL_ASSIGNCONV(t1, t2, tr) \ 66 #define INSTALL_ASSIGNCONV(t1, t2, tr) \
67 octave_value_typeinfo::register_pref_assign_conv \ 67 octave_value_typeinfo::register_pref_assign_conv \
68 (t1::static_type_id (), t2::static_type_id (), tr::static_type_id ()); 68 (t1::static_type_id (), t2::static_type_id (), tr::static_type_id ());
69 69
70 #define INSTALL_CONVOP(t1, t2, f) \ 70 #define INSTALL_CONVOP(t1, t2, f) \
71 octave_value_typeinfo::register_type_conv_op \ 71 octave_value_typeinfo::register_type_conv_op \
72 (t1::static_type_id (), t2::static_type_id (), CONCAT2 (oct_conv_, f)); 72 (t1::static_type_id (), t2::static_type_id (), CONCAT2 (oct_conv_, f));
73 73
74 #define INSTALL_WIDENOP(t1, t2, f) \ 74 #define INSTALL_WIDENOP(t1, t2, f) \
75 octave_value_typeinfo::register_widening_op \ 75 octave_value_typeinfo::register_widening_op \
76 (t1::static_type_id (), t2::static_type_id (), CONCAT2 (oct_conv_, f)); 76 (t1::static_type_id (), t2::static_type_id (), CONCAT2 (oct_conv_, f));
77 77
78 #define DEFASSIGNOP(name, t1, t2) \ 78 #define DEFASSIGNOP(name, t1, t2) \
79 static octave_value \ 79 static octave_value \
80 CONCAT2 (oct_assignop_, name) (octave_base_value& a1, \ 80 CONCAT2 (oct_assignop_, name) (octave_base_value& a1, \
81 const octave_value_list& idx, \ 81 const octave_value_list& idx, \
82 const octave_base_value& a2) 82 const octave_base_value& a2)
83 83
84 #define DEFASSIGNOP_FN(name, t1, t2, f) \ 84 #define DEFASSIGNOP_FN(name, t1, t2, f) \
85 static octave_value \ 85 static octave_value \
86 CONCAT2 (oct_assignop_, name) (octave_base_value& a1, \ 86 CONCAT2 (oct_assignop_, name) (octave_base_value& a1, \
87 const octave_value_list& idx, \ 87 const octave_value_list& idx, \
88 const octave_base_value& a2) \ 88 const octave_base_value& a2) \
89 { \ 89 { \
90 CONCAT2 (octave_, t1)& v1 = dynamic_cast<CONCAT2 (octave_, t1)&> (a1); \ 90 CONCAT2 (octave_, t1)& v1 = dynamic_cast<CONCAT2 (octave_, t1)&> (a1); \
91 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \ 91 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \
92 \ 92 \
93 v1.f (idx, v2.CONCAT2 (t1, _value) ()); \ 93 v1.f (idx, v2.CONCAT2 (t1, _value) ()); \
94 return octave_value (); \ 94 return octave_value (); \
95 } 95 }
96 96
97 #define DEFNULLASSIGNOP_FN(name, t, f) \ 97 #define DEFNULLASSIGNOP_FN(name, t, f) \
98 static octave_value \ 98 static octave_value \
99 CONCAT2 (oct_assignop_, name) (octave_base_value& a, \ 99 CONCAT2 (oct_assignop_, name) (octave_base_value& a, \
100 const octave_value_list& idx, \ 100 const octave_value_list& idx, \
101 const octave_base_value&) \ 101 const octave_base_value&) \
102 { \ 102 { \
103 CONCAT2 (octave_, t)& v = dynamic_cast<CONCAT2 (octave_, t)&> (a); \ 103 CONCAT2 (octave_, t)& v = dynamic_cast<CONCAT2 (octave_, t)&> (a); \
104 \ 104 \
105 v.f (idx); \ 105 v.f (idx); \
106 return octave_value (); \ 106 return octave_value (); \
107 } 107 }
108 108
109 #define DEFNDASSIGNOP_FN(name, t1, t2, e, f) \ 109 #define DEFNDASSIGNOP_FN(name, t1, t2, e, f) \
110 static octave_value \ 110 static octave_value \
111 CONCAT2 (oct_assignop_, name) (octave_base_value& a1, \ 111 CONCAT2 (oct_assignop_, name) (octave_base_value& a1, \
112 const octave_value_list& idx, \ 112 const octave_value_list& idx, \
113 const octave_base_value& a2) \ 113 const octave_base_value& a2) \
114 { \ 114 { \
115 CONCAT2 (octave_, t1)& v1 = dynamic_cast<CONCAT2 (octave_, t1)&> (a1); \ 115 CONCAT2 (octave_, t1)& v1 = dynamic_cast<CONCAT2 (octave_, t1)&> (a1); \
116 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \ 116 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \
117 \ 117 \
118 v1.f (idx, v2.CONCAT2 (e, _value) ()); \ 118 v1.f (idx, v2.CONCAT2 (e, _value) ()); \
119 return octave_value (); \ 119 return octave_value (); \
120 } 120 }
121 121
122 // FIXME: the following currently don't handle index. 122 // FIXME: the following currently don't handle index.
123 #define DEFNDASSIGNOP_OP(name, t1, t2, f, op) \ 123 #define DEFNDASSIGNOP_OP(name, t1, t2, f, op) \
124 static octave_value \ 124 static octave_value \
125 CONCAT2 (oct_assignop_, name) (octave_base_value& a1, \ 125 CONCAT2 (oct_assignop_, name) (octave_base_value& a1, \
126 const octave_value_list& idx, \ 126 const octave_value_list& idx, \
127 const octave_base_value& a2) \ 127 const octave_base_value& a2) \
128 { \ 128 { \
129 CONCAT2 (octave_, t1)& v1 = dynamic_cast<CONCAT2 (octave_, t1)&> (a1); \ 129 CONCAT2 (octave_, t1)& v1 = dynamic_cast<CONCAT2 (octave_, t1)&> (a1); \
130 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \ 130 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \
131 \ 131 \
132 assert (idx.empty ()); \ 132 assert (idx.empty ()); \
133 v1.matrix_ref () op v2.CONCAT2 (f, _value) (); \ 133 v1.matrix_ref () op v2.CONCAT2 (f, _value) (); \
134 \ 134 \
135 return octave_value (); \ 135 return octave_value (); \
136 } 136 }
137 137
138 #define DEFNDASSIGNOP_FNOP(name, t1, t2, f, fnop) \ 138 #define DEFNDASSIGNOP_FNOP(name, t1, t2, f, fnop) \
139 static octave_value \ 139 static octave_value \
140 CONCAT2 (oct_assignop_, name) (octave_base_value& a1, \ 140 CONCAT2 (oct_assignop_, name) (octave_base_value& a1, \
141 const octave_value_list& idx, \ 141 const octave_value_list& idx, \
142 const octave_base_value& a2) \ 142 const octave_base_value& a2) \
143 { \ 143 { \
144 CONCAT2 (octave_, t1)& v1 = dynamic_cast<CONCAT2 (octave_, t1)&> (a1); \ 144 CONCAT2 (octave_, t1)& v1 = dynamic_cast<CONCAT2 (octave_, t1)&> (a1); \
145 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \ 145 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \
146 \ 146 \
147 assert (idx.empty ()); \ 147 assert (idx.empty ()); \
148 fnop (v1.matrix_ref (), v2.CONCAT2 (f, _value) ()); \ 148 fnop (v1.matrix_ref (), v2.CONCAT2 (f, _value) ()); \
149 \ 149 \
150 return octave_value (); \ 150 return octave_value (); \
151 } 151 }
152 152
153 #define DEFASSIGNANYOP_FN(name, t1, f) \ 153 #define DEFASSIGNANYOP_FN(name, t1, f) \
154 static octave_value \ 154 static octave_value \
155 CONCAT2 (oct_assignop_, name) (octave_base_value& a1, \ 155 CONCAT2 (oct_assignop_, name) (octave_base_value& a1, \
156 const octave_value_list& idx, \ 156 const octave_value_list& idx, \
157 const octave_value& a2) \ 157 const octave_value& a2) \
158 { \ 158 { \
159 CONCAT2 (octave_, t1)& v1 = dynamic_cast<CONCAT2 (octave_, t1)&> (a1); \ 159 CONCAT2 (octave_, t1)& v1 = dynamic_cast<CONCAT2 (octave_, t1)&> (a1); \
160 \ 160 \
161 v1.f (idx, a2); \ 161 v1.f (idx, a2); \
162 return octave_value (); \ 162 return octave_value (); \
163 } 163 }
164 164
165 #define CONVDECL(name) \ 165 #define CONVDECL(name) \
166 static octave_base_value * \ 166 static octave_base_value * \
167 CONCAT2 (oct_conv_, name) (const octave_base_value& a) 167 CONCAT2 (oct_conv_, name) (const octave_base_value& a)
168 168
169 #define CONVDECLX(name) \ 169 #define CONVDECLX(name) \
170 static octave_base_value * \ 170 static octave_base_value * \
171 CONCAT2 (oct_conv_, name) (const octave_base_value&) 171 CONCAT2 (oct_conv_, name) (const octave_base_value&)
172 172
173 #define DEFCONV(name, a_dummy, b_dummy) \ 173 #define DEFCONV(name, a_dummy, b_dummy) \
174 CONVDECL (name) 174 CONVDECL (name)
175 175
176 #define DEFCONVFNX(name, tfrom, ovtto, tto, e) \ 176 #define DEFCONVFNX(name, tfrom, ovtto, tto, e) \
177 CONVDECL (name) \ 177 CONVDECL (name) \
178 { \ 178 { \
179 const CONCAT2 (octave_, tfrom)& v = dynamic_cast<const CONCAT2 (octave_, tfrom)&> (a); \ 179 const CONCAT2 (octave_, tfrom)& v = dynamic_cast<const CONCAT2 (octave_, tfrom)&> (a); \
180 \ 180 \
181 return new CONCAT2 (octave_, ovtto) (CONCAT2 (tto, NDArray) (v.CONCAT2 (e, array_value) ())); \ 181 return new CONCAT2 (octave_, ovtto) (CONCAT2 (tto, NDArray) (v.CONCAT2 (e, array_value) ())); \
182 } 182 }
183 183
184 #define DEFCONVFNX2(name, tfrom, ovtto, e) \ 184 #define DEFCONVFNX2(name, tfrom, ovtto, e) \
185 CONVDECL (name) \ 185 CONVDECL (name) \
186 { \ 186 { \
187 const CONCAT2 (octave_, tfrom)& v = dynamic_cast<const CONCAT2 (octave_, tfrom)&> (a); \ 187 const CONCAT2 (octave_, tfrom)& v = dynamic_cast<const CONCAT2 (octave_, tfrom)&> (a); \
188 \ 188 \
189 return new CONCAT2 (octave_, ovtto) (v.CONCAT2 (e, array_value) ()); \ 189 return new CONCAT2 (octave_, ovtto) (v.CONCAT2 (e, array_value) ()); \
190 } 190 }
191 191
192 #define DEFDBLCONVFN(name, ovtfrom, e) \ 192 #define DEFDBLCONVFN(name, ovtfrom, e) \
193 CONVDECL (name) \ 193 CONVDECL (name) \
194 { \ 194 { \
195 const CONCAT2 (octave_, ovtfrom)& v = dynamic_cast<const CONCAT2 (octave_, ovtfrom)&> (a); \ 195 const CONCAT2 (octave_, ovtfrom)& v = dynamic_cast<const CONCAT2 (octave_, ovtfrom)&> (a); \
196 \ 196 \
197 return new octave_matrix (NDArray (v.CONCAT2 (e, _value) ())); \ 197 return new octave_matrix (NDArray (v.CONCAT2 (e, _value) ())); \
198 } 198 }
199 199
200 #define DEFFLTCONVFN(name, ovtfrom, e) \ 200 #define DEFFLTCONVFN(name, ovtfrom, e) \
201 CONVDECL (name) \ 201 CONVDECL (name) \
202 { \ 202 { \
203 const CONCAT2 (octave_, ovtfrom)& v = dynamic_cast<const CONCAT2 (octave_, ovtfrom)&> (a); \ 203 const CONCAT2 (octave_, ovtfrom)& v = dynamic_cast<const CONCAT2 (octave_, ovtfrom)&> (a); \
204 \ 204 \
205 return new octave_float_matrix (FloatNDArray (v.CONCAT2 (e, _value) ())); \ 205 return new octave_float_matrix (FloatNDArray (v.CONCAT2 (e, _value) ())); \
206 } 206 }
207 207
208 #define DEFSTRINTCONVFN(name, tto) \ 208 #define DEFSTRINTCONVFN(name, tto) \
209 DEFCONVFNX(name, char_matrix_str, CONCAT2 (tto, _matrix), tto, char_) 209 DEFCONVFNX(name, char_matrix_str, CONCAT2 (tto, _matrix), tto, char_)
210 210
211 #define DEFSTRDBLCONVFN(name, tfrom) \ 211 #define DEFSTRDBLCONVFN(name, tfrom) \
212 DEFCONVFNX(name, tfrom, matrix, , char_) 212 DEFCONVFNX(name, tfrom, matrix, , char_)
213 213
214 #define DEFSTRFLTCONVFN(name, tfrom) \ 214 #define DEFSTRFLTCONVFN(name, tfrom) \
215 DEFCONVFNX(name, tfrom, float_matrix, Float, char_) 215 DEFCONVFNX(name, tfrom, float_matrix, Float, char_)
216 216
217 #define DEFCONVFN(name, tfrom, tto) \ 217 #define DEFCONVFN(name, tfrom, tto) \
218 DEFCONVFNX2 (name, tfrom, CONCAT2 (tto, _matrix), CONCAT2 (tto, _)) 218 DEFCONVFNX2 (name, tfrom, CONCAT2 (tto, _matrix), CONCAT2 (tto, _))
219 219
220 #define DEFCONVFN2(name, tfrom, sm, tto) \ 220 #define DEFCONVFN2(name, tfrom, sm, tto) \
221 DEFCONVFNX2 (name, CONCAT3 (tfrom, _, sm), CONCAT2 (tto, _matrix), CONCAT2 (tto, _)) 221 DEFCONVFNX2 (name, CONCAT3 (tfrom, _, sm), CONCAT2 (tto, _matrix), CONCAT2 (tto, _))
222 222
223 #define DEFUNOPX(name, t) \ 223 #define DEFUNOPX(name, t) \
224 static octave_value \ 224 static octave_value \
225 CONCAT2 (oct_unop_, name) (const octave_base_value&) 225 CONCAT2 (oct_unop_, name) (const octave_base_value&)
226 226
227 #define DEFUNOP(name, t) \ 227 #define DEFUNOP(name, t) \
228 static octave_value \ 228 static octave_value \
229 CONCAT2 (oct_unop_, name) (const octave_base_value& a) 229 CONCAT2 (oct_unop_, name) (const octave_base_value& a)
230 230
231 #define DEFUNOP_OP(name, t, op) \ 231 #define DEFUNOP_OP(name, t, op) \
232 static octave_value \ 232 static octave_value \
233 CONCAT2 (oct_unop_, name) (const octave_base_value& a) \ 233 CONCAT2 (oct_unop_, name) (const octave_base_value& a) \
234 { \ 234 { \
235 const CONCAT2 (octave_, t)& v = dynamic_cast<const CONCAT2 (octave_, t)&> (a); \ 235 const CONCAT2 (octave_, t)& v = dynamic_cast<const CONCAT2 (octave_, t)&> (a); \
236 return octave_value (op v.CONCAT2 (t, _value) ()); \ 236 return octave_value (op v.CONCAT2 (t, _value) ()); \
237 } 237 }
238 238
239 #define DEFNDUNOP_OP(name, t, e, op) \ 239 #define DEFNDUNOP_OP(name, t, e, op) \
240 static octave_value \ 240 static octave_value \
241 CONCAT2 (oct_unop_, name) (const octave_base_value& a) \ 241 CONCAT2 (oct_unop_, name) (const octave_base_value& a) \
242 { \ 242 { \
243 const CONCAT2 (octave_, t)& v = dynamic_cast<const CONCAT2 (octave_, t)&> (a); \ 243 const CONCAT2 (octave_, t)& v = dynamic_cast<const CONCAT2 (octave_, t)&> (a); \
244 return octave_value (op v.CONCAT2 (e, _value) ()); \ 244 return octave_value (op v.CONCAT2 (e, _value) ()); \
245 } 245 }
246 246
247 // FIXME: in some cases, the constructor isn't necessary. 247 // FIXME: in some cases, the constructor isn't necessary.
248 248
249 #define DEFUNOP_FN(name, t, f) \ 249 #define DEFUNOP_FN(name, t, f) \
250 static octave_value \ 250 static octave_value \
251 CONCAT2 (oct_unop_, name) (const octave_base_value& a) \ 251 CONCAT2 (oct_unop_, name) (const octave_base_value& a) \
252 { \ 252 { \
253 const CONCAT2 (octave_, t)& v = dynamic_cast<const CONCAT2 (octave_, t)&> (a); \ 253 const CONCAT2 (octave_, t)& v = dynamic_cast<const CONCAT2 (octave_, t)&> (a); \
254 return octave_value (f (v.CONCAT2 (t, _value) ())); \ 254 return octave_value (f (v.CONCAT2 (t, _value) ())); \
255 } 255 }
256 256
257 #define DEFNDUNOP_FN(name, t, e, f) \ 257 #define DEFNDUNOP_FN(name, t, e, f) \
258 static octave_value \ 258 static octave_value \
259 CONCAT2 (oct_unop_, name) (const octave_base_value& a) \ 259 CONCAT2 (oct_unop_, name) (const octave_base_value& a) \
260 { \ 260 { \
261 const CONCAT2 (octave_, t)& v = dynamic_cast<const CONCAT2 (octave_, t)&> (a); \ 261 const CONCAT2 (octave_, t)& v = dynamic_cast<const CONCAT2 (octave_, t)&> (a); \
262 return octave_value (f (v.CONCAT2 (e, _value) ())); \ 262 return octave_value (f (v.CONCAT2 (e, _value) ())); \
263 } 263 }
264 264
265 #define DEFNCUNOP_METHOD(name, t, method) \ 265 #define DEFNCUNOP_METHOD(name, t, method) \
266 static void \ 266 static void \
267 CONCAT2 (oct_unop_, name) (octave_base_value& a) \ 267 CONCAT2 (oct_unop_, name) (octave_base_value& a) \
268 { \ 268 { \
269 CONCAT2 (octave_, t)& v = dynamic_cast<CONCAT2 (octave_, t)&> (a); \ 269 CONCAT2 (octave_, t)& v = dynamic_cast<CONCAT2 (octave_, t)&> (a); \
270 v.method (); \ 270 v.method (); \
271 } 271 }
272 272
273 #define DEFBINOPX(name, t1, t2) \ 273 #define DEFBINOPX(name, t1, t2) \
274 static octave_value \ 274 static octave_value \
275 CONCAT2 (oct_binop_, name) (const octave_base_value&, \ 275 CONCAT2 (oct_binop_, name) (const octave_base_value&, \
276 const octave_base_value&) 276 const octave_base_value&)
277 277
278 #define DEFBINOP(name, t1, t2) \ 278 #define DEFBINOP(name, t1, t2) \
279 static octave_value \ 279 static octave_value \
280 CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \ 280 CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \
281 const octave_base_value& a2) 281 const octave_base_value& a2)
282 282
283 #define DEFBINOP_OP(name, t1, t2, op) \ 283 #define DEFBINOP_OP(name, t1, t2, op) \
284 static octave_value \ 284 static octave_value \
285 CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \ 285 CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \
286 const octave_base_value& a2) \ 286 const octave_base_value& a2) \
287 { \ 287 { \
288 const CONCAT2 (octave_, t1)& v1 = dynamic_cast<const CONCAT2 (octave_, t1)&> (a1); \ 288 const CONCAT2 (octave_, t1)& v1 = dynamic_cast<const CONCAT2 (octave_, t1)&> (a1); \
289 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \ 289 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \
290 \ 290 \
291 return octave_value \ 291 return octave_value \
292 (v1.CONCAT2 (t1, _value) () op v2.CONCAT2 (t2, _value) ()); \ 292 (v1.CONCAT2 (t1, _value) () op v2.CONCAT2 (t2, _value) ()); \
293 } 293 }
294 294
295 #define DEFCMPLXCMPOP_OP(name, t1, t2, op) \ 295 #define DEFCMPLXCMPOP_OP(name, t1, t2, op) \
296 static octave_value \ 296 static octave_value \
297 CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \ 297 CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \
298 const octave_base_value& a2) \ 298 const octave_base_value& a2) \
299 { \ 299 { \
300 const CONCAT2 (octave_, t1)& v1 = dynamic_cast<const CONCAT2 (octave_, t1)&> (a1); \ 300 const CONCAT2 (octave_, t1)& v1 = dynamic_cast<const CONCAT2 (octave_, t1)&> (a1); \
301 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \ 301 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \
302 \ 302 \
303 warn_complex_cmp (); \ 303 warn_complex_cmp (); \
304 \ 304 \
305 return octave_value \ 305 return octave_value \
306 (v1.CONCAT2 (t1, _value) () op v2.CONCAT2 (t2, _value) ()); \ 306 (v1.CONCAT2 (t1, _value) () op v2.CONCAT2 (t2, _value) ()); \
307 } 307 }
308 308
309 #define DEFSCALARBOOLOP_OP(name, t1, t2, op) \ 309 #define DEFSCALARBOOLOP_OP(name, t1, t2, op) \
310 static octave_value \ 310 static octave_value \
311 CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \ 311 CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \
312 const octave_base_value& a2) \ 312 const octave_base_value& a2) \
313 { \ 313 { \
314 const CONCAT2 (octave_, t1)& v1 = dynamic_cast<const CONCAT2 (octave_, t1)&> (a1); \ 314 const CONCAT2 (octave_, t1)& v1 = dynamic_cast<const CONCAT2 (octave_, t1)&> (a1); \
315 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \ 315 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \
316 \ 316 \
317 if (octave::math::isnan (v1.CONCAT2 (t1, _value) ()) || octave::math::isnan (v2.CONCAT2 (t2, _value) ())) \ 317 if (octave::math::isnan (v1.CONCAT2 (t1, _value) ()) || octave::math::isnan (v2.CONCAT2 (t2, _value) ())) \
318 err_nan_to_logical_conversion (); \ 318 err_nan_to_logical_conversion (); \
319 \ 319 \
320 return octave_value \ 320 return octave_value \
321 (v1.CONCAT2 (t1, _value) () op v2.CONCAT2 (t2, _value) ()); \ 321 (v1.CONCAT2 (t1, _value) () op v2.CONCAT2 (t2, _value) ()); \
322 } 322 }
323 323
324 #define DEFNDBINOP_OP(name, t1, t2, e1, e2, op) \ 324 #define DEFNDBINOP_OP(name, t1, t2, e1, e2, op) \
325 static octave_value \ 325 static octave_value \
326 CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \ 326 CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \
327 const octave_base_value& a2) \ 327 const octave_base_value& a2) \
328 { \ 328 { \
329 const CONCAT2 (octave_, t1)& v1 = dynamic_cast<const CONCAT2 (octave_, t1)&> (a1); \ 329 const CONCAT2 (octave_, t1)& v1 = dynamic_cast<const CONCAT2 (octave_, t1)&> (a1); \
330 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \ 330 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \
331 \ 331 \
332 return octave_value \ 332 return octave_value \
333 (v1.CONCAT2 (e1, _value) () op v2.CONCAT2 (e2, _value) ()); \ 333 (v1.CONCAT2 (e1, _value) () op v2.CONCAT2 (e2, _value) ()); \
334 } 334 }
335 335
336 // FIXME: in some cases, the constructor isn't necessary. 336 // FIXME: in some cases, the constructor isn't necessary.
337 337
338 #define DEFBINOP_FN(name, t1, t2, f) \ 338 #define DEFBINOP_FN(name, t1, t2, f) \
339 static octave_value \ 339 static octave_value \
340 CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \ 340 CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \
341 const octave_base_value& a2) \ 341 const octave_base_value& a2) \
342 { \ 342 { \
343 const CONCAT2 (octave_, t1)& v1 = dynamic_cast<const CONCAT2 (octave_, t1)&> (a1); \ 343 const CONCAT2 (octave_, t1)& v1 = dynamic_cast<const CONCAT2 (octave_, t1)&> (a1); \
344 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \ 344 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \
345 \ 345 \
346 return octave_value (f (v1.CONCAT2 (t1, _value) (), v2.CONCAT2 (t2, _value) ())); \ 346 return octave_value (f (v1.CONCAT2 (t1, _value) (), v2.CONCAT2 (t2, _value) ())); \
347 } 347 }
348 348
349 #define DEFNDBINOP_FN(name, t1, t2, e1, e2, f) \ 349 #define DEFNDBINOP_FN(name, t1, t2, e1, e2, f) \
350 static octave_value \ 350 static octave_value \
351 CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \ 351 CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \
352 const octave_base_value& a2) \ 352 const octave_base_value& a2) \
353 { \ 353 { \
354 const CONCAT2 (octave_, t1)& v1 = dynamic_cast<const CONCAT2 (octave_, t1)&> (a1); \ 354 const CONCAT2 (octave_, t1)& v1 = dynamic_cast<const CONCAT2 (octave_, t1)&> (a1); \
355 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \ 355 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \
356 \ 356 \
357 return octave_value (f (v1.CONCAT2 (e1, _value) (), v2.CONCAT2 (e2, _value) ())); \ 357 return octave_value (f (v1.CONCAT2 (e1, _value) (), v2.CONCAT2 (e2, _value) ())); \
358 } 358 }
359 359
360 #define DEFNDCMPLXCMPOP_FN(name, t1, t2, e1, e2, f) \ 360 #define DEFNDCMPLXCMPOP_FN(name, t1, t2, e1, e2, f) \
361 static octave_value \ 361 static octave_value \
362 CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \ 362 CONCAT2 (oct_binop_, name) (const octave_base_value& a1, \
363 const octave_base_value& a2) \ 363 const octave_base_value& a2) \
364 { \ 364 { \
365 const CONCAT2 (octave_, t1)& v1 = dynamic_cast<const CONCAT2 (octave_, t1)&> (a1); \ 365 const CONCAT2 (octave_, t1)& v1 = dynamic_cast<const CONCAT2 (octave_, t1)&> (a1); \
366 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \ 366 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \
367 \ 367 \
368 return octave_value (f (v1.CONCAT2 (e1, _value) (), v2.CONCAT2 (e2, _value) ())); \ 368 return octave_value (f (v1.CONCAT2 (e1, _value) (), v2.CONCAT2 (e2, _value) ())); \
369 } 369 }
370 370
371 #define DEFCATOPX(name, t1, t2) \ 371 #define DEFCATOPX(name, t1, t2) \
372 static octave_value \ 372 static octave_value \
373 CONCAT2 (oct_catop_, name) (octave_base_value&, const octave_base_value&, \ 373 CONCAT2 (oct_catop_, name) (octave_base_value&, const octave_base_value&, \
374 const Array<octave_idx_type>& ra_idx) 374 const Array<octave_idx_type>& ra_idx)
375 375
376 #define DEFCATOP(name, t1, t2) \ 376 #define DEFCATOP(name, t1, t2) \
377 static octave_value \ 377 static octave_value \
378 CONCAT2 (oct_catop_, name) (octave_base_value& a1, \ 378 CONCAT2 (oct_catop_, name) (octave_base_value& a1, \
379 const octave_base_value& a2, \ 379 const octave_base_value& a2, \
380 const Array<octave_idx_type>& ra_idx) 380 const Array<octave_idx_type>& ra_idx)
381 381
382 // FIXME: in some cases, the constructor isn't necessary. 382 // FIXME: in some cases, the constructor isn't necessary.
383 383
384 #define DEFCATOP_FN(name, t1, t2, f) \ 384 #define DEFCATOP_FN(name, t1, t2, f) \
385 static octave_value \ 385 static octave_value \
386 CONCAT2 (oct_catop_, name) (octave_base_value& a1, \ 386 CONCAT2 (oct_catop_, name) (octave_base_value& a1, \
387 const octave_base_value& a2, \ 387 const octave_base_value& a2, \
388 const Array<octave_idx_type>& ra_idx) \ 388 const Array<octave_idx_type>& ra_idx) \
389 { \ 389 { \
390 CONCAT2 (octave_, t1)& v1 = dynamic_cast<CONCAT2 (octave_, t1)&> (a1); \ 390 CONCAT2 (octave_, t1)& v1 = dynamic_cast<CONCAT2 (octave_, t1)&> (a1); \
391 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \ 391 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \
392 \ 392 \
393 return octave_value (v1.CONCAT2 (t1, _value) () . f (v2.CONCAT2 (t2, _value) (), ra_idx)); \ 393 return octave_value (v1.CONCAT2 (t1, _value) () . f (v2.CONCAT2 (t2, _value) (), ra_idx)); \
394 } 394 }
395 395
396 #define DEFNDCATOP_FN(name, t1, t2, e1, e2, f) \ 396 #define DEFNDCATOP_FN(name, t1, t2, e1, e2, f) \
397 static octave_value \ 397 static octave_value \
398 CONCAT2 (oct_catop_, name) (octave_base_value& a1, \ 398 CONCAT2 (oct_catop_, name) (octave_base_value& a1, \
399 const octave_base_value& a2, \ 399 const octave_base_value& a2, \
400 const Array<octave_idx_type>& ra_idx) \ 400 const Array<octave_idx_type>& ra_idx) \
401 { \ 401 { \
402 CONCAT2 (octave_, t1)& v1 = dynamic_cast<CONCAT2 (octave_, t1)&> (a1); \ 402 CONCAT2 (octave_, t1)& v1 = dynamic_cast<CONCAT2 (octave_, t1)&> (a1); \
403 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \ 403 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \
404 \ 404 \
405 return octave_value (v1.CONCAT2 (e1, _value) () . f (v2.CONCAT2 (e2, _value) (), ra_idx)); \ 405 return octave_value (v1.CONCAT2 (e1, _value) () . f (v2.CONCAT2 (e2, _value) (), ra_idx)); \
406 } 406 }
407 407
408 #define DEFNDCHARCATOP_FN(name, t1, t2, f) \ 408 #define DEFNDCHARCATOP_FN(name, t1, t2, f) \
409 static octave_value \ 409 static octave_value \
410 CONCAT2 (oct_catop_, name) (octave_base_value& a1, \ 410 CONCAT2 (oct_catop_, name) (octave_base_value& a1, \
411 const octave_base_value& a2, \ 411 const octave_base_value& a2, \
412 const Array<octave_idx_type>& ra_idx) \ 412 const Array<octave_idx_type>& ra_idx) \
413 { \ 413 { \
414 CONCAT2 (octave_, t1)& v1 = dynamic_cast<CONCAT2 (octave_, t1)&> (a1); \ 414 CONCAT2 (octave_, t1)& v1 = dynamic_cast<CONCAT2 (octave_, t1)&> (a1); \
415 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \ 415 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \
416 \ 416 \
417 return octave_value (v1.char_array_value () . f (v2.char_array_value (), ra_idx), \ 417 return octave_value (v1.char_array_value () . f (v2.char_array_value (), ra_idx), \
418 ((a1.is_sq_string () || a2.is_sq_string ()) \ 418 ((a1.is_sq_string () || a2.is_sq_string ()) \
419 ? '\'' : '"')); \ 419 ? '\'' : '"')); \
420 } 420 }
421 421
422 // For compatibility, the second arg is always converted to the type 422 // For compatibility, the second arg is always converted to the type
423 // of the first. Hmm. 423 // of the first. Hmm.
424 424
425 #define DEFNDCATOP_FN2(name, t1, t2, tc1, tc2, e1, e2, f) \ 425 #define DEFNDCATOP_FN2(name, t1, t2, tc1, tc2, e1, e2, f) \
426 static octave_value \ 426 static octave_value \
427 CONCAT2 (oct_catop_, name) (octave_base_value& a1, \ 427 CONCAT2 (oct_catop_, name) (octave_base_value& a1, \
428 const octave_base_value& a2, \ 428 const octave_base_value& a2, \
429 const Array<octave_idx_type>& ra_idx) \ 429 const Array<octave_idx_type>& ra_idx) \
430 { \ 430 { \
431 CONCAT2 (octave_, t1)& v1 = dynamic_cast<CONCAT2 (octave_, t1)&> (a1); \ 431 CONCAT2 (octave_, t1)& v1 = dynamic_cast<CONCAT2 (octave_, t1)&> (a1); \
432 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \ 432 const CONCAT2 (octave_, t2)& v2 = dynamic_cast<const CONCAT2 (octave_, t2)&> (a2); \
433 \ 433 \
434 return octave_value (tc1 (v1.CONCAT2 (e1, _value) ()) . f (tc2 (v2.CONCAT2 (e2, _value) ()), ra_idx)); \ 434 return octave_value (tc1 (v1.CONCAT2 (e1, _value) ()) . f (tc2 (v2.CONCAT2 (e2, _value) ()), ra_idx)); \
435 } 435 }
436 436
437 #endif 437 #endif