$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Pavel Chikulaev (pavel.chikulaev_at_[hidden])
Date: 2005-03-06 09:59:01
I'm currently working on library "Lazy".
Library description:
    Library eases creation of classes which needs lazy evalution and n-arity
operators
    and I guess will be as efficient as Gnu MP class but with pretty syntax.
(Not yet tested
    but I do believe it is so).
Library features are:
    * n-arity operators support;
    * operator aliasing, such as a + -b will be computed as a - b;
    * custom operators;
    * no unnecessary temporaries during evalution and assigning;
    * easy usage.
Library's sample usage:
//Matrix.h
#include "lazy.hpp"
class transpose_tag {}; //Tag class
class Matrix
{
    LAZY_CLASS(Matrix)
    static lazy::type<Matrix> Matrix_; //Similar to Andrei Alexandrescu's
Type2Type template
public:
    Matrix();
    Matrix(const Matrix &);
    void swap(void Matrix &);
    //Libray won't work without swap function.
    //If name of your swap function isn't swap then use
LAZY_CLASS_EX(Matrix, YourSwapFunctionName)
    Matrix & operator = (const Matrix &);
    //lazy constuctors which enables lazy operators
    Matrix(LAZY_OP(Matix_ + Matrix_));  //Matrix operator +(Matrix, Matrix)
    Matrix(LAZY_OP(Matrix_ * Matrix_)); //...
    Matrix(LAZY_OP(-Matrix_);
    Matrix(LAZY_OP(Matrix_ + Matrix_ * Matrix_)); //ternary operator
    //Now enable operators
    LAZY_ENABLE_OP(Matrix_ = Matrix_ + Matrix_);
    LAZY_ENABLE_OP(Matrix_ = Matrix_ * Matrix_);
    LAZY_ENABLE_OP(Matrix_ = -Matrix_);
    LAZY_ENABLE_OP(Matrix_ = Matrix_ + Matrix_ * Matrix_);
    //Actually we can make declaration of lazy operators and enabling them
using only one macro e.g.
    LAZY_CONSTUCTOR(Matrix_ = Matrix_ * Matrix_ * Matrix_);
    //Aliasing
    LAZY_ALIAS(Matrix + -Matrix_ = Matrix_ - Matrix_);
    //Custom operation
    Matrix(LAZY_CUSTOM_OP(transpose_tag, (Matrix_)));
    LAZY_ENABLE_CUSTOM_OP(transpose, Matrix_ =
lazy::custom_op<transpose_tag>(Matrix_));
    //same as   Matrix transpose (const Matrix &) but there won't be any
temporary objects
};
//Matrix.cpp
Matrix::Matrix(LAZY_OP(Matix_ + Matrix_) op)
{
    //Construct matrix object
    //lhs matrix = op._1
    //rhs matrix = op._2
}
Matrix::Matrix(LAZY_CUSTOM_OP(transpose_tag, (Matrix_) op)
{
    //Construct matrix object tranposed to op._1
}
//etc
//Now the use of Matrix class
Matrix a, b, c, d;
    //...
a = b + c;
    //No tempories at all
    //Using normal practice it will take two temporary objects (no NRVO or
RVO )
a = b + -c;
    //Will be evaluates as a = b - c; No temporaries again
    //Using normal practice it will take three temporary objects (no NRVO or
RVO)
a = b + c * d;
    //Will use ternary operator. No temporaries again
a = transpose(b);
    //Custom lazy operation. No tempories again
Maybe the library is very similar to uBLAS's matrix_expression and
vector_expression.
But with my approach there is no need to code matrix_expression and
vector_expression
at all and it is easy to create new classes which needs lazy evaluation and
n-arity operators.
So what do you think?
Is there any similar approaches available?
Is there any need of such library?