aboutsummaryrefslogtreecommitdiffhomepage
path: root/doc/ClassHierarchy.dox
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2013-01-06 23:57:54 +0100
committerGravatar Gael Guennebaud <g.gael@free.fr>2013-01-06 23:57:54 +0100
commit2abe7d8c6e11a02fc345f6ae464b4b759b092a67 (patch)
tree32b0a1517731ee705e1d6ee7d8d944740642efbf /doc/ClassHierarchy.dox
parent091a49cad5d3aed47de9cb78c821c5f11b85e5f8 (diff)
Rename the dox files: the number prefixes are not needed anymore
Diffstat (limited to 'doc/ClassHierarchy.dox')
-rw-r--r--doc/ClassHierarchy.dox129
1 files changed, 129 insertions, 0 deletions
diff --git a/doc/ClassHierarchy.dox b/doc/ClassHierarchy.dox
new file mode 100644
index 000000000..468e60a76
--- /dev/null
+++ b/doc/ClassHierarchy.dox
@@ -0,0 +1,129 @@
+namespace Eigen {
+
+/** \page TopicClassHierarchy The class hierarchy
+
+This page explains the design of the core classes in Eigen's class hierarchy and how they fit together. Casual
+users probably need not concern themselves with these details, but it may be useful for both advanced users
+and Eigen developers.
+
+\eigenAutoToc
+
+
+\section TopicClassHierarchyPrinciples Principles
+
+Eigen's class hierarchy is designed so that virtual functions are avoided where their overhead would
+significantly impair performance. Instead, Eigen achieves polymorphism with the Curiously Recurring Template
+Pattern (CRTP). In this pattern, the base class (for instance, \c MatrixBase) is in fact a template class, and
+the derived class (for instance, \c Matrix) inherits the base class with the derived class itself as a
+template argument (in this case, \c Matrix inherits from \c MatrixBase&lt;Matrix&gt;). This allows Eigen to
+resolve the polymorphic function calls at compile time.
+
+In addition, the design avoids multiple inheritance. One reason for this is that in our experience, some
+compilers (like MSVC) fail to perform empty base class optimization, which is crucial for our fixed-size
+types.
+
+
+\section TopicClassHierarchyCoreClasses The core classes
+
+These are the classes that you need to know about if you want to write functions that accept or return Eigen
+objects.
+
+ - Matrix means plain dense matrix. If \c m is a \c %Matrix, then, for instance, \c m+m is no longer a
+ \c %Matrix, it is a "matrix expression".
+ - MatrixBase means dense matrix expression. This means that a \c %MatrixBase is something that can be
+ added, matrix-multiplied, LU-decomposed, QR-decomposed... All matrix expression classes, including
+ \c %Matrix itself, inherit \c %MatrixBase.
+ - Array means plain dense array. If \c x is an \c %Array, then, for instance, \c x+x is no longer an
+ \c %Array, it is an "array expression".
+ - ArrayBase means dense array expression. This means that an \c %ArrayBase is something that can be
+ added, array-multiplied, and on which you can perform all sorts of array operations... All array
+ expression classes, including \c %Array itself, inherit \c %ArrayBase.
+ - DenseBase means dense (matrix or array) expression. Both \c %ArrayBase and \c %MatrixBase inherit
+ \c %DenseBase. \c %DenseBase is where all the methods go that apply to dense expressions regardless of
+ whether they are matrix or array expressions. For example, the \link DenseBase::block() block(...) \endlink
+ methods are in \c %DenseBase.
+
+\section TopicClassHierarchyBaseClasses Base classes
+
+These classes serve as base classes for the five core classes mentioned above. They are more internal and so
+less interesting for users of the Eigen library.
+
+ - PlainObjectBase means dense (matrix or array) plain object, i.e. something that stores its own dense
+ array of coefficients. This is where, for instance, the \link PlainObjectBase::resize() resize() \endlink
+ methods go. \c %PlainObjectBase is inherited by \c %Matrix and by \c %Array. But above, we said that
+ \c %Matrix inherits \c %MatrixBase and \c %Array inherits \c %ArrayBase. So does that mean multiple
+ inheritance? No, because \c %PlainObjectBase \e itself inherits \c %MatrixBase or \c %ArrayBase depending
+ on whether we are in the matrix or array case. When we said above that \c %Matrix inherited
+ \c %MatrixBase, we omitted to say it does so indirectly via \c %PlainObjectBase. Same for \c %Array.
+ - DenseCoeffsBase means something that has dense coefficient accessors. It is a base class for
+ \c %DenseBase. The reason for \c %DenseCoeffsBase to exist is that the set of available coefficient
+ accessors is very different depending on whether a dense expression has direct memory access or not (the
+ \c DirectAccessBit flag). For example, if \c x is a plain matrix, then \c x has direct access, and
+ \c x.transpose() and \c x.block(...) also have direct access, because their coefficients can be read right
+ off memory, but for example, \c x+x does not have direct memory access, because obtaining any of its
+ coefficients requires a computation (an addition), it can't be just read off memory.
+ - EigenBase means anything that can be evaluated into a plain dense matrix or array (even if that would
+ be a bad idea). \c %EigenBase is really the absolute base class for anything that remotely looks like a
+ matrix or array. It is a base class for \c %DenseCoeffsBase, so it sits below all our dense class
+ hierarchy, but it is not limited to dense expressions. For example, \c %EigenBase is also inherited by
+ diagonal matrices, sparse matrices, etc...
+
+
+\section TopicClassHierarchyInheritanceDiagrams Inheritance diagrams
+
+The inheritance diagram for Matrix looks as follows:
+
+<pre>
+EigenBase&lt;%Matrix&gt;
+ <-- DenseCoeffsBase&lt;%Matrix&gt; (direct access case)
+ <-- DenseBase&lt;%Matrix&gt;
+ <-- MatrixBase&lt;%Matrix&gt;
+ <-- PlainObjectBase&lt;%Matrix&gt; (matrix case)
+ <-- Matrix
+</pre>
+
+The inheritance diagram for Array looks as follows:
+
+<pre>
+EigenBase&lt;%Array&gt;
+ <-- DenseCoeffsBase&lt;%Array&gt; (direct access case)
+ <-- DenseBase&lt;%Array&gt;
+ <-- ArrayBase&lt;%Array&gt;
+ <-- PlainObjectBase&lt;%Array&gt; (array case)
+ <-- Array
+</pre>
+
+The inheritance diagram for some other matrix expression class, here denoted by \c SomeMatrixXpr, looks as
+follows:
+
+<pre>
+EigenBase&lt;SomeMatrixXpr&gt;
+ <-- DenseCoeffsBase&lt;SomeMatrixXpr&gt; (direct access or no direct access case)
+ <-- DenseBase&lt;SomeMatrixXpr&gt;
+ <-- MatrixBase&lt;SomeMatrixXpr&gt;
+ <-- SomeMatrixXpr
+</pre>
+
+The inheritance diagram for some other array expression class, here denoted by \c SomeArrayXpr, looks as
+follows:
+
+<pre>
+EigenBase&lt;SomeArrayXpr&gt;
+ <-- DenseCoeffsBase&lt;SomeArrayXpr&gt; (direct access or no direct access case)
+ <-- DenseBase&lt;SomeArrayXpr&gt;
+ <-- ArrayBase&lt;SomeArrayXpr&gt;
+ <-- SomeArrayXpr
+</pre>
+
+Finally, consider an example of something that is not a dense expression, for instance a diagonal matrix. The
+corresponding inheritance diagram is:
+
+<pre>
+EigenBase&lt;%DiagonalMatrix&gt;
+ <-- DiagonalBase&lt;%DiagonalMatrix&gt;
+ <-- DiagonalMatrix
+</pre>
+
+
+*/
+}