1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2007-2010 Benoit Jacob <jacob.benoit.1@gmail.com>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_FORWARDDECLARATIONS_H
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_FORWARDDECLARATIONS_H
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct traits;
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// here we say once and for all that traits<const T> == traits<T>
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// When constness must affect traits, it has to be constness on template parameters on which T itself depends.
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// For example, traits<Map<const T> > != traits<Map<T> >, but
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//              traits<const Map<T> > == traits<Map<T> >
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct traits<const T> : traits<T> {};
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> struct has_direct_access
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum { ret = (traits<Derived>::Flags & DirectAccessBit) ? 1 : 0 };
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> struct accessors_level
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum { has_direct_access = (traits<Derived>::Flags & DirectAccessBit) ? 1 : 0,
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         has_write_access = (traits<Derived>::Flags & LvalueBit) ? 1 : 0,
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         value = has_direct_access ? (has_write_access ? DirectWriteAccessors : DirectAccessors)
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                                   : (has_write_access ? WriteAccessors       : ReadOnlyAccessors)
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename T> struct NumTraits;
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> struct EigenBase;
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class DenseBase;
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class PlainObjectBase;
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived,
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         int Level = internal::accessors_level<Derived>::value >
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass DenseCoeffsBase;
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int _Rows, int _Cols,
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         int _Options = AutoAlign |
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if defined(__GNUC__) && __GNUC__==3 && __GNUC_MINOR__==4
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // workaround a bug in at least gcc 3.4.6
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // the innermost ?: ternary operator is misparsed. We write it slightly
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // differently and this makes gcc 3.4.6 happy, but it's ugly.
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // The error would only show up with EIGEN_DEFAULT_TO_ROW_MAJOR is defined
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // (when EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION is RowMajor)
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          ( (_Rows==1 && _Cols!=1) ? RowMajor
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          : !(_Cols==1 && _Rows!=1) ?  EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          : ColMajor ),
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          ( (_Rows==1 && _Cols!=1) ? RowMajor
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          : (_Cols==1 && _Rows!=1) ? ColMajor
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ),
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         int _MaxRows = _Rows,
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         int _MaxCols = _Cols
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath> class Matrix;
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class MatrixBase;
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class ArrayBase;
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType, unsigned int Added, unsigned int Removed> class Flagged;
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType, template <typename> class StorageBase > class NoAlias;
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> class NestByValue;
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> class ForceAlignedAccess;
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> class SwapWrapper;
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
817faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename XprType, int BlockRows=Dynamic, int BlockCols=Dynamic, bool InnerPanel = false> class Block;
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, int Size=Dynamic> class VectorBlock;
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class Transpose;
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class Conjugate;
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename NullaryOp, typename MatrixType>         class CwiseNullaryOp;
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename UnaryOp,   typename MatrixType>         class CwiseUnaryOp;
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ViewOp,    typename MatrixType>         class CwiseUnaryView;
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename BinaryOp,  typename Lhs, typename Rhs>  class CwiseBinaryOp;
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename BinOp,     typename Lhs, typename Rhs>  class SelfCwiseBinaryOp;
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived,   typename Lhs, typename Rhs>  class ProductBase;
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Lhs, typename Rhs, int Mode>            class GeneralProduct;
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Lhs, typename Rhs, int NestingFlags>    class CoeffBasedProduct;
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class DiagonalBase;
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _DiagonalVectorType> class DiagonalWrapper;
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int SizeAtCompileTime, int MaxSizeAtCompileTime=SizeAtCompileTime> class DiagonalMatrix;
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, typename DiagonalType, int ProductOrder> class DiagonalProduct;
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, int Index = 0> class Diagonal;
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int SizeAtCompileTime, int MaxSizeAtCompileTime = SizeAtCompileTime, typename IndexType=int> class PermutationMatrix;
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int SizeAtCompileTime, int MaxSizeAtCompileTime = SizeAtCompileTime, typename IndexType=int> class Transpositions;
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class PermutationBase;
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class TranspositionsBase;
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _IndicesType> class PermutationWrapper;
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _IndicesType> class TranspositionsWrapper;
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived,
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         int Level = internal::accessors_level<Derived>::has_write_access ? WriteAccessors : ReadOnlyAccessors
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath> class MapBase;
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int InnerStrideAtCompileTime, int OuterStrideAtCompileTime> class Stride;
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, int MapOptions=Unaligned, typename StrideType = Stride<0,0> > class Map;
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class TriangularBase;
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, unsigned int Mode> class TriangularView;
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, unsigned int Mode> class SelfAdjointView;
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class SparseView;
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> class WithFormat;
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> struct CommaInitializer;
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class ReturnByValue;
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> class ArrayWrapper;
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> class MatrixWrapper;
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DecompositionType, typename Rhs> struct solve_retval_base;
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DecompositionType, typename Rhs> struct solve_retval;
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DecompositionType> struct kernel_retval_base;
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DecompositionType> struct kernel_retval;
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DecompositionType> struct image_retval_base;
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename DecompositionType> struct image_retval;
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int Rows=Dynamic, int Cols=Dynamic, int Supers=Dynamic, int Subs=Dynamic, int Options=0> class BandMatrix;
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Lhs, typename Rhs> struct product_type;
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Lhs, typename Rhs,
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         int ProductType = internal::product_type<Lhs,Rhs>::value>
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct ProductReturnType;
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// this is a workaround for sun CC
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Lhs, typename Rhs> struct LazyProductReturnType;
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Provides scalar/packet-wise product and product with accumulation
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with optional conjugation of the arguments.
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename LhsScalar, typename RhsScalar, bool ConjLhs=false, bool ConjRhs=false> struct conj_helper;
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_sum_op;
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_difference_op;
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename LhsScalar,typename RhsScalar> struct scalar_conj_product_op;
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_opposite_op;
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_conjugate_op;
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_real_op;
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_imag_op;
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_abs_op;
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_abs2_op;
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_sqrt_op;
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_exp_op;
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_log_op;
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_cos_op;
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_sin_op;
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_acos_op;
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_asin_op;
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_tan_op;
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_pow_op;
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_inverse_op;
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_square_op;
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_cube_op;
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, typename NewType> struct scalar_cast_op;
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_multiple_op;
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_quotient1_op;
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_min_op;
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_max_op;
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_random_op;
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_add_op;
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_constant_op;
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> struct scalar_identity_op;
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_product_op;
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename LhsScalar,typename RhsScalar> struct scalar_multiple2_op;
1867faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_quotient_op;
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct IOFormat;
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Array module
193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int _Rows, int _Cols,
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         int _Options = AutoAlign |
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if defined(__GNUC__) && __GNUC__==3 && __GNUC_MINOR__==4
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // workaround a bug in at least gcc 3.4.6
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // the innermost ?: ternary operator is misparsed. We write it slightly
198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // differently and this makes gcc 3.4.6 happy, but it's ugly.
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // The error would only show up with EIGEN_DEFAULT_TO_ROW_MAJOR is defined
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // (when EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION is RowMajor)
201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          ( (_Rows==1 && _Cols!=1) ? RowMajor
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          : !(_Cols==1 && _Rows!=1) ?  EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION
203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          : ColMajor ),
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else
205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          ( (_Rows==1 && _Cols!=1) ? RowMajor
206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          : (_Cols==1 && _Rows!=1) ? ColMajor
207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                          : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ),
208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath         int _MaxRows = _Rows, int _MaxCols = _Cols> class Array;
210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType> class Select;
211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, typename BinaryOp, int Direction> class PartialReduxExpr;
212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType, int Direction> class VectorwiseOp;
213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType,int RowFactor,int ColFactor> class Replicate;
214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, int Direction = BothDirections> class Reverse;
215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class FullPivLU;
217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class PartialPivLU;
218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> struct inverse_impl;
220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class HouseholderQR;
222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class ColPivHouseholderQR;
223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class FullPivHouseholderQR;
224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, int QRPreconditioner = ColPivHouseholderQRPreconditioner> class JacobiSVD;
225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, int UpLo = Lower> class LLT;
226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, int UpLo = Lower> class LDLT;
227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename VectorsType, typename CoeffsType, int Side=OnTheLeft> class HouseholderSequence;
228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar>     class JacobiRotation;
229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Geometry module:
231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived, int _Dim> class RotationBase;
232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Lhs, typename Rhs> class Cross;
233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class QuaternionBase;
234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> class Rotation2D;
235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> class AngleAxis;
236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar,int Dim> class Translation;
237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN2_SUPPORT
239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived, int _Dim> class eigen2_RotationBase;
240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Lhs, typename Rhs> class eigen2_Cross;
241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> class eigen2_Quaternion;
242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> class eigen2_Rotation2D;
243c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> class eigen2_AngleAxis;
244c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar,int Dim> class eigen2_Transform;
245c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename _Scalar, int _AmbientDim> class eigen2_ParametrizedLine;
246c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename _Scalar, int _AmbientDim> class eigen2_Hyperplane;
247c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar,int Dim> class eigen2_Translation;
248c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar,int Dim> class eigen2_Scaling;
249c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
250c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
251c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if EIGEN2_SUPPORT_STAGE < STAGE20_RESOLVE_API_CONFLICTS
252c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> class Quaternion;
253c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar,int Dim> class Transform;
254c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename _Scalar, int _AmbientDim> class ParametrizedLine;
255c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename _Scalar, int _AmbientDim> class Hyperplane;
256c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar,int Dim> class Scaling;
257c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
258c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
259c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS
260c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int Options = AutoAlign> class Quaternion;
261c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar,int Dim,int Mode,int _Options=AutoAlign> class Transform;
262c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename _Scalar, int _AmbientDim, int Options=AutoAlign> class ParametrizedLine;
263c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename _Scalar, int _AmbientDim, int Options=AutoAlign> class Hyperplane;
264c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar> class UniformScaling;
265c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType,int Direction> class Homogeneous;
266c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
267c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
268c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// MatrixFunctions module
269c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> struct MatrixExponentialReturnValue;
270c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class MatrixFunctionReturnValue;
271c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class MatrixSquareRootReturnValue;
272c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class MatrixLogarithmReturnValue;
2737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename Derived> class MatrixPowerReturnValue;
2747faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandeztemplate<typename Derived, typename Lhs, typename Rhs> class MatrixPowerProduct;
275c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
276c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
277c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <typename Scalar>
278c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct stem_function
279c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
280c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
281c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef ComplexScalar type(ComplexScalar, int);
282c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
283c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
284c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
285c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
286c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN2_SUPPORT
287c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename ExpressionType> class Cwise;
288c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class Minor;
289c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class LU;
290c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class QR;
291c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType> class SVD;
292c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
293c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType, unsigned int Mode> struct eigen2_part_return_type;
294c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
295c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
296c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
297c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
298c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
299c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_FORWARDDECLARATIONS_H
300