\doxysection{gko::\+range\texorpdfstring{$<$}{<} Accessor \texorpdfstring{$>$}{>} Class Template Reference}
\hypertarget{classgko_1_1range}{}\label{classgko_1_1range}\index{gko::range$<$ Accessor $>$@{gko::range$<$ Accessor $>$}}


A range is a multidimensional view of the memory.  




{\ttfamily \+\#include $<$ginkgo/\+core/\+base/\+range.\+hpp$>$}



Inheritance diagram for gko::\+range\texorpdfstring{$<$}{<} Accessor \texorpdfstring{$>$}{>}:\+
\nopagebreak
\begin{figure}[H]
\begin{center}
\leavevmode
\includegraphics[width=280pt]{classgko_1_1range__inherit__graph}
\end{center}
\end{figure}
\doxysubsubsection*{Public Types}
\begin{DoxyCompactItemize}
\item 
\Hypertarget{classgko_1_1range_a3332728e51dadcf6517847cef3000a17}\label{classgko_1_1range_a3332728e51dadcf6517847cef3000a17} 
using {\bfseries accessor} = Accessor
\begin{DoxyCompactList}\small\item\em The type of the underlying accessor. \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsubsection*{Public Member Functions}
\begin{DoxyCompactItemize}
\item 
\Hypertarget{classgko_1_1range_a8c8f2ca9dcaf25ca52fbf21fc7bb8a94}\label{classgko_1_1range_a8c8f2ca9dcaf25ca52fbf21fc7bb8a94} 
{\bfseries \texorpdfstring{$\sim$}{\string~}range} ()=default
\begin{DoxyCompactList}\small\item\em Use the default destructor. \end{DoxyCompactList}\item 
{\footnotesize template$<$typename... Accessor\+Params, typename = std::\+enable\+\_\+if\+\_\+t$<$            sizeof...(\+Accessor\+Params) != 1 \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|}            !std::\+is\+\_\+same$<$                range, std::\+decay$<$detail::\+head\+\_\+t$<$\+Accessor\+Params...$>$$>$$>$::\+value$>$$>$ }\\constexpr \doxymbox{\hyperlink{classgko_1_1range_aede7a11a0eef2b73cabe44c9c2ad8246}{range}} (Accessor\+Params \&\&... params)
\begin{DoxyCompactList}\small\item\em Creates a new range. \end{DoxyCompactList}\item 
{\footnotesize template$<$typename... Dimension\+Types$>$ }\\constexpr auto \doxymbox{\hyperlink{classgko_1_1range_a3ac230f10fa217dbb46475ea38243573}{operator()}} (Dimension\+Types \&\&... dimensions) const -\/$>$ decltype(std::\+declval$<$ \doxymbox{\hyperlink{classgko_1_1range_a3332728e51dadcf6517847cef3000a17}{accessor}} $>$()(std::\+forward$<$ Dimension\+Types $>$(dimensions)...))
\begin{DoxyCompactList}\small\item\em Returns a value (or a sub-\/range) with the specified indexes. \end{DoxyCompactList}\item 
{\footnotesize template$<$typename Other\+Accessor$>$ }\\const \doxymbox{\hyperlink{classgko_1_1range_aede7a11a0eef2b73cabe44c9c2ad8246}{range}} \& \doxymbox{\hyperlink{classgko_1_1range_aa123ae2beed0437d501e2dbde8177c18}{operator=}} (const \doxymbox{\hyperlink{classgko_1_1range_aede7a11a0eef2b73cabe44c9c2ad8246}{range}}$<$ Other\+Accessor $>$ \&other) const
\item 
const \doxymbox{\hyperlink{classgko_1_1range_aede7a11a0eef2b73cabe44c9c2ad8246}{range}} \& \doxymbox{\hyperlink{classgko_1_1range_a70f8019357a268b3f97df7b11712d424}{operator=}} (const \doxymbox{\hyperlink{classgko_1_1range_aede7a11a0eef2b73cabe44c9c2ad8246}{range}} \&other) const
\begin{DoxyCompactList}\small\item\em Assigns another range to this range. \end{DoxyCompactList}\item 
\Hypertarget{classgko_1_1range_ab555af1ee5acedf9b835566ec24ba02f}\label{classgko_1_1range_ab555af1ee5acedf9b835566ec24ba02f} 
{\bfseries range} (const range \&other)=default
\item 
constexpr \doxymbox{\hyperlink{namespacegko_a9579c98b1d85bf4ad02d7cb5b96fc771}{size\+\_\+type}} \doxymbox{\hyperlink{classgko_1_1range_a3ac8b238c377da9cc05d7c728efabfc8}{length}} (\doxymbox{\hyperlink{namespacegko_a9579c98b1d85bf4ad02d7cb5b96fc771}{size\+\_\+type}} dimension) const
\begin{DoxyCompactList}\small\item\em Returns the length of the specified dimension of the range. \end{DoxyCompactList}\item 
constexpr const \doxymbox{\hyperlink{classgko_1_1range_a3332728e51dadcf6517847cef3000a17}{accessor}} \texorpdfstring{$\ast$}{*} \doxymbox{\hyperlink{classgko_1_1range_a5b8e0d6f908ab8a486746e4acf8b025e}{operator-\/$>$}} () const noexcept
\begin{DoxyCompactList}\small\item\em Returns a pointer to the accessor. \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsubsection*{Static Public Attributes}
\begin{DoxyCompactItemize}
\item 
\Hypertarget{classgko_1_1range_a6796721a162561502474e3150f179167}\label{classgko_1_1range_a6796721a162561502474e3150f179167} 
static constexpr \doxymbox{\hyperlink{namespacegko_a9579c98b1d85bf4ad02d7cb5b96fc771}{size\+\_\+type}} {\bfseries dimensionality} = accessor::\+dimensionality
\begin{DoxyCompactList}\small\item\em The number of dimensions of the range. \end{DoxyCompactList}\end{DoxyCompactItemize}


