Mercurial > hg > octave-lyh
diff liboctave/MArray.cc @ 9612:66970dd627f6
further liboctave design improvements
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Fri, 04 Sep 2009 11:22:53 +0200 |
parents | 3a1dd361f978 |
children | 47c5af1868df |
line wrap: on
line diff
--- a/liboctave/MArray.cc +++ b/liboctave/MArray.cc @@ -117,8 +117,9 @@ operator += (MArray<T>& a, const T& s) { if (a.is_shared ()) - return a = a + s; - DO_VS_OP2 (T, a, +=, s) + a = a + s; + else + do_ms_inplace_op<MArray<T>, T> (a, s, mx_inline_add2); return a; } @@ -127,8 +128,9 @@ operator -= (MArray<T>& a, const T& s) { if (a.is_shared ()) - return a = a - s; - DO_VS_OP2 (T, a, -=, s) + a = a - s; + else + do_ms_inplace_op<MArray<T>, T> (a, s, mx_inline_sub2); return a; } @@ -137,8 +139,9 @@ operator *= (MArray<T>& a, const T& s) { if (a.is_shared ()) - return a = a * s; - DO_VS_OP2 (T, a, *=, s) + a = a * s; + else + do_ms_inplace_op<MArray<T>, T> (a, s, mx_inline_mul2); return a; } @@ -147,8 +150,9 @@ operator /= (MArray<T>& a, const T& s) { if (a.is_shared ()) - return a = a / s; - DO_VS_OP2 (T, a, /=, s) + a = a / s; + else + do_ms_inplace_op<MArray<T>, T> (a, s, mx_inline_div2); return a; } @@ -159,16 +163,9 @@ operator += (MArray<T>& a, const MArray<T>& b) { if (a.is_shared ()) - return a = a + b; - octave_idx_type l = a.length (); - if (l > 0) - { - octave_idx_type bl = b.length (); - if (l != bl) - gripe_nonconformant ("operator +=", l, bl); - else - DO_VV_OP2 (T, a, +=, b); - } + a = a + b; + else + do_mm_inplace_op<MArray<T>, MArray<T> > (a, b, mx_inline_add2, "+="); return a; } @@ -177,16 +174,9 @@ operator -= (MArray<T>& a, const MArray<T>& b) { if (a.is_shared ()) - return a = a - b; - octave_idx_type l = a.length (); - if (l > 0) - { - octave_idx_type bl = b.length (); - if (l != bl) - gripe_nonconformant ("operator -=", l, bl); - else - DO_VV_OP2 (T, a, -=, b); - } + a = a - b; + else + do_mm_inplace_op<MArray<T>, MArray<T> > (a, b, mx_inline_sub2, "-="); return a; } @@ -196,15 +186,8 @@ { if (a.is_shared ()) return a = product (a, b); - octave_idx_type l = a.length (); - if (l > 0) - { - octave_idx_type bl = b.length (); - if (l != bl) - gripe_nonconformant ("operator .*=", l, bl); - else - DO_VV_OP2 (T, a, *=, b); - } + else + do_mm_inplace_op<MArray<T>, MArray<T> > (a, b, mx_inline_mul2, ".*="); return a; } @@ -214,86 +197,55 @@ { if (a.is_shared ()) return a = quotient (a, b); - octave_idx_type l = a.length (); - if (l > 0) - { - octave_idx_type bl = b.length (); - if (l != bl) - gripe_nonconformant ("operator ./=", l, bl); - else - DO_VV_OP2 (T, a, /=, b); - } + else + do_mm_inplace_op<MArray<T>, MArray<T> > (a, b, mx_inline_div2, "./="); return a; } // Element by element MArray by scalar ops. -#define MARRAY_AS_OP(OP) \ +#define MARRAY_AS_OP(OP, FN) \ template <class T> \ MArray<T> \ operator OP (const MArray<T>& a, const T& s) \ { \ - MArray<T> result (a.length ()); \ - T *r = result.fortran_vec (); \ - octave_idx_type l = a.length (); \ - const T *v = a.data (); \ - DO_VS_OP (r, l, v, OP, s); \ - return result; \ + return do_ms_binary_op<MArray<T>, MArray<T>, T> (a, s, FN); \ } -MARRAY_AS_OP (+) -MARRAY_AS_OP (-) -MARRAY_AS_OP (*) -MARRAY_AS_OP (/) +MARRAY_AS_OP (+, mx_inline_add) +MARRAY_AS_OP (-, mx_inline_sub) +MARRAY_AS_OP (*, mx_inline_mul) +MARRAY_AS_OP (/, mx_inline_div) // Element by element scalar by MArray ops. -#define MARRAY_SA_OP(OP) \ +#define MARRAY_SA_OP(OP, FN) \ template <class T> \ MArray<T> \ operator OP (const T& s, const MArray<T>& a) \ { \ - MArray<T> result (a.length ()); \ - T *r = result.fortran_vec (); \ - octave_idx_type l = a.length (); \ - const T *v = a.data (); \ - DO_SV_OP (r, l, s, OP, v); \ - return result; \ + return do_sm_binary_op<MArray<T>, T, MArray<T> > (s, a, FN); \ } -MARRAY_SA_OP(+) -MARRAY_SA_OP(-) -MARRAY_SA_OP(*) -MARRAY_SA_OP(/) +MARRAY_SA_OP(+, mx_inline_add) +MARRAY_SA_OP(-, mx_inline_sub) +MARRAY_SA_OP(*, mx_inline_mul) +MARRAY_SA_OP(/, mx_inline_div) // Element by element MArray by MArray ops. -#define MARRAY_AA_OP(FCN, OP) \ +#define MARRAY_AA_OP(FCN, OP, FN) \ template <class T> \ MArray<T> \ FCN (const MArray<T>& a, const MArray<T>& b) \ { \ - octave_idx_type l = a.length (); \ - octave_idx_type bl = b.length (); \ - if (l != bl) \ - { \ - gripe_nonconformant (#FCN, l, bl); \ - return MArray<T> (); \ - } \ - if (l == 0) \ - return MArray<T> (); \ - MArray<T> result (l); \ - T *r = result.fortran_vec (); \ - const T *x = a.data (); \ - const T *y = b.data (); \ - DO_VV_OP (r, l, x, OP, y); \ - return result; \ + return do_mm_binary_op<MArray<T>, MArray<T>, MArray<T> > (a, b, FN, #FCN); \ } -MARRAY_AA_OP (operator +, +) -MARRAY_AA_OP (operator -, -) -MARRAY_AA_OP (product, *) -MARRAY_AA_OP (quotient, /) +MARRAY_AA_OP (operator +, +, mx_inline_add) +MARRAY_AA_OP (operator -, -, mx_inline_sub) +MARRAY_AA_OP (product, *, mx_inline_mul) +MARRAY_AA_OP (quotient, /, mx_inline_div) // Unary MArray ops. @@ -308,12 +260,7 @@ MArray<T> operator - (const MArray<T>& a) { - octave_idx_type l = a.length (); - MArray<T> result (l); - T *r = result.fortran_vec (); - const T *x = a.data (); - NEG_V (r, l, x); - return result; + return do_mx_unary_op<MArray<T>, MArray<T> > (a, mx_inline_uminus); } /*