namespace Eigen {

/** \page TopicPreprocessorDirectives Preprocessor directives

You can control some aspects of Eigen by defining the preprocessor tokens using \c \#define. These macros
should be defined before any Eigen headers are included. Often they are best set in the project options.

This page lists the preprocesor tokens recognised by Eigen.

<b>Table of contents</b>
  - \ref TopicPreprocessorDirectivesMajor
  - \ref TopicPreprocessorDirectivesAssertions
  - \ref TopicPreprocessorDirectivesPerformance
  - \ref TopicPreprocessorDirectivesPlugins


\section TopicPreprocessorDirectivesMajor Macros with major effects

 - \b EIGEN2_SUPPORT - if defined, enables the Eigen2 compatibility mode. This is meant to ease the transition
   of Eigen2 to Eigen3 (see \ref Eigen2ToEigen3). Not defined by default.
 - \b EIGEN2_SUPPORT_STAGEnn_xxx (for various values of nn and xxx) - staged migration path from Eigen2 to
   Eigen3; see \ref Eigen2SupportModes.
 - \b EIGEN_DEFAULT_TO_ROW_MAJOR - when defined, the default storage order for matrices becomes row-major
   instead of column-major. Not defined by default.
 - \b EIGEN_DEFAULT_IO_FORMAT - the IOFormat to use when printing a matrix if no #IOFormat is specified.
   Defaults to the #IOFormat constructed by the default constructor IOFormat().
 - \b EIGEN_INITIALIZE_MATRICES_BY_ZERO - if defined, all entries of newly constructed matrices and arrays are
   initializes to zero, as are new entries in matrices and arrays after resizing. Not defined by default.


\section TopicPreprocessorDirectivesAssertions Assertions

The Eigen library contains many assertions to guard against programming errors, both at compile time and at
run time. However, these assertions do cost time and can thus be turned off.

 - \b EIGEN_NO_DEBUG - disables Eigen's assertions if defined. Not defined by default, unless the
   \c NDEBUG macro is defined (this is a standard C++ macro which disables all asserts). 
 - \b EIGEN_NO_STATIC_ASSERT - if defined, compile-time static assertions are replaced by runtime assertions; 
   this saves compilation time. Not defined by default.
 - \b EIGEN_INTERNAL_DEBUGGING - if defined, enables assertions in Eigen's internal routines. This is useful
   for debugging Eigen itself. Not defined by default.


\section TopicPreprocessorDirectivesPerformance Alignment, vectorization and performance tweaking

 - \b EIGEN_DONT_ALIGN - disables alignment.
 - \b EIGEN_DONT_ALIGN_STATICALLY - disables alignment of arrays on the stack. Not defined by default, unless
   \c EIGEN_DONT_ALIGN is defined.
 - \b EIGEN_DONT_VECTORIZE - disables explicit vectorization when defined. Not defined by default, unless 
   alignment is disabled by Eigen's platform test or the user defining \c EIGEN_DONT_ALIGN.
 - \b EIGEN_FAST_MATH - enables some optimizations which might affect the accuracy of the result. The only
   optimization this currently includes is single precision sin() and cos() in the present of SSE
   vectorization. Defined by default. 
 - \b EIGEN_UNROLLING_LIMIT - defines the size of a loop to enable meta unrolling. Set it to zero to disable
   unrolling. The size of a loop here is expressed in Eigen's own notion of "number of FLOPS", it does not
   correspond to the number of iterations or the number of instructions. The default is value 100. 


\section TopicPreprocessorDirectivesPlugins Plugins

It is possible to add new methods to many fundamental classes in Eigen by writing a plugin. As explained in
the section \ref ExtendingMatrixBase, the plugin is specified by defining a \c EIGEN_xxx_PLUGIN macro. The
following macros are supported; none of them are defined by default.

 - \b EIGEN_ARRAY_PLUGIN - filename of plugin for extending the Array class.
 - \b EIGEN_ARRAYBASE_PLUGIN - filename of plugin for extending the ArrayBase class.
 - \b EIGEN_CWISE_PLUGIN - filename of plugin for extending the Cwise class.
 - \b EIGEN_DENSEBASE_PLUGIN - filename of plugin for extending the DenseBase class.
 - \b EIGEN_DYNAMICSPARSEMATRIX_PLUGIN - filename of plugin for extending the DynamicSparseMatrix class.
 - \b EIGEN_MATRIX_PLUGIN - filename of plugin for extending the Matrix class.
 - \b EIGEN_MATRIXBASE_PLUGIN - filename of plugin for extending the MatrixBase class.
 - \b EIGEN_PLAINOBJECTBASE_PLUGIN - filename of plugin for extending the PlainObjectBase class.
 - \b EIGEN_QUATERNIONBASE_PLUGIN - filename of plugin for extending the QuaternionBase class.
 - \b EIGEN_SPARSEMATRIX_PLUGIN - filename of plugin for extending the SparseMatrix class.
 - \b EIGEN_SPARSEMATRIXBASE_PLUGIN - filename of plugin for extending the SparseMatrixBase class.
 - \b EIGEN_SPARSEVECTOR_PLUGIN - filename of plugin for extending the SparseVector class.
 - \b EIGEN_TRANSFORM_PLUGIN - filename of plugin for extending the Transform class.
 - \b EIGEN_FUNCTORS_PLUGIN - filename of plugin for adding new functors and specializations of functor_traits.


*/

}