\doxysubsection{Detailed Description}
\subsubsection*{template$<$typename Accessor$>$\newline
class gko::\+range$<$ Accessor $>$}
A range is a multidimensional view of the memory. 

The range does not store any of its values by itself. Instead, it obtains the values through an accessor (e.\+g. \doxylink{classgko_1_1accessor_1_1row__major}{accessor::\+row\+\_\+major}) which describes how the indexes of the range map to physical locations in memory.

There are several advantages of using ranges instead of plain memory pointers:\+


\begin{DoxyEnumerate}
\item Code using ranges is easier to read and write, as there is no need for index linearizations.
\item Code using ranges is safer, as it is impossible to accidentally miscalculate an index or step out of bounds, since range accessors perform bounds checking in debug builds. For performance, this can be disabled in release builds by defining the {\ttfamily NDEBUG} flag.
\item Ranges enable generalized code, as algorithms can be written independent of the memory layout. This does not impede various optimizations based on memory layout, as it is always possible to specialize algorithms for ranges with specific memory layouts.
\item Ranges have various pointwise operations predefined, which reduces the amount of loops that need to be written.
\end{DoxyEnumerate}\hypertarget{classgko_1_1range_autotoc_md77}{}\doxysubsubsection{\texorpdfstring{Range operations}{Range operations}}\label{classgko_1_1range_autotoc_md77}
Ranges define a complete set of pointwise unary and binary operators which extend the basic arithmetic operators in C++, as well as a few pointwise operations and mathematical functions useful in ginkgo, and a couple of non-\/pointwise operations. Compound assignment ({\ttfamily +=}, {\ttfamily \texorpdfstring{$\ast$}{*}=}, etc.) is not yet supported at this moment. Here is a complete list of operations:\+


