# HG changeset patch # User jwe # Date 797135128 0 # Node ID 9689615b34f2b68b721bdba6e5072d395df95f89 # Parent 7b9d52071a0c4b83d15a36668dada289ddf56df6 [project @ 1995-04-06 02:25:15 by jwe] diff -r 7b9d52071a0c -r 9689615b34f2 liboctave/MArray.cc --- a/liboctave/MArray.cc Thu Apr 06 02:21:03 1995 +0000 +++ b/liboctave/MArray.cc Thu Apr 06 02:25:28 1995 +0000 @@ -76,6 +76,25 @@ result[i] = -x[i]; \ } +#define DO_VS_OP2(OP) \ + int l = length (); \ + if (l > 0) \ + { \ + T *tmp = fortran_vec (); \ + for (int i = 0; i < l; i++) \ + tmp[i] OP s; \ + } + +#define DO_VV_OP2(OP) \ + do \ + { \ + T *tmp = fortran_vec (); \ + const T *rhs = a.data (); \ + for (int i = 0; i < l; i++) \ + tmp[i] += rhs[i]; \ + } \ + while (0) + /* * One dimensional array with math ops. */ @@ -83,148 +102,111 @@ // Element by element MArray by scalar ops. template -MArray -operator + (const MArray& a, const T& s) -{ - DO_VS_OP (+); - return MArray (result, l); -} - -template -MArray -operator - (const MArray& a, const T& s) +MArray& +MArray::operator += (const T& s) { - DO_VS_OP (-); - return MArray (result, l); -} - -template -MArray -operator * (const MArray& a, const T& s) -{ - DO_VS_OP (*); - return MArray (result, l); + DO_VS_OP2 (+=) + return *this; } template -MArray -operator / (const MArray& a, const T& s) -{ - DO_VS_OP (/); - return MArray (result, l); -} - -// Element by element scalar by MArray ops. - -template -MArray -operator + (const T& s, const MArray& a) +MArray& +MArray::operator -= (const T& s) { - DO_SV_OP (+); - return MArray (result, l); -} - -template -MArray -operator - (const T& s, const MArray& a) -{ - DO_SV_OP (-); - return MArray (result, l); -} - -template -MArray -operator * (const T& s, const MArray& a) -{ - DO_SV_OP (*); - return MArray (result, l); -} - -template -MArray -operator / (const T& s, const MArray& a) -{ - DO_SV_OP (/); - return MArray (result, l); + DO_VS_OP2 (-=) + return *this; } // Element by element MArray by MArray ops. template -MArray -operator + (const MArray& a, const MArray& b) +MArray& +MArray::operator += (const MArray& a) { - int l = a.length (); - if (l != b.length ()) + int l = length (); + if (l > 0) { - (*current_liboctave_error_handler) - ("nonconformant array addition attempted"); - return MArray (); + if (l != a.length ()) + (*current_liboctave_error_handler) \ + ("nonconformant += array operation attempted"); \ + else + DO_VV_OP2 (+=); } - - if (l == 0) - return MArray (); - - DO_VV_OP (+); - return MArray (result, l); + return *this; } template -MArray -operator - (const MArray& a, const MArray& b) +MArray& +MArray::operator -= (const MArray& a) { - int l = a.length (); - if (l != b.length ()) + int l = length (); + if (l > 0) { - (*current_liboctave_error_handler) - ("nonconformant array subtraction attempted"); - return MArray (); + if (l != a.length ()) + (*current_liboctave_error_handler) \ + ("nonconformant -= array operation attempted"); \ + else + DO_VV_OP2 (-=); } - - if (l == 0) - return MArray (); - - DO_VV_OP (-); - return MArray (result, l); + return *this; } -template -MArray -product (const MArray& a, const MArray& b) -{ - int l = a.length (); - if (l != b.length ()) - { - (*current_liboctave_error_handler) - ("nonconformant array product attempted"); - return MArray (); - } +// Element by element MArray by scalar ops. + +#define MARRAY_AS_OP(OP) \ + template \ + MArray \ + operator OP (const MArray& a, const T& s) \ + { \ + DO_VS_OP (OP); \ + return MArray (result, l); \ + } - if (l == 0) - return MArray (); +MARRAY_AS_OP (+) +MARRAY_AS_OP (-) +MARRAY_AS_OP (*) +MARRAY_AS_OP (/) + +// Element by element scalar by MArray ops. - DO_VV_OP (*); - return MArray (result, l); -} +#define MARRAY_SA_OP(OP) \ + template \ + MArray \ + operator OP (const T& s, const MArray& a) \ + { \ + DO_SV_OP (OP); \ + return MArray (result, l); \ + } -template -MArray -quotient (const MArray& a, const MArray& b) -{ - int l = a.length (); - if (l != b.length ()) - { - (*current_liboctave_error_handler) - ("nonconformant array quotient attempted"); - return MArray (); - } +MARRAY_SA_OP(+) +MARRAY_SA_OP(-) +MARRAY_SA_OP(*) +MARRAY_SA_OP(/) + +// Element by element MArray by MArray ops. - if (l == 0) - return MArray (); +#define MARRAY_AA_OP(FCN, OP, OP_STR) \ + template \ + MArray \ + FCN (const MArray& a, const MArray& b) \ + { \ + int l = a.length (); \ + if (l != b.length ()) \ + { \ + (*current_liboctave_error_handler) \ + ("nonconformant array " OP_STR " attempted"); \ + return MArray (); \ + } \ + if (l == 0) \ + return MArray (); \ + DO_VV_OP (OP); \ + return MArray (result, l); \ + } - DO_VV_OP (/); - return MArray (result, l); -} +MARRAY_AA_OP (operator +, +, "addition") +MARRAY_AA_OP (operator -, -, "subtraction") +MARRAY_AA_OP (product, *, "multiplication") +MARRAY_AA_OP (quotient, /, "division") // Unary MArray ops. @@ -251,156 +233,125 @@ // Element by element MArray2 by scalar ops. template -MArray2 -operator + (const MArray2& a, const T& s) -{ - DO_VS_OP (+); - return MArray2 (result, a.rows (), a.cols ()); -} - -template -MArray2 -operator - (const MArray2& a, const T& s) +MArray2& +MArray2::operator += (const T& s) { - DO_VS_OP (-); - return MArray2 (result, a.rows (), a.cols ()); -} - -template -MArray2 -operator * (const MArray2& a, const T& s) -{ - DO_VS_OP (*); - return MArray2 (result, a.rows (), a.cols ()); + DO_VS_OP2 (+=) + return *this; } template -MArray2 -operator / (const MArray2& a, const T& s) -{ - DO_VS_OP (/); - return MArray2 (result, a.rows (), a.cols ()); -} - -// Element by element scalar by MArray2 ops. - -template -MArray2 -operator + (const T& s, const MArray2& a) +MArray2& +MArray2::operator -= (const T& s) { - DO_SV_OP (+); - return MArray2 (result, a.rows (), a.cols ()); -} - -template -MArray2 -operator - (const T& s, const MArray2& a) -{ - DO_SV_OP (-); - return MArray2 (result, a.rows (), a.cols ()); -} - -template -MArray2 -operator * (const T& s, const MArray2& a) -{ - DO_SV_OP (*); - return MArray2 (result, a.rows (), a.cols ()); -} - -template -MArray2 -operator / (const T& s, const MArray2& a) -{ - DO_SV_OP (/); - return MArray2 (result, a.rows (), a.cols ()); + DO_VS_OP2 (-=) + return *this; } // Element by element MArray2 by MArray2 ops. template -MArray2 -operator + (const MArray2& a, const MArray2& b) +MArray2& +MArray2::operator += (const MArray2& a) { - int r = a.rows (); - int c = a.cols (); - if (r != b.rows () || c != b.cols ()) + int r = rows (); + int c = cols (); + if (r != a.rows () || c != a.cols ()) { (*current_liboctave_error_handler) - ("nonconformant array addition attempted"); - return MArray2 (); + ("nonconformant += array operation attempted"); } - - if (r == 0 || c == 0) - return MArray2 (); - - int l = a.length (); - DO_VV_OP (+); - return MArray2 (result, r, c); + else + { + if (r > 0 && c > 0) + { + int l = a.length (); + DO_VV_OP2 (+=); + } + } + return *this; } template -MArray2 -operator - (const MArray2& a, const MArray2& b) +MArray2& +MArray2::operator -= (const MArray2& a) { - int r = a.rows (); - int c = a.cols (); - if (r != b.rows () || c != b.cols ()) - { - (*current_liboctave_error_handler) - ("nonconformant array subtraction attempted"); - return MArray2 (); - } - - if (r == 0 || c == 0) - return MArray2 (); - - int l = a.length (); - DO_VV_OP (-); - return MArray2 (result, r, c); -} - -template -MArray2 -product (const MArray2& a, const MArray2& b) -{ - int r = a.rows (); - int c = a.cols (); - if (r != b.rows () || c != b.cols ()) + int r = rows (); + int c = cols (); + if (r != a.rows () || c != a.cols ()) { (*current_liboctave_error_handler) - ("nonconformant array product attempted"); - return MArray2 (); + ("nonconformant -= array operation attempted"); } - - if (r == 0 || c == 0) - return MArray2 (); - - int l = a.length (); - DO_VV_OP (*); - return MArray2 (result, r, c); + else + { + if (r > 0 && c > 0) + { + int l = a.length (); + DO_VV_OP2 (-=); + } + } + return *this; } -template -MArray2 -quotient (const MArray2& a, const MArray2& b) -{ - int r = a.rows (); - int c = a.cols (); - if (r != b.rows () || c != b.cols ()) - { - (*current_liboctave_error_handler) - ("nonconformant array quotient attempted"); - return MArray2 (); - } +// Element by element MArray2 by scalar ops. + +#define MARRAY_A2S_OP(OP) \ + template \ + MArray2 \ + operator OP (const MArray2& a, const T& s) \ + { \ + DO_VS_OP (OP); \ + return MArray2 (result, a.rows (), a.cols ()); \ + } + +MARRAY_A2S_OP (+) +MARRAY_A2S_OP (-) +MARRAY_A2S_OP (*) +MARRAY_A2S_OP (/) + +// Element by element scalar by MArray2 ops. + +#define MARRAY_SA2_OP(OP) \ + template \ + MArray2 \ + operator OP (const T& s, const MArray2& a) \ + { \ + DO_SV_OP (OP); \ + return MArray2 (result, a.rows (), a.cols ()); \ + } - if (r == 0 || c == 0) - return MArray2 (); +MARRAY_SA2_OP (+) +MARRAY_SA2_OP (-) +MARRAY_SA2_OP (*) +MARRAY_SA2_OP (/) + +// Element by element MArray2 by MArray2 ops. - int l = a.length (); - DO_VV_OP (/); - return MArray2 (result, r, c); -} +#define MARRAY_A2A2_OP(FCN, OP, OP_STR) \ + template \ + MArray2 \ + FCN (const MArray2& a, const MArray2& b) \ + { \ + int r = a.rows (); \ + int c = a.cols (); \ + if (r != b.rows () || c != b.cols ()) \ + { \ + (*current_liboctave_error_handler) \ + ("nonconformant array " OP_STR " attempted"); \ + return MArray2 (); \ + } \ + if (r == 0 || c == 0) \ + return MArray2 (); \ + int l = a.length (); \ + DO_VV_OP (OP); \ + return MArray2 (result, r, c); \ + } + +MARRAY_A2A2_OP (operator +, +, "addition") +MARRAY_A2A2_OP (operator -, -, "subtraction") +MARRAY_A2A2_OP (product, *, "product") +MARRAY_A2A2_OP (quotient, /, "quotient") // Unary MArray2 ops. @@ -416,24 +367,38 @@ * Two dimensional diagonal array with math ops. */ -// Element by element MDiagArray by scalar ops. +// Element by element MDiagArray by MDiagArray ops. template -MDiagArray -operator * (const MDiagArray& a, const T& s) +MDiagArray& +MDiagArray::operator += (const MDiagArray& a) { - DO_VS_OP (*); - return MDiagArray (result, a.rows (), a.cols ()); + // XXX FIXME XXX + return *this; } template -MDiagArray -operator / (const MDiagArray& a, const T& s) +MDiagArray& +MDiagArray::operator -= (const MDiagArray& a) { - DO_VS_OP (/); - return MDiagArray (result, a.rows (), a.cols ()); + // XXX FIXME XXX + return *this; } +// Element by element MDiagArray by scalar ops. + +#define MARRAY_DAS_OP(OP) \ + template \ + MDiagArray \ + operator OP (const MDiagArray& a, const T& s) \ + { \ + DO_VS_OP (OP); \ + return MDiagArray (result, a.rows (), a.cols ()); \ + } + +MARRAY_DAS_OP (*) +MARRAY_DAS_OP (/) + // Element by element scalar by MDiagArray ops. template @@ -446,68 +411,29 @@ // Element by element MDiagArray by MDiagArray ops. -template -MDiagArray -operator + (const MDiagArray& a, const MDiagArray& b) -{ - int r = a.rows (); - int c = a.cols (); - if (r != b.rows () || c != b.cols ()) - { - (*current_liboctave_error_handler) - ("nonconformant diagonal array addition attempted"); - return MDiagArray (); - } - - if (c == 0 || r == 0) - return MDiagArray (); - - int l = a.length (); - DO_VV_OP (+); - return MDiagArray (result, r, c); -} +#define MARRAY_DADA_OP(FCN, OP, OP_STR) \ + template \ + MDiagArray \ + FCN (const MDiagArray& a, const MDiagArray& b) \ + { \ + int r = a.rows (); \ + int c = a.cols (); \ + if (r != b.rows () || c != b.cols ()) \ + { \ + (*current_liboctave_error_handler) \ + ("nonconformant diagonal array " OP_STR " attempted"); \ + return MDiagArray (); \ + } \ + if (c == 0 || r == 0) \ + return MDiagArray (); \ + int l = a.length (); \ + DO_VV_OP (OP); \ + return MDiagArray (result, r, c); \ + } -template -MDiagArray -operator - (const MDiagArray& a, const MDiagArray& b) -{ - int r = a.rows (); - int c = a.cols (); - if (r != b.rows () || c != b.cols ()) - { - (*current_liboctave_error_handler) - ("nonconformant diagonal array subtraction attempted"); - return MDiagArray (); - } - - if (c == 0 || r == 0) - return MDiagArray (); - - int l = a.length (); - DO_VV_OP (-); - return MDiagArray (result, r, c); -} - -template -MDiagArray -product (const MDiagArray& a, const MDiagArray& b) -{ - int r = a.rows (); - int c = a.cols (); - if (r != b.rows () || c != b.cols ()) - { - (*current_liboctave_error_handler) - ("nonconformant diagonal array product attempted"); - return MDiagArray (); - } - - if (c == 0 || r == 0) - return MDiagArray (); - - int l = a.length (); - DO_VV_OP (*); - return MDiagArray (result, r, c); -} +MARRAY_DADA_OP (operator +, +, "addition") +MARRAY_DADA_OP (operator -, -, "subtraction") +MARRAY_DADA_OP (product, *, "product") // Unary MDiagArray ops. @@ -519,24 +445,6 @@ return MDiagArray (result, a.rows (), a.cols ()); } -#undef DO_SV_OP -#undef DO_VS_OP -#undef DO_VV_OP -#undef NEG_V - -#if 0 -#ifdef OCTAVE -typedefMArray octave_mad_template_type; -typedefMArray2 octave_ma2d_template_type; -typedefMDiagArray octave_mdad_template_type; - -#include -typedefMArray octave_mac_template_type; -typedefMArray2 octave_ma2c_template_type; -typedefMDiagArray octave_mdac_template_type; -#endif -#endif - /* ;;; Local Variables: *** ;;; mode: C++ *** diff -r 7b9d52071a0c -r 9689615b34f2 liboctave/MArray.h --- a/liboctave/MArray.h Thu Apr 06 02:21:03 1995 +0000 +++ b/liboctave/MArray.h Thu Apr 06 02:25:28 1995 +0000 @@ -54,17 +54,20 @@ MArray (const MArray& a) : Array (a) { } MArray& operator = (const MArray& a) - { return Array::operator = (a); } + { + Array::operator = (a); + return *this; + } // Element by element MArray by scalar ops. - MArray& operator += (const T& s) { /* XXX FIXME XXX */ } - MArray& operator -= (const T& s) { /* XXX FIXME XXX */ } + MArray& operator += (const T& s); + MArray& operator -= (const T& s); // Element by element MArray by MArray ops. - MArray& operator += (const MArray& a) { /* XXX FIXME XXX */ } - MArray& operator -= (const MArray& a) { /* XXX FIXME XXX */ } + MArray& operator += (const MArray& a); + MArray& operator -= (const MArray& a); // Element by element MArray by scalar ops. @@ -113,17 +116,20 @@ MArray2 (const MDiagArray& a); MArray2& operator = (const MArray2& a) - { return Array2::operator = (a); } + { + Array2::operator = (a); + return *this; + } // Element by element MArray2 by scalar ops. - MArray2& operator += (const T& s) { /* XXX FIXME XXX */ } - MArray2& operator -= (const T& s) { /* XXX FIXME XXX */ } + MArray2& operator += (const T& s); + MArray2& operator -= (const T& s); // Element by element MArray2 by MArray2 ops. - MArray2& operator += (const MArray2& a) { /* XXX FIXME XXX */ } - MArray2& operator -= (const MArray2& a) { /* XXX FIXME XXX */ } + MArray2& operator += (const MArray2& a); + MArray2& operator -= (const MArray2& a); // Element by element MArray2 by scalar ops. @@ -173,10 +179,15 @@ MDiagArray (const MArray& a) : DiagArray (a) { } MDiagArray& operator = (const MDiagArray& a) - { return DiagArray::operator = (a); } + { + DiagArray::operator = (a); + return *this; + } - MDiagArray& operator += (const MDiagArray& a) { /* XXX FIXME XXX */ } - MDiagArray& operator -= (const MDiagArray& a) { /* XXX FIXME XXX */ } +// Element by element MDiagArray by MDiagArray ops. + + MDiagArray& operator += (const MDiagArray& a); + MDiagArray& operator -= (const MDiagArray& a); // Element by element MDiagArray by scalar ops. @@ -201,10 +212,6 @@ friend MDiagArray operator - (const MDiagArray& a); }; -#ifdef __GNUG__ -#include "MArray.cc" -#endif - } // extern "C++" #endif diff -r 7b9d52071a0c -r 9689615b34f2 liboctave/Makefile.in --- a/liboctave/Makefile.in Thu Apr 06 02:21:03 1995 +0000 +++ b/liboctave/Makefile.in Thu Apr 06 02:25:28 1995 +0000 @@ -32,9 +32,9 @@ Quad.h Range.h lo-error.h f77-uscore.h sun-utils.h \ $(MATRIX_INC) -TEMPLATE_SRC = Array.cc +TEMPLATE_SRC = Array.cc MArray.cc -TI_SRC = Array-C.cc Array-d.cc +TI_SRC = Array-C.cc Array-d.cc MArray-C.cc MArray-d.cc MATRIX_SRC = CColVector.cc CDiagMatrix.cc CMatrix.cc CRowVector.cc \ CmplxAEPBAL.cc CmplxCHOL.cc CmplxDET.cc CmplxHESS.cc CmplxLU.cc \ @@ -49,7 +49,7 @@ Quad.cc Range.cc lo-error.cc sun-utils.cc $(TEMPLATE_SRC) \ $(TI_SRC) $(MATRIX_SRC) -EXTRAS = MArray.cc mx-kludge.cc mx-inlines.cc +EXTRAS = mx-kludge.cc mx-inlines.cc DISTFILES = Makefile.in $(SOURCES) $(INCLUDES) $(EXTRAS)