ForwardDeclarations.h revision c981c48f5bc9aefeffc0bcb0cc3934c2fae179dd
19e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura// This file is part of Eigen, a lightweight C++ template library
23b9fd99cb78383e0ce8cd1a31e3b824a30ef965eLassi Tuura// for linear algebra.
39e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura//
49e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura// Copyright (C) 2007-2010 Benoit Jacob <jacob.benoit.1@gmail.com>
59e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>
69e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura//
79e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura// This Source Code Form is subject to the terms of the Mozilla
89e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura// Public License v. 2.0. If a copy of the MPL was not distributed
99e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
109e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura
119e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura#ifndef EIGEN_FORWARDDECLARATIONS_H
129e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura#define EIGEN_FORWARDDECLARATIONS_H
139e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura
149e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuranamespace Eigen {
159e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuranamespace internal {
169e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura
179e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename T> struct traits;
189e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura
199e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura// here we say once and for all that traits<const T> == traits<T>
209e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura// When constness must affect traits, it has to be constness on template parameters on which T itself depends.
219e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura// For example, traits<Map<const T> > != traits<Map<T> >, but
229e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura//              traits<const Map<T> > == traits<Map<T> >
239e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename T> struct traits<const T> : traits<T> {};
249e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura
259e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Derived> struct has_direct_access
269e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura{
279e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura  enum { ret = (traits<Derived>::Flags & DirectAccessBit) ? 1 : 0 };
280a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharma};
299e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura
3044a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename Derived> struct accessors_level
3144a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura{
3244a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura  enum { has_direct_access = (traits<Derived>::Flags & DirectAccessBit) ? 1 : 0,
3344a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura         has_write_access = (traits<Derived>::Flags & LvalueBit) ? 1 : 0,
3444a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura         value = has_direct_access ? (has_write_access ? DirectWriteAccessors : DirectAccessors)
35d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuura                                   : (has_write_access ? WriteAccessors       : ReadOnlyAccessors)
36d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuura  };
379e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura};
3844a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura
3944a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura} // end namespace internal
40d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuura
41d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuuratemplate<typename T> struct NumTraits;
4244a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura
430a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharmatemplate<typename Derived> struct EigenBase;
440a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharmatemplate<typename Derived> class DenseBase;
4544a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename Derived> class PlainObjectBase;
4644a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura
4744a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura
48aebba1f8a7dee9b9ae3e70128ad48de69ca90b15Tommi Rantalatemplate<typename Derived,
4944a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura         int Level = internal::accessors_level<Derived>::value >
5008077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmaclass DenseCoeffsBase;
5144a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura
5244a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename _Scalar, int _Rows, int _Cols,
530a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharma         int _Options = AutoAlign |
540a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharma#if defined(__GNUC__) && __GNUC__==3 && __GNUC_MINOR__==4
5544a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura    // workaround a bug in at least gcc 3.4.6
5644a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura    // the innermost ?: ternary operator is misparsed. We write it slightly
5744a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura    // differently and this makes gcc 3.4.6 happy, but it's ugly.
5844a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura    // The error would only show up with EIGEN_DEFAULT_TO_ROW_MAJOR is defined
599e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura    // (when EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION is RowMajor)
6044a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura                          ( (_Rows==1 && _Cols!=1) ? RowMajor
610a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharma                          : !(_Cols==1 && _Rows!=1) ?  EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION
620a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharma                          : ColMajor ),
630a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharma#else
640a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharma                          ( (_Rows==1 && _Cols!=1) ? RowMajor
650a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharma                          : (_Cols==1 && _Rows!=1) ? ColMajor
660a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharma                          : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ),
670a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharma#endif
680a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharma         int _MaxRows = _Rows,
6952ca68c770e9128940748bab72a5b103057166a8Arun Sharma         int _MaxCols = _Cols
7052ca68c770e9128940748bab72a5b103057166a8Arun Sharma> class Matrix;
71d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuura
7244a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename Derived> class MatrixBase;
7344a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename Derived> class ArrayBase;
7444a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura
7544a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename ExpressionType, unsigned int Added, unsigned int Removed> class Flagged;
7644a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename ExpressionType, template <typename> class StorageBase > class NoAlias;
7744a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename ExpressionType> class NestByValue;
7844a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename ExpressionType> class ForceAlignedAccess;
7944a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename ExpressionType> class SwapWrapper;
8044a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura
81d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuuratemplate<typename XprType, int BlockRows=Dynamic, int BlockCols=Dynamic, bool InnerPanel = false,
8208077a4962c4e606598f9f0e54b515b3c882be10Arun Sharma         bool HasDirectAccess = internal::has_direct_access<XprType>::ret> class Block;
8344a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura
8444a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename MatrixType, int Size=Dynamic> class VectorBlock;
8544a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename MatrixType> class Transpose;
86d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuuratemplate<typename MatrixType> class Conjugate;
8744a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename NullaryOp, typename MatrixType>         class CwiseNullaryOp;
88d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuuratemplate<typename UnaryOp,   typename MatrixType>         class CwiseUnaryOp;
8944a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename ViewOp,    typename MatrixType>         class CwiseUnaryView;
9044a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename BinaryOp,  typename Lhs, typename Rhs>  class CwiseBinaryOp;
91d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuuratemplate<typename BinOp,     typename Lhs, typename Rhs>  class SelfCwiseBinaryOp;
92890e23eb9d3ffd9be2a025189a21794b5ed0e0ffTommi Rantalatemplate<typename Derived,   typename Lhs, typename Rhs>  class ProductBase;
93d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuuratemplate<typename Lhs, typename Rhs, int Mode>            class GeneralProduct;
9444a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename Lhs, typename Rhs, int NestingFlags>    class CoeffBasedProduct;
9544a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura
9644a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename Derived> class DiagonalBase;
9744a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename _DiagonalVectorType> class DiagonalWrapper;
9844a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename _Scalar, int SizeAtCompileTime, int MaxSizeAtCompileTime=SizeAtCompileTime> class DiagonalMatrix;
9944a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename MatrixType, typename DiagonalType, int ProductOrder> class DiagonalProduct;
10044a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename MatrixType, int Index = 0> class Diagonal;
10144a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<int SizeAtCompileTime, int MaxSizeAtCompileTime = SizeAtCompileTime, typename IndexType=int> class PermutationMatrix;
10244a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<int SizeAtCompileTime, int MaxSizeAtCompileTime = SizeAtCompileTime, typename IndexType=int> class Transpositions;
10344a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename Derived> class PermutationBase;
10444a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename Derived> class TranspositionsBase;
10544a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename _IndicesType> class PermutationWrapper;
10644a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename _IndicesType> class TranspositionsWrapper;
1070a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharma
1080a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharmatemplate<typename Derived,
1090a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharma         int Level = internal::accessors_level<Derived>::has_write_access ? WriteAccessors : ReadOnlyAccessors
1100a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharma> class MapBase;
1110a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharmatemplate<int InnerStrideAtCompileTime, int OuterStrideAtCompileTime> class Stride;
1120a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharmatemplate<typename MatrixType, int MapOptions=Unaligned, typename StrideType = Stride<0,0> > class Map;
1130a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharma
1140a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharmatemplate<typename Derived> class TriangularBase;
1150a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharmatemplate<typename MatrixType, unsigned int Mode> class TriangularView;
11644a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename MatrixType, unsigned int Mode> class SelfAdjointView;
11744a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename MatrixType> class SparseView;
11844a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename ExpressionType> class WithFormat;
1190a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharmatemplate<typename MatrixType> struct CommaInitializer;
12044a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename Derived> class ReturnByValue;
1219e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename ExpressionType> class ArrayWrapper;
122d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuuratemplate<typename ExpressionType> class MatrixWrapper;
12344a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura
12444a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuranamespace internal {
12544a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename DecompositionType, typename Rhs> struct solve_retval_base;
1260a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharmatemplate<typename DecompositionType, typename Rhs> struct solve_retval;
12744a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename DecompositionType> struct kernel_retval_base;
1289e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename DecompositionType> struct kernel_retval;
129d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuuratemplate<typename DecompositionType> struct image_retval_base;
13044a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename DecompositionType> struct image_retval;
1310a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharma} // end namespace internal
1320a26727ea2b3b9afd8d019a91777f350d06dd8dcArun Sharma
13344a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuranamespace internal {
13444a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename _Scalar, int Rows=Dynamic, int Cols=Dynamic, int Supers=Dynamic, int Subs=Dynamic, int Options=0> class BandMatrix;
1359e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura}
1369e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura
13744a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuranamespace internal {
13844a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename Lhs, typename Rhs> struct product_type;
13944a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura}
14044a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura
1419e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Lhs, typename Rhs,
142d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuura         int ProductType = internal::product_type<Lhs,Rhs>::value>
143d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuurastruct ProductReturnType;
144d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuura
145d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuura// this is a workaround for sun CC
146d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuuratemplate<typename Lhs, typename Rhs> struct LazyProductReturnType;
14744a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura
148d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuuranamespace internal {
14944a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura
15044a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura// Provides scalar/packet-wise product and product with accumulation
15144a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura// with optional conjugation of the arguments.
152d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuuratemplate<typename LhsScalar, typename RhsScalar, bool ConjLhs=false, bool ConjRhs=false> struct conj_helper;
153d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuura
154d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuuratemplate<typename Scalar> struct scalar_sum_op;
155d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuuratemplate<typename Scalar> struct scalar_difference_op;
156f1ea02be58c2127cc655ef3fd6a385a1bd22cdcdLassi Tuuratemplate<typename LhsScalar,typename RhsScalar> struct scalar_conj_product_op;
1579e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Scalar> struct scalar_quotient_op;
1589e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Scalar> struct scalar_opposite_op;
1599e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Scalar> struct scalar_conjugate_op;
16008077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename Scalar> struct scalar_real_op;
16108077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename Scalar> struct scalar_imag_op;
16208077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename Scalar> struct scalar_abs_op;
16308077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename Scalar> struct scalar_abs2_op;
16408077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename Scalar> struct scalar_sqrt_op;
165890e23eb9d3ffd9be2a025189a21794b5ed0e0ffTommi Rantalatemplate<typename Scalar> struct scalar_exp_op;
16608077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename Scalar> struct scalar_log_op;
16708077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename Scalar> struct scalar_cos_op;
16808077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename Scalar> struct scalar_sin_op;
16908077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename Scalar> struct scalar_acos_op;
17008077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename Scalar> struct scalar_asin_op;
17108077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename Scalar> struct scalar_tan_op;
17208077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename Scalar> struct scalar_pow_op;
17308077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename Scalar> struct scalar_inverse_op;
17408077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename Scalar> struct scalar_square_op;
17508077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename Scalar> struct scalar_cube_op;
17608077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename Scalar, typename NewType> struct scalar_cast_op;
17708077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename Scalar> struct scalar_multiple_op;
17844a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename Scalar> struct scalar_quotient1_op;
17944a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename Scalar> struct scalar_min_op;
18044a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename Scalar> struct scalar_max_op;
18144a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename Scalar> struct scalar_random_op;
18244a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename Scalar> struct scalar_add_op;
183890e23eb9d3ffd9be2a025189a21794b5ed0e0ffTommi Rantalatemplate<typename Scalar> struct scalar_constant_op;
18444a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename Scalar> struct scalar_identity_op;
18544a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura
18608077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename LhsScalar,typename RhsScalar=LhsScalar> struct scalar_product_op;
18708077a4962c4e606598f9f0e54b515b3c882be10Arun Sharmatemplate<typename LhsScalar,typename RhsScalar> struct scalar_multiple2_op;
18808077a4962c4e606598f9f0e54b515b3c882be10Arun Sharma
18908077a4962c4e606598f9f0e54b515b3c882be10Arun Sharma} // end namespace internal
19015f182828d88ea51d419d94b3daabb7a69181c78Arun Sharma
19144a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuurastruct IOFormat;
19244a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura
19344a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura// Array module
19415f182828d88ea51d419d94b3daabb7a69181c78Arun Sharmatemplate<typename _Scalar, int _Rows, int _Cols,
19544a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura         int _Options = AutoAlign |
19644a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura#if defined(__GNUC__) && __GNUC__==3 && __GNUC_MINOR__==4
19744a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura    // workaround a bug in at least gcc 3.4.6
19844a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura    // the innermost ?: ternary operator is misparsed. We write it slightly
19944a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura    // differently and this makes gcc 3.4.6 happy, but it's ugly.
20044a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura    // The error would only show up with EIGEN_DEFAULT_TO_ROW_MAJOR is defined
20108077a4962c4e606598f9f0e54b515b3c882be10Arun Sharma    // (when EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION is RowMajor)
20244a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura                          ( (_Rows==1 && _Cols!=1) ? RowMajor
20344a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura                          : !(_Cols==1 && _Rows!=1) ?  EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION
20444a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura                          : ColMajor ),
2059e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura#else
2069e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura                          ( (_Rows==1 && _Cols!=1) ? RowMajor
2079e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura                          : (_Cols==1 && _Rows!=1) ? ColMajor
2089e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura                          : EIGEN_DEFAULT_MATRIX_STORAGE_ORDER_OPTION ),
2099e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura#endif
2109e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura         int _MaxRows = _Rows, int _MaxCols = _Cols> class Array;
2119e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename ConditionMatrixType, typename ThenMatrixType, typename ElseMatrixType> class Select;
2129e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename MatrixType, typename BinaryOp, int Direction> class PartialReduxExpr;
2139e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename ExpressionType, int Direction> class VectorwiseOp;
2149e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename MatrixType,int RowFactor,int ColFactor> class Replicate;
2159e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename MatrixType, int Direction = BothDirections> class Reverse;
2169e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura
2179e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename MatrixType> class FullPivLU;
2189e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename MatrixType> class PartialPivLU;
2199e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuranamespace internal {
2209e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename MatrixType> struct inverse_impl;
2219e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura}
2229e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename MatrixType> class HouseholderQR;
2239e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename MatrixType> class ColPivHouseholderQR;
2249e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename MatrixType> class FullPivHouseholderQR;
2259e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename MatrixType, int QRPreconditioner = ColPivHouseholderQRPreconditioner> class JacobiSVD;
2269e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename MatrixType, int UpLo = Lower> class LLT;
2279e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename MatrixType, int UpLo = Lower> class LDLT;
2289e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename VectorsType, typename CoeffsType, int Side=OnTheLeft> class HouseholderSequence;
2299e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Scalar>     class JacobiRotation;
2309e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura
2319e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura// Geometry module:
2329e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Derived, int _Dim> class RotationBase;
2339e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Lhs, typename Rhs> class Cross;
2349e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Derived> class QuaternionBase;
2359e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Scalar> class Rotation2D;
2369e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Scalar> class AngleAxis;
2379e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Scalar,int Dim> class Translation;
2389e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura
2399e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura#ifdef EIGEN2_SUPPORT
2409e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Derived, int _Dim> class eigen2_RotationBase;
2419e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Lhs, typename Rhs> class eigen2_Cross;
2429e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Scalar> class eigen2_Quaternion;
2439e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Scalar> class eigen2_Rotation2D;
2449e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Scalar> class eigen2_AngleAxis;
245ae5c1f2adf4da04235d87d024d4d942c01b2b447Lassi Tuuratemplate<typename Scalar,int Dim> class eigen2_Transform;
246ae5c1f2adf4da04235d87d024d4d942c01b2b447Lassi Tuuratemplate <typename _Scalar, int _AmbientDim> class eigen2_ParametrizedLine;
247ae5c1f2adf4da04235d87d024d4d942c01b2b447Lassi Tuuratemplate <typename _Scalar, int _AmbientDim> class eigen2_Hyperplane;
248ae5c1f2adf4da04235d87d024d4d942c01b2b447Lassi Tuuratemplate<typename Scalar,int Dim> class eigen2_Translation;
2499e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Scalar,int Dim> class eigen2_Scaling;
2509e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura#endif
2519e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura
2529e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura#if EIGEN2_SUPPORT_STAGE < STAGE20_RESOLVE_API_CONFLICTS
2539e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Scalar> class Quaternion;
2549e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Scalar,int Dim> class Transform;
2559e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate <typename _Scalar, int _AmbientDim> class ParametrizedLine;
2569e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate <typename _Scalar, int _AmbientDim> class Hyperplane;
2579e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Scalar,int Dim> class Scaling;
2589e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura#endif
2599e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura
2609e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura#if EIGEN2_SUPPORT_STAGE > STAGE20_RESOLVE_API_CONFLICTS
2619e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Scalar, int Options = AutoAlign> class Quaternion;
2629e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Scalar,int Dim,int Mode,int _Options=AutoAlign> class Transform;
2639e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate <typename _Scalar, int _AmbientDim, int Options=AutoAlign> class ParametrizedLine;
2649e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate <typename _Scalar, int _AmbientDim, int Options=AutoAlign> class Hyperplane;
2659e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Scalar> class UniformScaling;
2669e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename MatrixType,int Direction> class Homogeneous;
2679e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura#endif
2689e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura
2699e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura// MatrixFunctions module
2709e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Derived> struct MatrixExponentialReturnValue;
2719e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Derived> class MatrixFunctionReturnValue;
2729e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Derived> class MatrixSquareRootReturnValue;
2739e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename Derived> class MatrixLogarithmReturnValue;
27444a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura
2759e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuranamespace internal {
2769e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate <typename Scalar>
2779e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuurastruct stem_function
2789e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura{
2799e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura  typedef std::complex<typename NumTraits<Scalar>::Real> ComplexScalar;
2809e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura  typedef ComplexScalar type(ComplexScalar, int);
2819e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura};
2829e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura}
2839e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura
2849e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura
285d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuura#ifdef EIGEN2_SUPPORT
286d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuuratemplate<typename ExpressionType> class Cwise;
28744a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename MatrixType> class Minor;
28844a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename MatrixType> class LU;
2899e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuratemplate<typename MatrixType> class QR;
29044a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuuratemplate<typename MatrixType> class SVD;
2919e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuuranamespace internal {
292d2525ec9369525c4d089eeffc84b417fd9c9aea7Lassi Tuuratemplate<typename MatrixType, unsigned int Mode> struct eigen2_part_return_type;
29344a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura}
2949e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura#endif
2959e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura
296ae5c1f2adf4da04235d87d024d4d942c01b2b447Lassi Tuura} // end namespace Eigen
2979e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura
2989e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura#endif // EIGEN_FORWARDDECLARATIONS_H
29944a14d1364abff3dc7ec49f35b7220542c4cf2b1Lassi Tuura