lkptr
|
00001 // RefMatrix.h copyright (C) 2007 adolfo@di-mare.com 00002 00003 /** \file RefMatrix.h 00004 \brief Muestra cómo implementar una matriz usando referencias \c lkptr<X>. 00005 00006 \author Adolfo Di Mare <adolfo@di-mare.com> 00007 \date 2007 00008 00009 - Why English names??? ==> http://www.di-mare.com/adolfo/binder/c01.htm#sc04 00010 */ 00011 00012 #ifndef RefMatrix_h 00013 #define RefMatrix_h 00014 00015 #include <cassert> // assert() 00016 00017 #include "lkptr.h" // javify 00018 #include "Matrix.h" 00019 00020 /// Definido por la biblioteca C++ estándar 00021 namespace std {} // Está acá para que Doxygen lo documente 00022 00023 /// Matriz chirrisquitica de adolfo@di-mare.com 00024 namespace Mx { 00025 00026 /// Empaque alrededor de \c Matrix que usa \c lkptr<X> para mejorar la implementación de los operadores aritméticos. 00027 template <class E> 00028 class RefMatrix : public Mx::Matrix<E> { 00029 public: 00030 RefMatrix(unsigned m = 1, unsigned n = 1) : Matrix<E>(m,n) { } ///< Constructor base 00031 RefMatrix(const RefMatrix& o) : Matrix<E>(o) { } ///< Constructor de copia 00032 RefMatrix(const E& V) : Matrix<E>(V) { } ///< Construye una matriz unitaria 00033 ~RefMatrix() {}///< Destructor 00034 public: 00035 /// Retorna un puntero a una copia de la instancia. 00036 RefMatrix<E>* clone() const { return new RefMatrix<E>(*this); } 00037 friend lkptr<RefMatrix> operator + (const lkptr<RefMatrix>& A, const lkptr<RefMatrix>& B) 00038 { lkptr<RefMatrix> Res ( A->clone() ); Res->add(*B); return Res; } ///< Retorna \c A+B 00039 friend lkptr<RefMatrix> operator - (const lkptr<RefMatrix>& A, const lkptr<RefMatrix>& B) 00040 { lkptr<RefMatrix> Res ( A->clone() ); Res->substract(*B); return Res; } ///< Retorna \c A-B 00041 friend lkptr<RefMatrix> operator * (const lkptr<RefMatrix>& A, const lkptr<RefMatrix>& B) 00042 { RefMatrix *Res = new RefMatrix( A->rows(), B->cols() ); 00043 Res->multiply(*A, *B); return lkptr<RefMatrix>( Res ); } ///< Retorna \c A*B 00044 #if 0 00045 { // Hay que usar: [ V->at(i,j) ] o [ (*V)(i,i) ] PERO... 00046 lkptr< RefMatrix<unsigned> > rV ( new RefMatrix<unsigned>(M,N) ); 00047 RefMatrix<unsigned>& VV = *rV; // VV(i,j) == (*V)(i,j) 00048 // ... 00049 for (i=0; i < rV->rows(); ++i) { 00050 for (j=0; j < rV->cols(); ++j,++k) { 00051 assert( rV->at(i,j) == VV(i,j) ); 00052 assert( &rV->at(i,j) == &VV(i,j) ); 00053 } 00054 } 00055 } 00056 #else 00057 // friend E& operator()( lkptr<RefMatrix> L, unsigned i, unsigned j ); 00058 // { return (*L)(i,j); } // Error: operator()() must be a nonstatic member function 00059 #endif 00060 }; // RefMatrix 00061 00062 } // namespace Mx 00063 00064 #endif // RefMatrix_h 00065 // EOF: RefMatrix.h