// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
//
// Eigen is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either 
// version 3 of the License, or (at your option) any later version.
//
// Alternatively, you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of 
// the License, or (at your option) any later version.
//
// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public 
// License and a copy of the GNU General Public License along with
// Eigen. If not, see <http://www.gnu.org/licenses/>.

#ifndef EIGEN_EVAL_H
#define EIGEN_EVAL_H

/** \class Eval
  *
  * \brief Evaluation of an expression
  *
  * The template parameter Expression is the type of the expression that we are evaluating.
  *
  * This class is the return
  * type of MatrixBase::eval() and most of the time this is the only way it
  * is used.
  *
  * However, if you want to write a function returning an evaluation of an expression, you
  * will need to use this class.
  *
  * Here is an example illustrating this:
  * \include class_Eval.cpp
  * Output: \verbinclude class_Eval.out
  *
  * \sa MatrixBase::eval()
  */
template<typename ExpressionType>
struct ei_traits<Eval<ExpressionType> >
{
  typedef typename ExpressionType::Scalar Scalar;
  enum {
    RowsAtCompileTime = ExpressionType::RowsAtCompileTime,
    ColsAtCompileTime = ExpressionType::ColsAtCompileTime,
    MaxRowsAtCompileTime = ExpressionType::MaxRowsAtCompileTime,
    MaxColsAtCompileTime = ExpressionType::MaxColsAtCompileTime,
    Flags = ExpressionType::Flags & ~LazyBit
  };
};

template<typename ExpressionType> class Eval : ei_no_assignment_operator,
  public Matrix< typename ExpressionType::Scalar,
                 ExpressionType::RowsAtCompileTime,
                 ExpressionType::ColsAtCompileTime,
                 ExpressionType::Flags,
                 ExpressionType::MaxRowsAtCompileTime,
                 ExpressionType::MaxColsAtCompileTime>
{
  public:

    /** The actual matrix type to evaluate to. This type can be used independently
      * of the rest of this class to get the actual matrix type to evaluate and store
      * the value of an expression.
      *
      * Here is an example illustrating this:
      * \include Eval_MatrixType.cpp
      * Output: \verbinclude Eval_MatrixType.out
      */
    typedef Matrix<typename ExpressionType::Scalar,
                   ExpressionType::RowsAtCompileTime,
                   ExpressionType::ColsAtCompileTime,
                   ExpressionType::Flags,
                   ExpressionType::MaxRowsAtCompileTime,
                   ExpressionType::MaxColsAtCompileTime> MatrixType;

    _EIGEN_GENERIC_PUBLIC_INTERFACE(Eval, MatrixType)

    explicit Eval(const ExpressionType& expr) : MatrixType(expr) {}
};

/** Evaluates *this, which can be any expression, and returns the obtained matrix.
  *
  * A common use case for this is the following. In an expression-templates library
  * like Eigen, the coefficients of an expression are only computed as they are
  * accessed, they are not computed when the expression itself is constructed. This is
  * usually a good thing, as this "lazy evaluation" improves performance, but can also
  * in certain cases lead to wrong results and/or to redundant computations. In such
  * cases, one can restore the classical immediate-evaluation behavior by calling eval().
  *
  * Example: \include MatrixBase_eval.cpp
  * Output: \verbinclude MatrixBase_eval.out
  *
  * \sa class Eval */
template<typename Derived>
const typename ei_eval_unless_lazy<Derived>::type MatrixBase<Derived>::eval() const
{
  return typename ei_eval_unless_lazy<Derived>::type(derived());
}

#endif // EIGEN_EVAL_H
