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