Blitz logo

Blitz Devel :

From: yannick\.le-goc (yannick.le-goc_at_[hidden])
Date: 2005-04-05 07:46:18


hi,

I just began to look at the Blitz++ library which is very well
programmed! I think the API can be simplified, for example for
the TinyMatrix products, we can use SFINAE technique to
provide a more intuitive syntax:

#include <blitz/tinymat.h>
#include <blitz/vector.h>
#include <iostream>

using namespace std;

// ProductResult
///////////////////////////////////////////////////////////////

template<class A, class B> struct ProductResult;

// TinyMatrix - TinyVector ProductResult
///////////////////////////////////////

template<class MT, class VT, int Mm, int Mn>
struct ProductResult<blitz::TinyMatrix<MT, Mm, Mn>,
blitz::TinyVector<VT, Mn> >
{
  typedef blitz::TinyVector<MT, Mm> type;
};

// TinyMatrix - TinyMatrix ProductResult
///////////////////////////////////////

template<class MAT, class MBT, int MAm, int MAn, int MBn>
struct ProductResult<blitz::TinyMatrix<MAT, MAm, MAn>,
blitz::TinyMatrix<MBT, MAn, MBn> >
{
  typedef
blitz::_bz_tinyMatExpr<blitz::_bz_tinyMatrixMatrixProduct<MAT,
MBT, MAm, MAn, MBn, MAn, 1, MBn, 1> > type;
};

// operator* for blitz types using SFINAE technique
////////////////////////////

template<class A, class B>
inline typename ProductResult<A, B>::type operator* (const A
&a, const B &b)
{
  return product(a, b);
}

using namespace blitz;

int main()
{
  // TinyMatrix

  TinyMatrix<int, 3, 3> C;

  C = 1, 0, 2,
      2, 4, 1,
      0, 2, 1;
  
  TinyVector<int, 3> x(1, -3, 2);
  TinyVector<int, 3> y(-2, 1, 3);

  TinyMatrix<int, 3, 3> M;
  
  M = product(C, C);
  // is now equivalent to
  M = C*C;

  TinyVector<double,3> z;
  z = product(C, x);
  // is now equivalent to
  z = C*x;
  
  return 1;
}

The two lines are equivalent since the compiler uses inline
keyword. Furthermore thanks to template partial
specialization, type coherence is checked!

Accédez au courrier électronique de La Poste : www.laposte.net ;
3615 LAPOSTENET (0,34€/mn) ; tél : 08 92 68 13 50 (0,34€/mn)