\begin{DoxyItemize}
\item standard unary operations:\+ {\ttfamily +}, {\ttfamily -\/}, {\ttfamily !}, {\ttfamily \texorpdfstring{$\sim$}{\string~}}
\item standard binary operations:\+ {\ttfamily +}, {\ttfamily \texorpdfstring{$\ast$}{*}} (this is pointwise, not matrix multiplication), {\ttfamily /\+}, {\ttfamily \%}, {\ttfamily \texorpdfstring{$<$}{<}}, {\ttfamily \texorpdfstring{$>$}{>}}, {\ttfamily \texorpdfstring{$<$}{<}=}, {\ttfamily \texorpdfstring{$>$}{>}=}, {\ttfamily ==}, {\ttfamily !=}, {\ttfamily \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|}}, {\ttfamily \&\&}, {\ttfamily \texorpdfstring{$\vert$}{|}}, {\ttfamily \&}, {\ttfamily \texorpdfstring{$^\wedge$}{\string^}}, {\ttfamily \texorpdfstring{$<$}{<}\texorpdfstring{$<$}{<}}, {\ttfamily \texorpdfstring{$>$}{>}\texorpdfstring{$>$}{>}}
\item useful unary functions:\+ {\ttfamily \doxylink{namespacegko_a70dbe01ff95c7b953d3d737424c6feb5}{zero}}, {\ttfamily \doxylink{namespacegko_a0059e27f8f4bc348ff65c1e60caf47c8}{one}}, {\ttfamily \doxylink{namespacegko_a0cb7d0ece3444fcf3a7ebd82e1cb0a69}{abs}}, {\ttfamily \doxylink{namespacegko_af21648097306adbabc6234b4609ce297}{real}}, {\ttfamily \doxylink{namespacegko_a795f649e3744fbfe128aec0b0f928aaa}{imag}}, {\ttfamily \doxylink{namespacegko_ad79fd5c1fb85403796c40c0a916a15f2}{conj}}, {\ttfamily \doxylink{namespacegko_abbb55709b10d707b2cbef803832aa834}{squared\+\_\+norm}}
\item useful binary functions:\+ {\ttfamily \doxylink{namespacegko_aaaf8487194bcb40b528969c187a413a0}{min}}, {\ttfamily \doxylink{namespacegko_af1812df45c6ec07780d579a12b64c753}{max}}
\end{DoxyItemize}

All binary pointwise operations also work as expected if one of the operands is a scalar and the other is a range. The scalar operand will have the effect as if it was a range of the same size as the other operand, filled with the specified scalar.

Two "{}global"{} functions {\ttfamily \doxylink{namespacegko_aacad7f87b38d3f26674ed034d442a1a0}{transpose}} and {\ttfamily mmul} are also supported. {\ttfamily \doxylink{namespacegko_aacad7f87b38d3f26674ed034d442a1a0}{transpose}} transposes the first two dimensions of the range (i.\+e. {\ttfamily transpose(r)(i, j, ...) == r(j, i, ...)}). {\ttfamily mmul} performs a (batched) matrix multiply of the ranges -\/ the first two dimensions represent the matrices, while the rest represent the batch. For example, given the ranges {\ttfamily r1} and {\ttfamily r2} of dimensions {\ttfamily (3, 2, 3)} and {\ttfamily (2, 4, 3)}, respectively, {\ttfamily mmul(r1, r2)} will return a range of dimensions {\ttfamily (3, 4, 3)}, obtained by multiplying the 3 frontal slices of the range, and stacking the result back vertically.\hypertarget{classgko_1_1range_autotoc_md78}{}\doxysubsubsection{\texorpdfstring{Compound operations}{Compound operations}}\label{classgko_1_1range_autotoc_md78}
Multiple range operations can be combined into a single expression. For example, an "{}axpy"{} operation can be obtained using {\ttfamily y = alpha \texorpdfstring{$\ast$}{*} x + y}, where {\ttfamily x} an {\ttfamily y} are ranges, and {\ttfamily alpha} is a scalar. Range operations are optimized for memory access, and the above code does not allocate additional storage for intermediate ranges {\ttfamily alpha \texorpdfstring{$\ast$}{*} x} or {\ttfamily alpha \texorpdfstring{$\ast$}{*} x + y}. In fact, the entire computation is done during the assignment, and the results of operations {\ttfamily +} and {\ttfamily \texorpdfstring{$\ast$}{*}} only register the data, and the types of operations that will be computed once the results are needed.

It is possible to store and reuse these intermediate expressions. The following example will overwrite the range {\ttfamily x} with it\textquotesingle{}s 4th power:\+


