3
|
1 /* |
|
2 |
1882
|
3 Copyright (C) 1996 John W. Eaton |
3
|
4 |
|
5 This file is part of Octave. |
|
6 |
|
7 Octave is free software; you can redistribute it and/or modify it |
|
8 under the terms of the GNU General Public License as published by the |
|
9 Free Software Foundation; either version 2, or (at your option) any |
|
10 later version. |
|
11 |
|
12 Octave is distributed in the hope that it will be useful, but WITHOUT |
|
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
15 for more details. |
|
16 |
|
17 You should have received a copy of the GNU General Public License |
|
18 along with Octave; see the file COPYING. If not, write to the Free |
1315
|
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
3
|
20 |
|
21 */ |
|
22 |
2828
|
23 #if !defined (octave_mx_inlines_h) |
|
24 #define octave_mx_inlines_h 1 |
2804
|
25 |
|
26 #include <cstddef> |
|
27 |
1650
|
28 #include "oct-cmplx.h" |
461
|
29 |
2811
|
30 #define VS_OP_FCN(F, OP) \ |
|
31 template <class R, class V, class S> \ |
|
32 static inline void \ |
|
33 F ## _vs (R *r, const V *v, size_t n, S s) \ |
|
34 { \ |
|
35 for (size_t i = 0; i < n; i++) \ |
|
36 r[i] = v[i] OP s; \ |
|
37 } |
|
38 |
|
39 VS_OP_FCN(add, +) |
|
40 VS_OP_FCN(subtract, -) |
|
41 VS_OP_FCN(multiply, *) |
|
42 VS_OP_FCN(divide, /) |
3
|
43 |
2804
|
44 #define VS_OP(F, OP, R, V, S) \ |
2811
|
45 extern template void F ## _vs (R *, const V *, size_t, S); \ |
2804
|
46 static inline R * \ |
|
47 F (const V *v, size_t n, S s) \ |
|
48 { \ |
|
49 R *r = 0; \ |
|
50 if (n > 0) \ |
|
51 { \ |
|
52 r = new R [n]; \ |
2811
|
53 F ## _vs (r, v, n, s); \ |
2804
|
54 } \ |
|
55 return r; \ |
|
56 } |
3
|
57 |
2804
|
58 #define VS_OPS(R, V, S) \ |
|
59 VS_OP (add, +, R, S, V) \ |
|
60 VS_OP (subtract, -, R, S, V) \ |
|
61 VS_OP (multiply, *, R, S, V) \ |
|
62 VS_OP (divide, /, R, S, V) |
3
|
63 |
2804
|
64 VS_OPS (double, double, double) |
|
65 VS_OPS (Complex, double, Complex) |
|
66 VS_OPS (Complex, Complex, double) |
|
67 VS_OPS (Complex, Complex, Complex) |
3
|
68 |
2811
|
69 #define SV_OP_FCN(F, OP) \ |
|
70 template <class R, class S, class V> \ |
|
71 static inline void \ |
|
72 F ## _sv (R *r, S s, const V *v, size_t n) \ |
|
73 { \ |
|
74 for (size_t i = 0; i < n; i++) \ |
|
75 r[i] = s OP v[i]; \ |
|
76 } \ |
|
77 |
|
78 SV_OP_FCN(add, +) |
|
79 SV_OP_FCN(subtract, -) |
|
80 SV_OP_FCN(multiply, *) |
|
81 SV_OP_FCN(divide, /) |
|
82 |
2804
|
83 #define SV_OP(F, OP, R, S, V) \ |
2811
|
84 extern template void F ## _sv (R *, S, const V *, size_t); \ |
2804
|
85 static inline R * \ |
|
86 F (S s, const V *v, size_t n) \ |
|
87 { \ |
|
88 R *r = 0; \ |
|
89 if (n > 0) \ |
|
90 { \ |
|
91 r = new R [n]; \ |
2811
|
92 F ## _sv (r, s, v, n); \ |
2804
|
93 } \ |
|
94 return r; \ |
|
95 } |
3
|
96 |
2804
|
97 #define SV_OPS(R, S, V) \ |
|
98 SV_OP (add, +, R, V, S) \ |
|
99 SV_OP (subtract, -, R, V, S) \ |
|
100 SV_OP (multiply, *, R, V, S) \ |
|
101 SV_OP (divide, /, R, V, S) |
3
|
102 |
2804
|
103 SV_OPS (double, double, double) |
|
104 SV_OPS (Complex, double, Complex) |
|
105 SV_OPS (Complex, Complex, double) |
|
106 SV_OPS (Complex, Complex, Complex) |
3
|
107 |
2811
|
108 #define VV_OP_FCN(F, OP) \ |
|
109 template <class R, class T1, class T2> \ |
|
110 static inline void \ |
|
111 F ## _vv (R *r, const T1 *v1, const T2 *v2, size_t n) \ |
|
112 { \ |
|
113 for (size_t i = 0; i < n; i++) \ |
|
114 r[i] = v1[i] OP v2[i]; \ |
|
115 } \ |
|
116 |
|
117 VV_OP_FCN(add, +) |
|
118 VV_OP_FCN(subtract, -) |
|
119 VV_OP_FCN(multiply, *) |
|
120 VV_OP_FCN(divide, /) |
|
121 |
2804
|
122 #define VV_OP(F, OP, R, T1, T2) \ |
2811
|
123 extern template void F ## _vv (R *, const T1 *, const T2 *, size_t); \ |
2804
|
124 static inline R * \ |
|
125 F (const T1 *v1, const T2 *v2, size_t n) \ |
|
126 { \ |
|
127 R *r = 0; \ |
|
128 if (n > 0) \ |
|
129 { \ |
|
130 r = new R [n]; \ |
2811
|
131 F ## _vv (r, v1, v2, n); \ |
2804
|
132 } \ |
|
133 return r; \ |
|
134 } |
3
|
135 |
2804
|
136 #define VV_OPS(R, T1, T2) \ |
|
137 VV_OP (add, +, R, T1, T2) \ |
|
138 VV_OP (subtract, -, R, T1, T2) \ |
|
139 VV_OP (multiply, *, R, T1, T2) \ |
|
140 VV_OP (divide, /, R, T1, T2) |
3
|
141 |
2804
|
142 VV_OPS (double, double, double) |
|
143 VV_OPS (Complex, double, Complex) |
|
144 VV_OPS (Complex, Complex, double) |
|
145 VV_OPS (Complex, Complex, Complex) |
3
|
146 |
2804
|
147 #define VS_OP2(F, OP, V, S) \ |
|
148 static inline V * \ |
|
149 F (V *v, size_t n, S s) \ |
|
150 { \ |
|
151 for (size_t i = 0; i < n; i++) \ |
|
152 v[i] OP s; \ |
|
153 return v; \ |
|
154 } |
3
|
155 |
2804
|
156 #define VS_OP2S(V, S) \ |
|
157 VS_OP2 (add2, +=, V, S) \ |
|
158 VS_OP2 (subtract2, -=, V, S) \ |
|
159 VS_OP2 (multiply2, *=, V, S) \ |
|
160 VS_OP2 (divide2, /=, V, S) \ |
|
161 VS_OP2 (copy, =, V, S) |
3
|
162 |
2804
|
163 VS_OP2S (double, double) |
|
164 VS_OP2S (Complex, double) |
|
165 VS_OP2S (Complex, Complex) |
3
|
166 |
2804
|
167 #define VV_OP2(F, OP, T1, T2) \ |
|
168 static inline T1 * \ |
|
169 F (T1 *v1, const T2 *v2, size_t n) \ |
|
170 { \ |
|
171 for (size_t i = 0; i < n; i++) \ |
|
172 v1[i] OP v2[i]; \ |
|
173 return v1; \ |
|
174 } |
3
|
175 |
2804
|
176 #define VV_OP2S(T1, T2) \ |
|
177 VV_OP2 (add2, +=, T1, T2) \ |
|
178 VV_OP2 (subtract2, -=, T1, T2) \ |
|
179 VV_OP2 (multiply2, *=, T1, T2) \ |
|
180 VV_OP2 (divide2, /=, T1, T2) \ |
|
181 VV_OP2 (copy, =, T1, T2) |
3
|
182 |
2804
|
183 VV_OP2S (double, double) |
|
184 VV_OP2S (Complex, double) |
|
185 VV_OP2S (Complex, Complex) |
3
|
186 |
2804
|
187 #define OP_EQ_FCN(T1, T2) \ |
|
188 static inline bool \ |
|
189 equal (const T1 *x, const T2 *y, size_t n) \ |
|
190 { \ |
|
191 for (size_t i = 0; i < n; i++) \ |
|
192 if (x[i] != y[i]) \ |
|
193 return false; \ |
|
194 return true; \ |
|
195 } |
3
|
196 |
2828
|
197 OP_EQ_FCN (bool, bool) |
2804
|
198 OP_EQ_FCN (char, char) |
|
199 OP_EQ_FCN (double, double) |
|
200 OP_EQ_FCN (Complex, Complex) |
3
|
201 |
2804
|
202 #define OP_DUP_FCN(OP, F, R, T) \ |
|
203 static inline R * \ |
|
204 F (const T *x, size_t n) \ |
|
205 { \ |
|
206 R *r = 0; \ |
|
207 if (n > 0) \ |
|
208 { \ |
|
209 r = new R [n]; \ |
|
210 for (size_t i = 0; i < n; i++) \ |
|
211 r[i] = OP (x[i]); \ |
|
212 } \ |
|
213 return r; \ |
|
214 } |
3
|
215 |
2804
|
216 OP_DUP_FCN (, dup, double, double) |
|
217 OP_DUP_FCN (, dup, Complex, Complex) |
3
|
218 |
2804
|
219 // These should really return a bool *. Also, they should probably be |
|
220 // in with a collection of other element-by-element boolean ops. |
|
221 OP_DUP_FCN (0.0 ==, not, double, double) |
|
222 OP_DUP_FCN (0.0 ==, not, double, Complex) |
3
|
223 |
2804
|
224 OP_DUP_FCN (, make_complex, Complex, double) |
|
225 |
|
226 OP_DUP_FCN (-, negate, double, double) |
|
227 OP_DUP_FCN (-, negate, Complex, Complex) |
3
|
228 |
2804
|
229 OP_DUP_FCN (real, real_dup, double, Complex) |
|
230 OP_DUP_FCN (imag, imag_dup, double, Complex) |
|
231 OP_DUP_FCN (conj, conj_dup, Complex, Complex) |
3
|
232 |
2804
|
233 #endif |
3
|
234 |
|
235 /* |
|
236 ;;; Local Variables: *** |
|
237 ;;; mode: C++ *** |
|
238 ;;; End: *** |
|
239 */ |