From 02ffbc311a68c8a8bb72efde30fb326cf3067174 Mon Sep 17 00:00:00 2001 From: Max Kahnt <max.kahnt@fu-berlin.de> Date: Sat, 30 Sep 2017 15:06:33 +0200 Subject: [PATCH] Add trait utilities. --- dune/matrix-vector/traitutilities.hh | 79 ++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 dune/matrix-vector/traitutilities.hh diff --git a/dune/matrix-vector/traitutilities.hh b/dune/matrix-vector/traitutilities.hh new file mode 100644 index 0000000..7be1950 --- /dev/null +++ b/dune/matrix-vector/traitutilities.hh @@ -0,0 +1,79 @@ +#ifndef DUNE_MATRIX_VECTOR_TRAITUTILITIES_HH +#define DUNE_MATRIX_VECTOR_TRAITUTILITIES_HH + +#include <type_traits> + +#include <dune/common/std/type_traits.hh> +#include <dune/common/typetraits.hh> + +#include <dune/matrix-vector/concepts.hh> +#include <dune/matrix-vector/scalartraits.hh> +#include <dune/matrix-vector/matrixtraits.hh> +#include <dune/matrix-vector/vectortraits.hh> + +namespace Dune { +namespace MatrixVector { + +// convenience compile-time functions to classify types +template <class T> +constexpr auto isNumber() { + return Std::bool_constant<IsNumber<T>::value>(); +} + +template <class T> +constexpr auto isScalar() { + return Std::bool_constant<ScalarTraits<T>::isScalar>(); +} + +template <class T> +constexpr auto isVector() { + return Std::bool_constant<VectorTraits<T>::isVector>(); +} + +template <class T> +constexpr auto isMatrix() { + return Std::bool_constant<MatrixTraits<T>::isMatrix>(); +} + +template <class T> +constexpr auto isTupleOrDerived() { + return Std::bool_constant<IsTupleOrDerived<std::decay_t<T>>::value>(); +} + +// enable_if typedefs for traits ... +template <class T> +using EnableNumber = std::enable_if_t<isNumber<T>()>; + +template <class T> +using EnableScalar = std::enable_if_t<isScalar<T>()>; + +template <class T> +using EnableVector = std::enable_if_t<isVector<T>()>; + +template <class T> +using EnableMatrix = std::enable_if_t<isMatrix<T>()>; + +// ... and their negations +template <class T> +using DisableNumber = std::enable_if_t<not isNumber<T>()>; + +template <class T> +using DisableScalar = std::enable_if_t<not isScalar<T>()>; + +template <class T> +using DisableVector = std::enable_if_t<not isVector<T>()>; + +template <class T> +using DisableMatrix = std::enable_if_t<not isMatrix<T>()>; + +// compile-time property checks +template <class T> +constexpr auto isSparseRangeIterable() { + return Std::bool_constant<isTupleOrDerived<T>() or + models<Concept::HasBegin, T>()>(); +} + +} // end namespace MatrixVector +} // end namespace Dune + +#endif // DUNE_MATRIX_VECTOR_TRAITUTILITIES_HH -- GitLab