// Template array classes with like-type math ops /* Copyright (C) 1996-2015 John W. Eaton Copyright (C) 2010 VZLU Prague 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_MDiagArray2_h) #define octave_MDiagArray2_h 1 #include "DiagArray2.h" #include "MArray.h" // Two dimensional diagonal array with math ops. // But first, some preprocessor abuse... #include "MArray-decl.h" MDIAGARRAY2_OPS_FORWARD_DECLS (MDiagArray2, ) template class MDiagArray2 : public DiagArray2 { public: MDiagArray2 (void) : DiagArray2 () { } MDiagArray2 (octave_idx_type r, octave_idx_type c) : DiagArray2 (r, c) { } MDiagArray2 (octave_idx_type r, octave_idx_type c, const T& val) : DiagArray2 (r, c, val) { } MDiagArray2 (const MDiagArray2& a) : DiagArray2 (a) { } MDiagArray2 (const DiagArray2& a) : DiagArray2 (a) { } template MDiagArray2 (const DiagArray2& a) : DiagArray2 (a) { } explicit MDiagArray2 (const Array& a) : DiagArray2 (a) { } MDiagArray2 (const Array& a, octave_idx_type r, octave_idx_type c) : DiagArray2 (a, r, c) { } ~MDiagArray2 (void) { } MDiagArray2& operator = (const MDiagArray2& a) { DiagArray2::operator = (a); return *this; } MArray array_value () const { return DiagArray2::array_value (); } octave_idx_type nnz (void) const { octave_idx_type retval = 0; const T *d = this->data (); octave_idx_type nel = this->length (); for (octave_idx_type i = 0; i < nel; i++) { if (d[i] != T ()) retval++; } return retval; } MArray diag (octave_idx_type k = 0) const { return DiagArray2::extract_diag (k); } MDiagArray2 transpose (void) const { return DiagArray2::transpose (); } MDiagArray2 hermitian (T (*fcn) (const T&) = 0) const { return DiagArray2::hermitian (fcn); } bool is_multiple_of_identity (T val) const; // Currently, the OPS functions don't need to be friends, but that // may change. MDIAGARRAY2_OPS_FRIEND_DECLS (MDiagArray2, ) }; #endif