\begin{DoxyCode}{0}
\DoxyCodeLine{\textcolor{keyword}{auto}\ square\ =\ x\ *\ x;\ \ \textcolor{comment}{//\ this\ is\ range\ constructor,\ not\ range\ assignment!}}
\DoxyCodeLine{x\ =\ square;\ \ \textcolor{comment}{//\ overwrites\ x\ with\ x*x\ (this\ is\ range\ assignment)}}
\DoxyCodeLine{x\ =\ square;\ \ \textcolor{comment}{//\ overwrites\ new\ x\ (x*x)\ with\ (x*x)*(x*x)\ (as\ is\ this)}}

\end{DoxyCode}
\hypertarget{classgko_1_1range_autotoc_md79}{}\doxysubsubsection{\texorpdfstring{Caveats}{Caveats}}\label{classgko_1_1range_autotoc_md79}
{\bfseries{{\ttfamily mmul} is not a highly-\/optimized BLAS-\/3 version of the matrix multiplication.}} The current design of ranges and accessors prevents that, so if you need a high-\/performance matrix multiplication, you should use one of the libraries that provide that, or implement your own (you can use pointwise range operations to help simplify that). However, range design might get improved in the future to allow efficient implementations of BLAS-\/3 kernels.

Aliasing the result range in {\ttfamily mmul} and {\ttfamily \doxylink{namespacegko_aacad7f87b38d3f26674ed034d442a1a0}{transpose}} is not allowed. Constructs like {\ttfamily A = transpose(\+A)}, {\ttfamily A = mmul(\+A, A)}, or {\ttfamily A = mmul(\+A, A) + C} lead to undefined behavior. However, aliasing input arguments is allowed:\+ {\ttfamily C = mmul(\+A, A)}, and even {\ttfamily C = mmul(\+A, A) + C} is valid code (in the last example, only pointwise operations are aliased). {\ttfamily C = mmul(A, A + C)} is not valid though.\hypertarget{classgko_1_1range_autotoc_md80}{}\doxysubsubsection{\texorpdfstring{Examples}{Examples}}\label{classgko_1_1range_autotoc_md80}
The range unit tests in core/\+test/\+base/\+range.\+cpp contain lots of simple 1-\/line examples of range operations. The accessor unit tests in core/\+test/\+base/\+range.\+cpp show how to use ranges with concrete accessors, and how to use range slices using {\ttfamily \doxylink{structgko_1_1span}{span}}s as arguments to range function call operator. Finally, examples/\+range contains a complete example where ranges are used to implement a simple version of the right-\/looking LU factorization.


\begin{DoxyTemplParams}{Template Parameters}
{\em Accessor} & underlying accessor of the range \\
\hline
\end{DoxyTemplParams}


\label{doc-constructors}
\Hypertarget{classgko_1_1range_doc-constructors}
\doxysubsection{Constructor \& Destructor Documentation}
\Hypertarget{classgko_1_1range_aede7a11a0eef2b73cabe44c9c2ad8246}\index{gko::range$<$ Accessor $>$@{gko::range$<$ Accessor $>$}!range@{range}}
\index{range@{range}!gko::range$<$ Accessor $>$@{gko::range$<$ Accessor $>$}}
\doxysubsubsection{\texorpdfstring{range()}{range()}}
{\footnotesize\ttfamily \label{classgko_1_1range_aede7a11a0eef2b73cabe44c9c2ad8246} 
template$<$typename Accessor$>$ \\
template$<$typename... Accessor\+Params, typename = std::\+enable\+\_\+if\+\_\+t$<$            sizeof...(\+Accessor\+Params) != 1 \texorpdfstring{$\vert$}{|}\texorpdfstring{$\vert$}{|}            !std::\+is\+\_\+same$<$                range, std::\+decay$<$detail::\+head\+\_\+t$<$\+Accessor\+Params...$>$$>$$>$::\+value$>$$>$ \\
\doxymbox{\hyperlink{classgko_1_1range}{gko::\+range}}$<$ Accessor $>$::\+range (\begin{DoxyParamCaption}\item[{Accessor\+Params \&\&...}]{params}{}\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [explicit]}, {\ttfamily [constexpr]}}



Creates a new range. 


\begin{DoxyTemplParams}{Template Parameters}
{\em Accessor\+Param} & types of parameters forwarded to the accessor constructor\\
\hline
\end{DoxyTemplParams}

\begin{DoxyParams}{Parameters}
{\em params} & parameters forwarded to Accessor constructor. \\
\hline
\end{DoxyParams}


\label{doc-func-members}
\Hypertarget{classgko_1_1range_doc-func-members}
\doxysubsection{Member Function Documentation}
\Hypertarget{classgko_1_1range_a3ac8b238c377da9cc05d7c728efabfc8}\index{gko::range$<$ Accessor $>$@{gko::range$<$ Accessor $>$}!length@{length}}
\index{length@{length}!gko::range$<$ Accessor $>$@{gko::range$<$ Accessor $>$}}
\doxysubsubsection{\texorpdfstring{length()}{length()}}
{\footnotesize\ttfamily \label{classgko_1_1range_a3ac8b238c377da9cc05d7c728efabfc8} 
template$<$typename Accessor$>$ \\
\doxymbox{\hyperlink{namespacegko_a9579c98b1d85bf4ad02d7cb5b96fc771}{size\+\_\+type}} \doxymbox{\hyperlink{classgko_1_1range}{gko::\+range}}$<$ Accessor $>$::\+length (\begin{DoxyParamCaption}\item[{\doxymbox{\hyperlink{namespacegko_a9579c98b1d85bf4ad02d7cb5b96fc771}{size\+\_\+type}}}]{dimension}{}\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [constexpr]}}



Returns the length of the specified dimension of the range. 


\begin{DoxyParams}{Parameters}
{\em dimension} & the dimensions whose length is returned\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
the length of the {\ttfamily dimension}-\/th dimension of the range 
\end{DoxyReturn}
\Hypertarget{classgko_1_1range_a3ac230f10fa217dbb46475ea38243573}\index{gko::range$<$ Accessor $>$@{gko::range$<$ Accessor $>$}!operator()@{operator()}}
\index{operator()@{operator()}!gko::range$<$ Accessor $>$@{gko::range$<$ Accessor $>$}}
\doxysubsubsection{\texorpdfstring{operator()()}{operator()()}}
{\footnotesize\ttfamily \label{classgko_1_1range_a3ac230f10fa217dbb46475ea38243573} 
template$<$typename Accessor$>$ \\
template$<$typename... Dimension\+Types$>$ \\
auto \doxymbox{\hyperlink{classgko_1_1range}{gko::\+range}}$<$ Accessor $>$::\+operator() (\begin{DoxyParamCaption}\item[{Dimension\+Types \&\&...}]{dimensions}{}\end{DoxyParamCaption}) const -\/$>$ decltype(std::\+declval$<$ \doxymbox{\hyperlink{classgko_1_1range_a3332728e51dadcf6517847cef3000a17}{accessor}} $>$()( std::\+forward$<$ Dimension\+Types $>$(dimensions)...))\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [constexpr]}}



Returns a value (or a sub-\/range) with the specified indexes. 


\begin{DoxyTemplParams}{Template Parameters}
{\em Dimension\+Types} & The types of indexes. Supported types depend on the underlying accessor, but are usually either integer types or spans. If at least one index is a span, the returned value will be a sub-\/range.\\
\hline
\end{DoxyTemplParams}

\begin{DoxyParams}{Parameters}
{\em dimensions} & the indexes of the values.\\
\hline
\end{DoxyParams}
\begin{DoxyReturn}{Returns}
a value on position {\ttfamily (dimensions...)}. 
\end{DoxyReturn}
\Hypertarget{classgko_1_1range_a5b8e0d6f908ab8a486746e4acf8b025e}\index{gko::range$<$ Accessor $>$@{gko::range$<$ Accessor $>$}!operator-\/$>$@{operator-\/$>$}}
\index{operator-\/$>$@{operator-\/$>$}!gko::range$<$ Accessor $>$@{gko::range$<$ Accessor $>$}}
\doxysubsubsection{\texorpdfstring{operator-\/$>$()}{operator->()}}
{\footnotesize\ttfamily \label{classgko_1_1range_a5b8e0d6f908ab8a486746e4acf8b025e} 
template$<$typename Accessor$>$ \\
const \doxymbox{\hyperlink{classgko_1_1range_a3332728e51dadcf6517847cef3000a17}{accessor}} \texorpdfstring{$\ast$}{*} \doxymbox{\hyperlink{classgko_1_1range}{gko::\+range}}$<$ Accessor $>$::\+operator-\/$>$ (\begin{DoxyParamCaption}{}{}\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}, {\ttfamily [constexpr]}, {\ttfamily [noexcept]}}



Returns a pointer to the accessor. 

Can be used to access data and functions of a specific accessor.

\begin{DoxyReturn}{Returns}
pointer to the accessor 
\end{DoxyReturn}
\Hypertarget{classgko_1_1range_a70f8019357a268b3f97df7b11712d424}\index{gko::range$<$ Accessor $>$@{gko::range$<$ Accessor $>$}!operator=@{operator=}}
\index{operator=@{operator=}!gko::range$<$ Accessor $>$@{gko::range$<$ Accessor $>$}}
\doxysubsubsection{\texorpdfstring{operator=()}{operator=()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}}
{\footnotesize\ttfamily \label{classgko_1_1range_a70f8019357a268b3f97df7b11712d424} 
template$<$typename Accessor$>$ \\
const \doxymbox{\hyperlink{classgko_1_1range_aede7a11a0eef2b73cabe44c9c2ad8246}{range}} \& \doxymbox{\hyperlink{classgko_1_1range}{gko::\+range}}$<$ Accessor $>$::\+operator= (\begin{DoxyParamCaption}\item[{const \doxymbox{\hyperlink{classgko_1_1range_aede7a11a0eef2b73cabe44c9c2ad8246}{range}}$<$ Accessor $>$ \&}]{other}{}\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}}



Assigns another range to this range. 

The order of assignment is defined by the accessor of this range, thus the memory access will be optimized for the resulting range, and not for the other range. If the sizes of two ranges do not match, the result is undefined. Sizes of the ranges are checked at runtime in debug builds.

\begin{DoxyNote}{Note}
Temporary accessors are allowed to define the implementation of the assignment as deleted, so do not expect {\ttfamily r1 \texorpdfstring{$\ast$}{*} r2 = r2} to work.
\end{DoxyNote}

\begin{DoxyParams}{Parameters}
{\em other} & the range to copy the data from \\
\hline
\end{DoxyParams}
\Hypertarget{classgko_1_1range_aa123ae2beed0437d501e2dbde8177c18}\index{gko::range$<$ Accessor $>$@{gko::range$<$ Accessor $>$}!operator=@{operator=}}
\index{operator=@{operator=}!gko::range$<$ Accessor $>$@{gko::range$<$ Accessor $>$}}
\doxysubsubsection{\texorpdfstring{operator=()}{operator=()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}}
{\footnotesize\ttfamily \label{classgko_1_1range_aa123ae2beed0437d501e2dbde8177c18} 
template$<$typename Accessor$>$ \\
template$<$typename Other\+Accessor$>$ \\
const \doxymbox{\hyperlink{classgko_1_1range_aede7a11a0eef2b73cabe44c9c2ad8246}{range}} \& \doxymbox{\hyperlink{classgko_1_1range}{gko::\+range}}$<$ Accessor $>$::\+operator= (\begin{DoxyParamCaption}\item[{const \doxymbox{\hyperlink{classgko_1_1range_aede7a11a0eef2b73cabe44c9c2ad8246}{range}}$<$ Other\+Accessor $>$ \&}]{other}{}\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}}





This is a version of the function which allows to copy between ranges of different accessors.


\begin{DoxyTemplParams}{Template Parameters}
{\em Other\+Accessor} & accessor of the other range \\
\hline
\end{DoxyTemplParams}


The documentation for this class was generated from the following file:\+\begin{DoxyCompactItemize}
\item 
ginkgo/\+core/\+base/\+range.\+hpp\end{DoxyCompactItemize}
