Mercurial > hg > octave-lyh
annotate liboctave/MArray-defs.h @ 9557:3a1dd361f978
optimize .*=, ./= operators
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Mon, 24 Aug 2009 09:45:34 +0200 |
parents | 1beb23d2b892 |
children | a9b37bae1802 |
rev | line source |
---|---|
7016 | 1 /* |
2 | |
8920 | 3 Copyright (C) 1996, 1999, 2000, 2003, 2005, 2006, 2007, 2008, |
4 2009 John W. Eaton | |
7016 | 5 |
6 This file is part of Octave. | |
7 | |
8 Octave is free software; you can redistribute it and/or modify it | |
9 under the terms of the GNU General Public License as published by the | |
10 Free Software Foundation; either version 3 of the License, or (at your | |
11 option) any later version. | |
12 | |
13 Octave is distributed in the hope that it will be useful, but WITHOUT | |
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
19 along with Octave; see the file COPYING. If not, see | |
20 <http://www.gnu.org/licenses/>. | |
21 | |
22 */ | |
23 | |
3741 | 24 #if !defined (octave_MArray_defs_h) |
25 #define octave_MArray_defs_h 1 | |
26 | |
3649 | 27 // Nothing like a little CPP abuse to brighten everyone's day. |
1988 | 28 |
3504 | 29 #define DO_VS_OP(r, l, v, OP, s) \ |
1988 | 30 if (l > 0) \ |
31 { \ | |
5275 | 32 for (octave_idx_type i = 0; i < l; i++) \ |
3504 | 33 r[i] = v[i] OP s; \ |
1988 | 34 } |
35 | |
3504 | 36 #define DO_SV_OP(r, l, s, OP, v) \ |
1988 | 37 if (l > 0) \ |
38 { \ | |
5275 | 39 for (octave_idx_type i = 0; i < l; i++) \ |
3504 | 40 r[i] = s OP v[i]; \ |
1988 | 41 } |
42 | |
3504 | 43 #define DO_VV_OP(r, l, x, OP, y) \ |
1988 | 44 if (l > 0) \ |
45 { \ | |
5275 | 46 for (octave_idx_type i = 0; i < l; i++) \ |
3504 | 47 r[i] = x[i] OP y[i]; \ |
1988 | 48 } |
49 | |
3504 | 50 #define NEG_V(r, l, x) \ |
1988 | 51 if (l > 0) \ |
52 { \ | |
5275 | 53 for (octave_idx_type i = 0; i < l; i++) \ |
3504 | 54 r[i] = -x[i]; \ |
1988 | 55 } |
56 | |
4646 | 57 #define DO_VS_OP2(T, a, OP, s) \ |
5275 | 58 octave_idx_type l = a.length (); \ |
1988 | 59 if (l > 0) \ |
60 { \ | |
61 T *tmp = a.fortran_vec (); \ | |
5275 | 62 for (octave_idx_type i = 0; i < l; i++) \ |
1988 | 63 tmp[i] OP s; \ |
64 } | |
65 | |
4646 | 66 #define DO_VV_OP2(T, a, OP, b) \ |
1988 | 67 do \ |
68 { \ | |
69 T *a_tmp = a.fortran_vec (); \ | |
70 const T *b_tmp = b.data (); \ | |
5275 | 71 for (octave_idx_type i = 0; i < l; i++) \ |
3243 | 72 a_tmp[i] OP b_tmp[i]; \ |
1988 | 73 } \ |
74 while (0) | |
75 | |
3573 | 76 // Instantiate the OP= operators. |
6708 | 77 #define MARRAY_OP_ASSIGN_DEFS(A_T, E_T, RHS_T, API) \ |
78 MARRAY_OP_ASSIGN_DECLS (A_T, E_T, template, API, , RHS_T) | |
3573 | 79 |
9546
1beb23d2b892
optimize op= in common cases
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
80 #define MARRAY_OP_ASSIGN_DEFS1(A_T, E_T, RHS_T, API) \ |
1beb23d2b892
optimize op= in common cases
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
81 MARRAY_OP_ASSIGN_DECLS1 (A_T, E_T, template, API, , RHS_T) |
1beb23d2b892
optimize op= in common cases
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
82 |
3573 | 83 // Instantiate the unary operators. |
6708 | 84 #define MARRAY_UNOP_DEFS(A_T, E_T, API) \ |
85 MARRAY_UNOP_DECLS (A_T, E_T, template, API, ) | |
3573 | 86 |
87 // Instantiate the binary operators. | |
6708 | 88 #define MARRAY_BINOP_DEFS(A_T, E_T, API) \ |
89 MARRAY_BINOP_DECLS (A_T, E_T, template, API, , A_T<E_T>, E_T) \ | |
90 MARRAY_BINOP_DECLS (A_T, E_T, template, API, , E_T, A_T<E_T>) \ | |
91 MARRAY_AA_BINOP_DECLS (A_T, E_T, template, API, ) | |
3573 | 92 |
6708 | 93 #define MDIAGARRAY2_BINOP_DEFS(A_T, E_T, API) \ |
94 MDIAGARRAY2_DAS_BINOP_DECLS (A_T, E_T, template, API, , A_T<E_T>, E_T) \ | |
95 MDIAGARRAY2_SDA_BINOP_DECLS (A_T, E_T, template, API, , E_T, A_T<E_T>) \ | |
96 MDIAGARRAY2_DADA_BINOP_DECLS (A_T, E_T, template, API, ) | |
3580 | 97 |
3573 | 98 // The following macros are for external use. |
99 | |
100 // Instantiate all the MArray friends for MArray element type T. | |
6708 | 101 #define INSTANTIATE_MARRAY_FRIENDS(T, API) \ |
9546
1beb23d2b892
optimize op= in common cases
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
102 MARRAY_OP_ASSIGN_DEFS1 (MArray, T, T, API) \ |
6708 | 103 MARRAY_OP_ASSIGN_DEFS (MArray, T, MArray<T>, API) \ |
104 MARRAY_UNOP_DEFS (MArray, T, API) \ | |
105 MARRAY_BINOP_DEFS (MArray, T, API) | |
3573 | 106 |
4513 | 107 // Instantiate all the MArray2 friends for MArray2 element type T. |
6708 | 108 #define INSTANTIATE_MARRAY2_FRIENDS(T, API) \ |
9546
1beb23d2b892
optimize op= in common cases
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
109 MARRAY_OP_ASSIGN_DEFS1 (MArray2, T, T, API) \ |
6708 | 110 MARRAY_OP_ASSIGN_DEFS (MArray2, T, MArray2<T>, API) \ |
111 MARRAY_UNOP_DEFS (MArray2, T, API) \ | |
112 MARRAY_BINOP_DEFS (MArray2, T, API) | |
3573 | 113 |
4513 | 114 // Instantiate all the MArrayN friends for MArrayN element type T. |
6708 | 115 #define INSTANTIATE_MARRAYN_FRIENDS(T, API) \ |
9546
1beb23d2b892
optimize op= in common cases
Jaroslav Hajek <highegg@gmail.com>
parents:
8920
diff
changeset
|
116 MARRAY_OP_ASSIGN_DEFS1 (MArrayN, T, T, API) \ |
6708 | 117 MARRAY_OP_ASSIGN_DEFS (MArrayN, T, MArrayN<T>, API) \ |
118 MARRAY_UNOP_DEFS (MArrayN, T, API) \ | |
119 MARRAY_BINOP_DEFS (MArrayN, T, API) | |
4513 | 120 |
121 // Instantiate all the MDiagArray2 friends for MDiagArray2 element type T. | |
6708 | 122 #define INSTANTIATE_MDIAGARRAY2_FRIENDS(T, API) \ |
123 MARRAY_UNOP_DEFS (MDiagArray2, T, API) \ | |
124 MDIAGARRAY2_BINOP_DEFS (MDiagArray2, T, API) | |
3580 | 125 |
3573 | 126 // Now we have all the definitions we need. |
127 | |
3741 | 128 #endif |