lkptr - simple reference LinKed PoinTeR:
RefMatrix.h
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Friends Defines