NUMCXX  0.13.20181108
Numerical library for small projects and teaching purposes
Namespaces | Macros | Functions
expression.ixx File Reference

Description

Implementation of expression templates.

Inspired by ideas from:

Iglberger, K., Hager, G., Treibig, J., & RĂ¼de, U. (2012). Expression templates revisited: a performance analysis of current methodologies. SIAM Journal on Scientific Computing, 34(2), C42-C69. https://arxiv.org/pdf/1104.1729

Pitfalls encountered.

Pitfall 1

All classes to be used with the numcxx expression templates should be derived from numcxx specific base classes. The rationale is the control of expression template specialization via std::is_base_of, and the prevention of accidental invocation of the templates in unexpected situations, e.g. with STL vectors. It seems that C++11 provides much better tool to handle this situation via its type_traits

Pitfall 2

Epression templates using scalars shall store the scalar as a value and not as a reference. E.g. g++ -O optimizes these references away. It seems that this behaviour has to be expected by default, see e.g. Vandevoorde/Josuttis, C++ Templates: The Complete Guide, 2nd Ed. 18.2.1 or http://www.cplusplus.com/forum/general/72582/#msg387184 (the broken link therein goes to Vandevoorde/Josuttis)

Definition in file expression.ixx.

+ Include dependency graph for expression.ixx:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Namespaces

 numcxx
 Numcxx template library.
 

Macros

#define NUMCXX_EXPRESSION_HXX
 

Functions

template<typename A , typename B , typename = typename std::enable_if<std::is_base_of<ExpressionBase,A>::value, A>::type, typename = typename std::enable_if<std::is_base_of<ExpressionBase,B>::value, B>::type>
const AdditionExpression< A, Bnumcxx::operator+ (const A &a, const B &b)
 
template<typename A , typename B , typename = typename std::enable_if<std::is_base_of<ExpressionBase,A>::value, A>::type, typename = typename std::enable_if<std::is_base_of<ExpressionBase,B>::value, B>::type>
const SubtractionExpression< A, Bnumcxx::operator- (const A &a, const B &b)
 
template<typename A , typename B , typename = typename std::enable_if<std::is_fundamental<A>::value, A>::type, typename = typename std::enable_if<std::is_base_of<ExpressionBase,B>::value, B>::type>
const LeftScalarMultiplicationExpression< A, Bnumcxx::operator* (const A &a, const B &b)
 
template<typename A , typename B , typename = typename std::enable_if<std::is_base_of<ExpressionBase,A>::value, A>::type, typename = typename std::enable_if<std::is_fundamental<B>::value, B>::type>
const RightScalarMultiplicationExpression< A, Bnumcxx::operator* (const A &a, const B &b)
 
template<typename A , typename B , typename = typename std::enable_if<std::is_base_of<ExpressionBase,A>::value, A>::type, typename = typename std::enable_if<std::is_fundamental<B>::value, B>::type>
const RightScalarAdditionExpression< A, Bnumcxx::operator+ (const A &a, const B &b)
 
template<typename A , typename B , typename = typename std::enable_if<std::is_fundamental<A>::value, A>::type, typename = typename std::enable_if<std::is_base_of<ExpressionBase,B>::value, B>::type>
const LeftScalarAdditionExpression< A, Bnumcxx::operator+ (const A &a, const B &b)
 
template<typename A , typename B , typename = typename std::enable_if<std::is_base_of<ExpressionBase,A>::value, A>::type, typename = typename std::enable_if<std::is_fundamental<B>::value, B>::type>
const RightScalarSubtractionExpression< A, Bnumcxx::operator- (const A &a, const B &b)
 
template<typename A , typename B , typename = typename std::enable_if<std::is_fundamental<A>::value, A>::type, typename = typename std::enable_if<std::is_base_of<ExpressionBase,B>::value, B>::type>
const LeftScalarSubtractionExpression< A, Bnumcxx::operator- (const A &a, const B &b)
 
template<typename A , typename B , typename = typename std::enable_if<std::is_base_of<ExpressionBase,A>::value, A>::type, typename = typename std::enable_if<std::is_fundamental<B>::value, B>::type>
const RightScalarDivisionExpression< A, Bnumcxx::operator/ (const A &a, const B &b)
 
template<typename A , typename B , typename = typename std::enable_if<std::is_base_of<MatrixExpressionBase,A>::value, A>::type, typename = typename std::enable_if<std::is_base_of<ExpressionBase,B>::value, B>::type>
const LeftMatrixMultiplicationExpression< A, Bnumcxx::operator* (const A &a, const B &b)
 
template<typename A , typename B , typename = typename std::enable_if<std::is_base_of<SparseMatrixExpressionBase,A>::value, A>::type, typename = typename std::enable_if<std::is_base_of<ExpressionBase,B>::value, B>::type>
const LeftSparseMatrixMultiplicationExpression< A, Bnumcxx::operator* (const A &a, const B &b)
 

Macro Definition Documentation

#define NUMCXX_EXPRESSION_HXX

Definition at line 38 of file expression.ixx.