1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Benoit Jacob <jacob.benoit.1@gmail.com>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_LAZY_H
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_LAZY_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \deprecated it is only used by lazy() which is deprecated
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \returns an expression of *this with added flags
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_marked.cpp
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_marked.out
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa class Flagged, extract(), part()
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<unsigned int Added>
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const Flagged<Derived, Added, 0>
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathMatrixBase<Derived>::marked() const
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return derived();
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \deprecated use MatrixBase::noalias()
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \returns an expression of *this with the EvalBeforeAssigningBit flag removed.
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Example: \include MatrixBase_lazy.cpp
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Output: \verbinclude MatrixBase_lazy.out
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  *
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * \sa class Flagged, marked()
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  */
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline const Flagged<Derived, 0, EvalBeforeAssigningBit>
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathMatrixBase<Derived>::lazy() const
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return derived();
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Overloaded to perform an efficient C += (A*B).lazy() */
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ProductDerived, typename Lhs, typename Rhs>
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDerived& MatrixBase<Derived>::operator+=(const Flagged<ProductBase<ProductDerived, Lhs,Rhs>, 0,
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                                       EvalBeforeAssigningBit>& other)
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  other._expression().derived().addTo(derived()); return derived();
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  * Overloaded to perform an efficient C -= (A*B).lazy() */
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived>
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ProductDerived, typename Lhs, typename Rhs>
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathDerived& MatrixBase<Derived>::operator-=(const Flagged<ProductBase<ProductDerived, Lhs,Rhs>, 0,
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                                       EvalBeforeAssigningBit>& other)
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  other._expression().derived().subTo(derived()); return derived();
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_LAZY_H
72