# HG changeset patch # User Kai T. Ohlhus # Date 1450744445 -3600 # Node ID 2a99b8b250cd083cc159def9cbd1c22f96fb95c0 # Parent 3894a672799edf4e1c23da8e281d3e3517d5bb14 MArray macro removal without loss of functionality to improve maintainability. * boolNDArray.cc: removed unnecessary header inclusion. * CNDArray.cc: removed unnecessary header inclusion. * fCNDArray.cc: removed unnecessary header inclusion. * MArray.cc: removed unnecessary header inclusion. * MDiagArray2.cc: removed unnecessary header inclusion. * MArray.h: partially expanded macros and left three meaningful one alive. * MDiagArray2.h: partially expanded macros and left a meaningful one alive. * MArray-decl.h: removed preprocessor abuse. * MArray-defs.h: removed preprocessor abuse. * module.mk: removed MArray-{decl/defs}.h from build system. diff -r 3894a672799e -r 2a99b8b250cd liboctave/array/CNDArray.cc --- a/liboctave/array/CNDArray.cc Mon Dec 21 13:27:53 2015 -0500 +++ b/liboctave/array/CNDArray.cc Tue Dec 22 01:34:05 2015 +0100 @@ -36,7 +36,6 @@ #include "functor.h" #include "lo-ieee.h" #include "lo-mappers.h" -#include "MArray-defs.h" #include "mx-base.h" #include "mx-op-defs.h" #include "mx-cnda-s.h" diff -r 3894a672799e -r 2a99b8b250cd liboctave/array/MArray-decl.h --- a/liboctave/array/MArray-decl.h Mon Dec 21 13:27:53 2015 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,269 +0,0 @@ -/* - -Copyright (C) 1996-2015 John W. Eaton - -This file is part of Octave. - -Octave is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 3 of the License, or (at your -option) any later version. - -Octave is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with Octave; see the file COPYING. If not, see -. - -*/ - -#if ! defined (octave_MArray_decl_h) -#define octave_MArray_decl_h 1 - -// A macro that can be used to declare and instantiate OP= operators. -#define MARRAY_OP_ASSIGN_DECL(A_T, E_T, OP, PFX, API, LTGT, RHS_T) \ - PFX API A_T& \ - operator OP LTGT (A_T&, const RHS_T&) - -#define MARRAY_OP_ASSIGN_DECLX(A_T, E_T, OP, PFX, API, LTGT, RHS_T) \ - PFX API A_T& \ - OP LTGT (A_T&, const RHS_T&) - -// All the OP= operators that we care about. -#define MARRAY_OP_ASSIGN_DECLS(A_T, E_T, PFX, API, LTGT, RHS_T) \ - MARRAY_OP_ASSIGN_DECL (A_T, E_T, +=, PFX, API, LTGT, RHS_T); \ - MARRAY_OP_ASSIGN_DECL (A_T, E_T, -=, PFX, API, LTGT, RHS_T); \ - MARRAY_OP_ASSIGN_DECLX (A_T, E_T, product_eq, PFX, API, LTGT, RHS_T); \ - MARRAY_OP_ASSIGN_DECLX (A_T, E_T, quotient_eq, PFX, API, LTGT, RHS_T); - -#define MARRAY_OP_ASSIGN_DECLS1(A_T, E_T, PFX, API, LTGT, RHS_T) \ - MARRAY_OP_ASSIGN_DECL (A_T, E_T, +=, PFX, API, LTGT, RHS_T); \ - MARRAY_OP_ASSIGN_DECL (A_T, E_T, -=, PFX, API, LTGT, RHS_T); \ - MARRAY_OP_ASSIGN_DECL (A_T, E_T, *=, PFX, API, LTGT, RHS_T); \ - MARRAY_OP_ASSIGN_DECL (A_T, E_T, /=, PFX, API, LTGT, RHS_T); - -// Generate forward declarations for OP= operators. -#define MARRAY_OP_ASSIGN_FWD_DECLS(A_T, RHS_T, API) \ - MARRAY_OP_ASSIGN_DECLS (A_T, T, template , API, , RHS_T) - -#define MARRAY_OP_ASSIGN_FWD_DECLS1(A_T, RHS_T, API) \ - MARRAY_OP_ASSIGN_DECLS1 (A_T, T, template , API, , RHS_T) - -// Generate friend declarations for the OP= operators. -#define MARRAY_OP_ASSIGN_FRIENDS(A_T, RHS_T, API) \ - MARRAY_OP_ASSIGN_DECLS (A_T, T, friend, API, <>, RHS_T) - -#define MARRAY_OP_ASSIGN_FRIENDS1(A_T, RHS_T, API) \ - MARRAY_OP_ASSIGN_DECLS1 (A_T, T, friend, API, <>, RHS_T) - -// A function that can be used to forward OP= operations from derived -// classes back to us. -#define MARRAY_OP_ASSIGN_FWD_FCN(R, F, T, C_X, X_T, C_Y, Y_T) \ - inline R \ - F (X_T& x, const Y_T& y) \ - { \ - return R (F (C_X (x), C_Y (y))); \ - } - -// All the OP= operators that we care about forwarding. -#define MARRAY_OP_ASSIGN_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_OP_ASSIGN_FWD_FCN (R, operator +=, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_OP_ASSIGN_FWD_FCN (R, operator -=, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_OP_ASSIGN_FWD_FCN (R, product_eq, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_OP_ASSIGN_FWD_FCN (R, quotient_eq, T, C_X, X_T, C_Y, Y_T) - -#define MARRAY_OP_ASSIGN_FWD_DEFS1(R, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_OP_ASSIGN_FWD_FCN (R, operator +=, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_OP_ASSIGN_FWD_FCN (R, operator -=, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_OP_ASSIGN_FWD_FCN (R, operator *=, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_OP_ASSIGN_FWD_FCN (R, operator /=, T, C_X, X_T, C_Y, Y_T) - -// A macro that can be used to declare and instantiate unary operators. -#define MARRAY_UNOP(A_T, E_T, F, PFX, API, LTGT) \ - PFX API A_T \ - F LTGT (const A_T&) - -// All the unary operators that we care about. -#define MARRAY_UNOP_DECLS(A_T, E_T, PFX, API, LTGT) \ - MARRAY_UNOP (A_T, E_T, operator +, PFX, API, LTGT); \ - MARRAY_UNOP (A_T, E_T, operator -, PFX, API, LTGT); - -// Generate forward declarations for unary operators. -#define MARRAY_UNOP_FWD_DECLS(A_T, API) \ - MARRAY_UNOP_DECLS (A_T, T, template , API, ) - -// Generate friend declarations for the unary operators. -#define MARRAY_UNOP_FRIENDS(A_T, API) \ - MARRAY_UNOP_DECLS (A_T, T, friend, API, <>) - -// A function that can be used to forward unary operations from derived -// classes back to us. -#define MARRAY_UNOP_FWD_FCN(R, F, T, C_X, X_T) \ - inline R \ - F (const X_T& x) \ - { \ - return R (F (C_X (x))); \ - } - -// All the unary operators that we care about forwarding. -#define MARRAY_UNOP_FWD_DEFS(R, T, C_X, X_T) \ - MARRAY_UNOP_FWD_FCN (R, operator +, T, C_X, X_T) \ - MARRAY_UNOP_FWD_FCN (R, operator -, T, C_X, X_T) - -// A macro that can be used to declare and instantiate binary operators. -#define MARRAY_BINOP_DECL(A_T, E_T, F, PFX, API, LTGT, X_T, Y_T) \ - PFX API A_T \ - F LTGT (const X_T&, const Y_T&) - -// All the binary operators that we care about. We have two -// sets of macros since the MArray OP MArray operations use functions -// (product and quotient) instead of operators (*, /). -#define MARRAY_BINOP_DECLS(A_T, E_T, PFX, API, LTGT, X_T, Y_T) \ - MARRAY_BINOP_DECL (A_T, E_T, operator +, PFX, API, LTGT, X_T, Y_T); \ - MARRAY_BINOP_DECL (A_T, E_T, operator -, PFX, API, LTGT, X_T, Y_T); \ - MARRAY_BINOP_DECL (A_T, E_T, operator *, PFX, API, LTGT, X_T, Y_T); \ - MARRAY_BINOP_DECL (A_T, E_T, operator /, PFX, API, LTGT, X_T, Y_T); - -#define MARRAY_AA_BINOP_DECLS(A_T, E_T, PFX, API, LTGT) \ - MARRAY_BINOP_DECL (A_T, E_T, operator +, PFX, API, LTGT, A_T, A_T); \ - MARRAY_BINOP_DECL (A_T, E_T, operator -, PFX, API, LTGT, A_T, A_T); \ - MARRAY_BINOP_DECL (A_T, E_T, quotient, PFX, API, LTGT, A_T, A_T); \ - MARRAY_BINOP_DECL (A_T, E_T, product, PFX, API, LTGT, A_T, A_T); - -#define MDIAGARRAY2_DAS_BINOP_DECLS(A_T, E_T, PFX, API, LTGT, X_T, Y_T) \ - MARRAY_BINOP_DECL (A_T, E_T, operator *, PFX, API, LTGT, X_T, Y_T); \ - MARRAY_BINOP_DECL (A_T, E_T, operator /, PFX, API, LTGT, X_T, Y_T); - -#define MDIAGARRAY2_SDA_BINOP_DECLS(A_T, E_T, PFX, API, LTGT, X_T, Y_T) \ - MARRAY_BINOP_DECL (A_T, E_T, operator *, PFX, API, LTGT, X_T, Y_T); - -#define MDIAGARRAY2_DADA_BINOP_DECLS(A_T, E_T, PFX, API, LTGT) \ - MARRAY_BINOP_DECL (A_T, E_T, operator +, PFX, API, LTGT, A_T, A_T); \ - MARRAY_BINOP_DECL (A_T, E_T, operator -, PFX, API, LTGT, A_T, A_T); \ - MARRAY_BINOP_DECL (A_T, E_T, product, PFX, API, LTGT, A_T, A_T); - -// Generate forward declarations for binary operators. -#define MARRAY_BINOP_FWD_DECLS(A_T, API) \ - MARRAY_BINOP_DECLS (A_T, T, template , API, , A_T, T) \ - MARRAY_BINOP_DECLS (A_T, T, template , API, , T, A_T) \ - MARRAY_AA_BINOP_DECLS (A_T, T, template , API, ) - -#define MDIAGARRAY2_BINOP_FWD_DECLS(A_T, API) \ - MDIAGARRAY2_DAS_BINOP_DECLS (A_T, T, template , API, , A_T, T) \ - MDIAGARRAY2_SDA_BINOP_DECLS (A_T, T, template , API, , T, A_T) \ - MDIAGARRAY2_DADA_BINOP_DECLS (A_T, T, template , API, ) - -// Generate friend declarations for the binary operators. -#define MARRAY_BINOP_FRIENDS(A_T, API) \ - MARRAY_BINOP_DECLS (A_T, T, friend, API, <>, A_T, T) \ - MARRAY_BINOP_DECLS (A_T, T, friend, API, <>, T, A_T) \ - MARRAY_AA_BINOP_DECLS (A_T, T, friend, API, <>) - -#define MDIAGARRAY2_BINOP_FRIENDS(A_T, API) \ - MDIAGARRAY2_DAS_BINOP_DECLS (A_T, T, friend, API, <>, A_T, T) \ - MDIAGARRAY2_SDA_BINOP_DECLS (A_T, T, friend, API, <>, T, A_T) \ - MDIAGARRAY2_DADA_BINOP_DECLS (A_T, T, friend, API, <>) - -// A function that can be used to forward binary operations from derived -// classes back to us. -#define MARRAY_BINOP_FWD_FCN(R, F, T, C_X, X_T, C_Y, Y_T) \ - inline R \ - F (const X_T& x, const Y_T& y) \ - { \ - return R (F (C_X (x), C_Y (y))); \ - } - -// The binary operators that we care about forwarding. We have two -// sets of macros since the MArray OP MArray operations use functions -// (product and quotient) instead of operators (*, /). -#define MARRAY_BINOP_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_BINOP_FWD_FCN (R, operator +, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_BINOP_FWD_FCN (R, operator -, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_BINOP_FWD_FCN (R, operator *, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_BINOP_FWD_FCN (R, operator /, T, C_X, X_T, C_Y, Y_T) - -#define MARRAY_AA_BINOP_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_BINOP_FWD_FCN (R, operator +, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_BINOP_FWD_FCN (R, operator -, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_BINOP_FWD_FCN (R, product, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_BINOP_FWD_FCN (R, quotient, T, C_X, X_T, C_Y, Y_T) - -#define MDIAGARRAY2_DAS_BINOP_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_BINOP_FWD_FCN (R, operator *, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_BINOP_FWD_FCN (R, operator /, T, C_X, X_T, C_Y, Y_T) - -#define MDIAGARRAY2_SDA_BINOP_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_BINOP_FWD_FCN (R, operator *, T, C_X, X_T, C_Y, Y_T) - -#define MDIAGARRAY2_DADA_BINOP_FWD_DEFS(R, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_BINOP_FWD_FCN (R, operator +, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_BINOP_FWD_FCN (R, operator -, T, C_X, X_T, C_Y, Y_T) \ - MARRAY_BINOP_FWD_FCN (R, product, T, C_X, X_T, C_Y, Y_T) - -// Forward declarations for the MArray operators. -#define MARRAY_OPS_FORWARD_DECLS(A_T, API) \ - template \ - class A_T; \ - \ - MARRAY_OP_ASSIGN_FWD_DECLS1 (A_T, T, API) \ - MARRAY_OP_ASSIGN_FWD_DECLS (A_T, A_T, API) \ - MARRAY_UNOP_FWD_DECLS (A_T, API) \ - MARRAY_BINOP_FWD_DECLS (A_T, API) - -#define MDIAGARRAY2_OPS_FORWARD_DECLS(A_T, API) \ - template \ - class A_T; \ - \ - MARRAY_UNOP_FWD_DECLS (A_T, API) \ - MDIAGARRAY2_BINOP_FWD_DECLS (A_T, API) - -// Friend declarations for the MArray operators. -#define MARRAY_OPS_FRIEND_DECLS(A_T, API) \ - MARRAY_OP_ASSIGN_FRIENDS1 (A_T, T, API) \ - MARRAY_OP_ASSIGN_FRIENDS (A_T, A_T, API) \ - MARRAY_UNOP_FRIENDS (A_T, API) \ - MARRAY_BINOP_FRIENDS (A_T, API) - -#define MDIAGARRAY2_OPS_FRIEND_DECLS(A_T, API) \ - MARRAY_UNOP_FRIENDS (A_T, API) \ - MDIAGARRAY2_BINOP_FRIENDS (A_T, API) - -// Define all the MArray forwarding functions for return type R and -// MArray element type T -#define MARRAY_FORWARD_DEFS(B, R, T) \ - MARRAY_OP_ASSIGN_FWD_DEFS1 \ - (R, T, dynamic_cast&>, R, , T) \ - \ - MARRAY_OP_ASSIGN_FWD_DEFS \ - (R, T, \ - dynamic_cast&>, R, dynamic_cast&>, R) \ - \ - MARRAY_UNOP_FWD_DEFS \ - (R, T, dynamic_cast&>, R) \ - \ - MARRAY_BINOP_FWD_DEFS \ - (R, T, dynamic_cast&>, R, , T) \ - \ - MARRAY_BINOP_FWD_DEFS \ - (R, T, , T, dynamic_cast&>, R) \ - \ - MARRAY_AA_BINOP_FWD_DEFS \ - (R, T, dynamic_cast&>, R, dynamic_cast&>, R) - -#define MDIAGARRAY2_FORWARD_DEFS(B, R, T) \ - MARRAY_UNOP_FWD_DEFS \ - (R, T, dynamic_cast&>, R) \ - \ - MDIAGARRAY2_DAS_BINOP_FWD_DEFS \ - (R, T, dynamic_cast&>, R, , T) \ - \ - MDIAGARRAY2_SDA_BINOP_FWD_DEFS \ - (R, T, , T, dynamic_cast&>, R) \ - \ - MDIAGARRAY2_DADA_BINOP_FWD_DEFS \ - (R, T, dynamic_cast&>, R, dynamic_cast&>, R) - -#endif diff -r 3894a672799e -r 2a99b8b250cd liboctave/array/MArray-defs.h --- a/liboctave/array/MArray-defs.h Mon Dec 21 13:27:53 2015 -0500 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/* - -Copyright (C) 1996-2015 John W. Eaton -Copyright (C) 2009 VZLU Prague, a.s. - -This file is part of Octave. - -Octave is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 3 of the License, or (at your -option) any later version. - -Octave is distributed in the hope that it will be useful, but WITHOUT -ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. - -You should have received a copy of the GNU General Public License -along with Octave; see the file COPYING. If not, see -. - -*/ - -#if ! defined (octave_MArray_defs_h) -#define octave_MArray_defs_h 1 - -#include "mx-inlines.cc" - -// Instantiate the OP= operators. -#define MARRAY_OP_ASSIGN_DEFS(A_T, E_T, RHS_T, API) \ - MARRAY_OP_ASSIGN_DECLS (A_T, E_T, template, API, , RHS_T) - -#define MARRAY_OP_ASSIGN_DEFS1(A_T, E_T, RHS_T, API) \ - MARRAY_OP_ASSIGN_DECLS1 (A_T, E_T, template, API, , RHS_T) - -// Instantiate the unary operators. -#define MARRAY_UNOP_DEFS(A_T, E_T, API) \ - MARRAY_UNOP_DECLS (A_T, E_T, template, API, ) - -// Instantiate the binary operators. -#define MARRAY_BINOP_DEFS(A_T, E_T, API) \ - MARRAY_BINOP_DECLS (A_T, E_T, template, API, , A_T, E_T) \ - MARRAY_BINOP_DECLS (A_T, E_T, template, API, , E_T, A_T) \ - MARRAY_AA_BINOP_DECLS (A_T, E_T, template, API, ) - -#define MDIAGARRAY2_BINOP_DEFS(A_T, E_T, API) \ - MDIAGARRAY2_DAS_BINOP_DECLS (A_T, E_T, template, API, , A_T, E_T) \ - MDIAGARRAY2_SDA_BINOP_DECLS (A_T, E_T, template, API, , E_T, A_T) \ - MDIAGARRAY2_DADA_BINOP_DECLS (A_T, E_T, template, API, ) - -// The following macros are for external use. - -// Instantiate all the MArray friends for MArray element type T. -#define INSTANTIATE_MARRAY_FRIENDS(T, API) \ - MARRAY_OP_ASSIGN_DEFS1 (MArray, T, T, API) \ - MARRAY_OP_ASSIGN_DEFS (MArray, T, MArray, API) \ - MARRAY_UNOP_DEFS (MArray, T, API) \ - MARRAY_BINOP_DEFS (MArray, T, API) - -// Instantiate all the MDiagArray2 friends for MDiagArray2 element type T. -#define INSTANTIATE_MDIAGARRAY2_FRIENDS(T, API) \ - MARRAY_UNOP_DEFS (MDiagArray2, T, API) \ - MDIAGARRAY2_BINOP_DEFS (MDiagArray2, T, API) - -// Now we have all the definitions we need. - -#endif diff -r 3894a672799e -r 2a99b8b250cd liboctave/array/MArray.cc --- a/liboctave/array/MArray.cc Mon Dec 21 13:27:53 2015 -0500 +++ b/liboctave/array/MArray.cc Tue Dec 22 01:34:05 2015 +0100 @@ -29,9 +29,6 @@ #include "Array-util.h" #include "lo-error.h" -#include "MArray-defs.h" -#include "mx-inlines.cc" - template struct _idxadds_helper { diff -r 3894a672799e -r 2a99b8b250cd liboctave/array/MArray.h --- a/liboctave/array/MArray.h Mon Dec 21 13:27:53 2015 -0500 +++ b/liboctave/array/MArray.h Tue Dec 22 01:34:05 2015 +0100 @@ -1,4 +1,3 @@ -// Template array classes with like-type math ops /* Copyright (C) 1993-2015 John W. Eaton @@ -26,15 +25,34 @@ #define octave_MArray_h 1 #include "Array.h" +#include "mx-inlines.cc" -// N-dimensional array with math ops. - -// But first, some preprocessor abuse... +template class MArray; -#include "MArray-decl.h" +template MArray& operator += (MArray&, const T&); +template MArray& operator -= (MArray&, const T&); +template MArray& operator *= (MArray&, const T&); +template MArray& operator /= (MArray&, const T&); +template MArray& operator += (MArray&, const MArray&); +template MArray& operator -= (MArray&, const MArray&); +template MArray& product_eq (MArray&, const MArray&); +template MArray& quotient_eq (MArray&, const MArray&); +template MArray operator + (const MArray&); +template MArray operator - (const MArray&); +template MArray operator + (const MArray&, const T&); +template MArray operator - (const MArray&, const T&); +template MArray operator * (const MArray&, const T&); +template MArray operator / (const MArray&, const T&); +template MArray operator + (const T&, const MArray&); +template MArray operator - (const T&, const MArray&); +template MArray operator * (const T&, const MArray&); +template MArray operator / (const T&, const MArray&); +template MArray operator + (const MArray&, const MArray&); +template MArray operator - (const MArray&, const MArray&); +template MArray quotient (const MArray&, const MArray&); +template MArray product (const MArray&, const MArray&); -MARRAY_OPS_FORWARD_DECLS (MArray, ) - +//! Template for N-dimensional array classes with like-type math operators. template class MArray : public Array @@ -86,11 +104,11 @@ MArray hermitian (T (*fcn) (const T&) = 0) const { return Array::hermitian (fcn); } - // Performs indexed accumulative addition. - + //! Performs indexed accumulative addition. + //@{ void idx_add (const idx_vector& idx, T val); - void idx_add (const idx_vector& idx, const MArray& vals); + //@} void idx_min (const idx_vector& idx, const MArray& vals); @@ -101,4 +119,100 @@ void changesign (void); }; +// Define all the MArray forwarding functions for return type R and +// MArray element type T +#define MARRAY_FORWARD_DEFS(B, R, T) \ + inline R operator += (R& x, const T& y) \ + { return R (operator += (dynamic_cast&> (x), (y))); } \ + inline R operator -= (R& x, const T& y) \ + { return R (operator -= (dynamic_cast&> (x), (y))); } \ + inline R operator *= (R& x, const T& y) \ + { return R (operator *= (dynamic_cast&> (x), (y))); } \ + inline R operator /= (R& x, const T& y) \ + { return R (operator /= (dynamic_cast&> (x), (y))); } \ + inline R operator += (R& x, const R& y) \ + { return R (operator += (dynamic_cast&> (x), \ + dynamic_cast&> (y))); } \ + inline R operator -= (R& x, const R& y) \ + { return R (operator -= (dynamic_cast&> (x), \ + dynamic_cast&> (y))); } \ + inline R product_eq (R& x, const R& y) \ + { return R (product_eq (dynamic_cast&> (x), \ + dynamic_cast&> (y))); } \ + inline R quotient_eq (R& x, const R& y) \ + { return R (quotient_eq (dynamic_cast&> (x), \ + dynamic_cast&> (y))); } \ + inline R operator + (const R& x) \ + { return R (operator + (dynamic_cast&> (x))); } \ + inline R operator - (const R& x) \ + { return R (operator - (dynamic_cast&> (x))); } \ + inline R operator + (const R& x, const T& y) \ + { return R (operator + (dynamic_cast&> (x), (y))); } \ + inline R operator - (const R& x, const T& y) \ + { return R (operator - (dynamic_cast&> (x), (y))); } \ + inline R operator * (const R& x, const T& y) \ + { return R (operator * (dynamic_cast&> (x), (y))); } \ + inline R operator / (const R& x, const T& y) \ + { return R (operator / (dynamic_cast&> (x), (y))); } \ + inline R operator + (const T& x, const R& y) \ + { return R (operator + ( (x), dynamic_cast&> (y))); } \ + inline R operator - (const T& x, const R& y) \ + { return R (operator - ( (x), dynamic_cast&> (y))); } \ + inline R operator * (const T& x, const R& y) \ + { return R (operator * ( (x), dynamic_cast&> (y))); } \ + inline R operator / (const T& x, const R& y) \ + { return R (operator / ( (x), dynamic_cast&> (y))); } \ + inline R operator + (const R& x, const R& y) \ + { return R (operator + (dynamic_cast&> (x), \ + dynamic_cast&> (y))); } \ + inline R operator - (const R& x, const R& y) \ + { return R (operator - (dynamic_cast&> (x), \ + dynamic_cast&> (y))); } \ + inline R product (const R& x, const R& y) \ + { return R (product (dynamic_cast&> (x), \ + dynamic_cast&> (y))); } \ + inline R quotient (const R& x, const R& y) \ + { return R (quotient (dynamic_cast&> (x), \ + dynamic_cast&> (y))); } + +// Instantiate all the MArray friends for MArray element type T. +#define INSTANTIATE_MARRAY_FRIENDS(T, API) \ + template API MArray& operator += (MArray&, const T&); \ + template API MArray& operator -= (MArray&, const T&); \ + template API MArray& operator *= (MArray&, const T&); \ + template API MArray& operator /= (MArray&, const T&); \ + template API MArray& operator += (MArray&, const MArray&); \ + template API MArray& operator -= (MArray&, const MArray&); \ + template API MArray& product_eq (MArray&, const MArray&); \ + template API MArray& quotient_eq (MArray&, const MArray&); \ + template API MArray operator + (const MArray&); \ + template API MArray operator - (const MArray&); \ + template API MArray operator + (const MArray&, const T&); \ + template API MArray operator - (const MArray&, const T&); \ + template API MArray operator * (const MArray&, const T&); \ + template API MArray operator / (const MArray&, const T&); \ + template API MArray operator + (const T&, const MArray&); \ + template API MArray operator - (const T&, const MArray&); \ + template API MArray operator * (const T&, const MArray&); \ + template API MArray operator / (const T&, const MArray&); \ + template API MArray operator + (const MArray&, const MArray&); \ + template API MArray operator - (const MArray&, const MArray&); \ + template API MArray quotient (const MArray&, const MArray&); \ + template API MArray product (const MArray&, const MArray&); + +// Instantiate all the MDiagArray2 friends for MDiagArray2 element type T. +#define INSTANTIATE_MDIAGARRAY2_FRIENDS(T, API) \ + template API MDiagArray2 operator + (const MDiagArray2&); \ + template API MDiagArray2 operator - (const MDiagArray2&); \ + template API MDiagArray2 operator * (const MDiagArray2&, const T&); \ + template API MDiagArray2 operator / (const MDiagArray2&, const T&); \ + template API MDiagArray2 operator * (const T&, const MDiagArray2&); \ + template API MDiagArray2 operator + (const MDiagArray2&, \ + const MDiagArray2&); \ + template API MDiagArray2 operator - (const MDiagArray2&, \ + const MDiagArray2&); \ + template API MDiagArray2 product (const MDiagArray2&, \ + const MDiagArray2&); + #endif + diff -r 3894a672799e -r 2a99b8b250cd liboctave/array/MDiagArray2.cc --- a/liboctave/array/MDiagArray2.cc Mon Dec 21 13:27:53 2015 -0500 +++ b/liboctave/array/MDiagArray2.cc Tue Dec 22 01:34:05 2015 +0100 @@ -29,8 +29,6 @@ #include "Array-util.h" #include "lo-error.h" -#include "MArray-defs.h" - template bool MDiagArray2::is_multiple_of_identity (T val) const diff -r 3894a672799e -r 2a99b8b250cd liboctave/array/MDiagArray2.h --- a/liboctave/array/MDiagArray2.h Mon Dec 21 13:27:53 2015 -0500 +++ b/liboctave/array/MDiagArray2.h Tue Dec 22 01:34:05 2015 +0100 @@ -28,14 +28,24 @@ #include "DiagArray2.h" #include "MArray.h" -// Two dimensional diagonal array with math ops. - -// But first, some preprocessor abuse... +template class MDiagArray2; -#include "MArray-decl.h" +template MDiagArray2 operator + (const MDiagArray2&); +template MDiagArray2 operator - (const MDiagArray2&); +template MDiagArray2 operator * (const MDiagArray2&, + const T&); +template MDiagArray2 operator / (const MDiagArray2&, + const T&); +template MDiagArray2 operator * (const T&, + const MDiagArray2&); +template MDiagArray2 operator + (const MDiagArray2&, + const MDiagArray2&); +template MDiagArray2 operator - (const MDiagArray2&, + const MDiagArray2&); +template MDiagArray2 product (const MDiagArray2&, + const MDiagArray2&); -MDIAGARRAY2_OPS_FORWARD_DECLS (MDiagArray2, ) - +//! Template for two dimensional diagonal array with math operators. template class MDiagArray2 : public DiagArray2 @@ -103,8 +113,39 @@ // Currently, the OPS functions don't need to be friends, but that // may change. - MDIAGARRAY2_OPS_FRIEND_DECLS (MDiagArray2, ) + friend MDiagArray2 operator + <> (const MDiagArray2&); + friend MDiagArray2 operator - <> (const MDiagArray2&); + friend MDiagArray2 operator * <> (const MDiagArray2&, const T&); + friend MDiagArray2 operator / <> (const MDiagArray2&, const T&); + friend MDiagArray2 operator * <> (const T&, const MDiagArray2&); + friend MDiagArray2 operator + <> (const MDiagArray2&, + const MDiagArray2&); + friend MDiagArray2 operator - <> (const MDiagArray2&, + const MDiagArray2&); + friend MDiagArray2 product <> (const MDiagArray2&, + const MDiagArray2&); }; +#define MDIAGARRAY2_FORWARD_DEFS(B, R, T) \ + inline R operator + (const R& x) \ + { return R (operator + (dynamic_cast&> (x))); } \ + inline R operator - (const R& x) \ + { return R (operator - (dynamic_cast&> (x))); } \ + inline R operator * (const R& x, const T& y) \ + { return R (operator * (dynamic_cast&> (x), (y))); } \ + inline R operator / (const R& x, const T& y) \ + { return R (operator / (dynamic_cast&> (x), (y))); } \ + inline R operator * (const T& x, const R& y) \ + { return R (operator * ( (x), dynamic_cast&> (y))); } \ + inline R operator + (const R& x, const R& y) \ + { return R (operator + (dynamic_cast&> (x), \ + dynamic_cast&> (y))); } \ + inline R operator - (const R& x, const R& y) \ + { return R (operator - (dynamic_cast&> (x), \ + dynamic_cast&> (y))); } \ + inline R product (const R& x, const R& y) \ + { return R (product (dynamic_cast&> (x), \ + dynamic_cast&> (y))); } + #endif diff -r 3894a672799e -r 2a99b8b250cd liboctave/array/boolNDArray.cc --- a/liboctave/array/boolNDArray.cc Mon Dec 21 13:27:53 2015 -0500 +++ b/liboctave/array/boolNDArray.cc Tue Dec 22 01:34:05 2015 +0100 @@ -32,7 +32,6 @@ #include "mx-base.h" #include "lo-ieee.h" #include "mx-op-defs.h" -#include "MArray-defs.h" #include "bsxfun-defs.cc" diff -r 3894a672799e -r 2a99b8b250cd liboctave/array/fCNDArray.cc --- a/liboctave/array/fCNDArray.cc Mon Dec 21 13:27:53 2015 -0500 +++ b/liboctave/array/fCNDArray.cc Tue Dec 22 01:34:05 2015 +0100 @@ -36,7 +36,6 @@ #include "functor.h" #include "lo-ieee.h" #include "lo-mappers.h" -#include "MArray-defs.h" #include "mx-base.h" #include "mx-op-defs.h" #include "mx-fcnda-fs.h" diff -r 3894a672799e -r 2a99b8b250cd liboctave/array/module.mk --- a/liboctave/array/module.mk Mon Dec 21 13:27:53 2015 -0500 +++ b/liboctave/array/module.mk Tue Dec 22 01:34:05 2015 +0100 @@ -36,8 +36,6 @@ liboctave/array/int64NDArray.h \ liboctave/array/int8NDArray.h \ liboctave/array/intNDArray.h \ - liboctave/array/MArray-decl.h \ - liboctave/array/MArray-defs.h \ liboctave/array/MArray.h \ liboctave/array/Matrix.h \ liboctave/array/MatrixType.h \