2
0
mirror of https://github.com/boostorg/ublas.git synced 2026-02-20 03:02:13 +00:00

basis for generalised ublas_expression

[SVN r25397]
This commit is contained in:
Michael Stevens
2004-09-24 18:28:37 +00:00
parent 2c8267e614
commit 7f9207cbf9
3 changed files with 32 additions and 12 deletions

View File

@@ -26,10 +26,10 @@ namespace boost { namespace numeric { namespace ublas {
{
class nonassignable {
protected:
nonassignable(){}
~nonassignable(){}
nonassignable () {}
~nonassignable () {}
private: // emphasize the following members are private
const nonassignable& operator=( const nonassignable& );
const nonassignable& operator= (const nonassignable &);
}; // nonassignable
}
typedef nonassignable_::nonassignable nonassignable;

View File

@@ -27,8 +27,7 @@ namespace boost { namespace numeric { namespace ublas {
// Base class Matrix Expressions - see the Barton Nackman trick
template<class E>
class matrix_expression:
private nonassignable {
//FIXME public expression_base<typename E::value_type> {
public ublas_expression<E> {
public:
BOOST_STATIC_CONSTANT (unsigned, complexity = 0);
typedef E expression_type;

View File

@@ -27,20 +27,42 @@
namespace boost { namespace numeric { namespace ublas {
// Base class for linear algebra expression's numeric properties
template<class T>
class expression_base:
private nonassignable {
// Base class for uBLAS staticaly derived expressions - see the Barton Nackman trick
// Provides numeric properties for linear algebra
template<class E>
class ublas_expression {
public:
typedef E expression_type;
/* FIXME expression properties are undefined due to a template instantiation order problem
typedef typename E::type_category type_category;
typedef typename E::value_type value_type;
*/
// Directly implement nonassignable - simplifes debugging call trace!
protected:
ublas_expression () {}
~ublas_expression () {}
private:
const ublas_expression& operator= (const ublas_expression &);
};
// Base class for Scalar Expressions - see the Barton Nackman trick
template<class E>
class scalar_expression:
public expression_base<E> {
public ublas_expression<E> {
public:
typedef E expression_type;
typedef scalar_tag type_category;
BOOST_UBLAS_INLINE
const expression_type &operator () () const {
return *static_cast<const expression_type *> (this);
}
BOOST_UBLAS_INLINE
expression_type &operator () () {
return *static_cast<expression_type *> (this);
}
};
template<class T>
@@ -110,8 +132,7 @@ namespace boost { namespace numeric { namespace ublas {
// Base class for Vector Expressions - see the Barton Nackman trick
template<class E>
class vector_expression:
private nonassignable {
//FIXME public expression_base<typename E::value_type> {
public ublas_expression<E> {
public:
BOOST_STATIC_CONSTANT (unsigned, complexity = 0);
typedef E expression_type;