diff --git a/include/boost/numeric/ublas/fwd.hpp b/include/boost/numeric/ublas/fwd.hpp index 5914c1f3..2991bb54 100644 --- a/include/boost/numeric/ublas/fwd.hpp +++ b/include/boost/numeric/ublas/fwd.hpp @@ -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; diff --git a/include/boost/numeric/ublas/matrix_expression.hpp b/include/boost/numeric/ublas/matrix_expression.hpp index b8f8df8e..f023de5e 100644 --- a/include/boost/numeric/ublas/matrix_expression.hpp +++ b/include/boost/numeric/ublas/matrix_expression.hpp @@ -27,8 +27,7 @@ namespace boost { namespace numeric { namespace ublas { // Base class Matrix Expressions - see the Barton Nackman trick template class matrix_expression: - private nonassignable { - //FIXME public expression_base { + public ublas_expression { public: BOOST_STATIC_CONSTANT (unsigned, complexity = 0); typedef E expression_type; diff --git a/include/boost/numeric/ublas/vector_expression.hpp b/include/boost/numeric/ublas/vector_expression.hpp index afe94ca7..63b4de88 100644 --- a/include/boost/numeric/ublas/vector_expression.hpp +++ b/include/boost/numeric/ublas/vector_expression.hpp @@ -27,20 +27,42 @@ namespace boost { namespace numeric { namespace ublas { - // Base class for linear algebra expression's numeric properties - template - 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 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 scalar_expression: - public expression_base { + public ublas_expression { public: + typedef E expression_type; typedef scalar_tag type_category; + + BOOST_UBLAS_INLINE + const expression_type &operator () () const { + return *static_cast (this); + } + BOOST_UBLAS_INLINE + expression_type &operator () () { + return *static_cast (this); + } }; template @@ -110,8 +132,7 @@ namespace boost { namespace numeric { namespace ublas { // Base class for Vector Expressions - see the Barton Nackman trick template class vector_expression: - private nonassignable { - //FIXME public expression_base { + public ublas_expression { public: BOOST_STATIC_CONSTANT (unsigned, complexity = 0); typedef E expression_type;