NUMCXX
0.13.20181108
Numerical library for small projects and teaching purposes
|
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
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
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.
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, B > | numcxx::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, B > | numcxx::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, B > | numcxx::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, B > | numcxx::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, B > | numcxx::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, B > | numcxx::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, B > | numcxx::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, B > | numcxx::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, B > | numcxx::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, B > | numcxx::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, B > | numcxx::operator* (const A &a, const B &b) |
#define NUMCXX_EXPRESSION_HXX |
Definition at line 38 of file expression.ixx.