diff --git a/common/typetraits.hh b/common/typetraits.hh index d7ff65c10dba20627ace20669a61514ba63e9bbc..ca21fa8870989628ca443e4bf8962a0218b572db 100644 --- a/common/typetraits.hh +++ b/common/typetraits.hh @@ -17,6 +17,52 @@ namespace Dune * * @{ */ + + /** + * @brief Just an empty class + */ + struct Empty {}; + + /** + * @brief General type traits class to check whether type is reference or + * pointer type + */ + template <typename T> + class TypeTraits + { + private: + template <class U> + struct PointerTraits { + enum { result = false }; + typedef Empty PointeeType; + }; + + template <class U> + struct PointerTraits<U*> { + enum { result = true }; + typedef U PointeeType; + }; + + template <class U> struct ReferenceTraits + { + enum { result = false }; + typedef U ReferredType; + }; + + template <class U> struct ReferenceTraits<U&> + { + enum { result = true }; + typedef U ReferredType; + }; + + public: + enum { isPointer = PointerTraits<T>::result }; + typedef typename PointerTraits<T>::PointeeType PointeeType; + + enum { isReference = ReferenceTraits<T>::result }; + typedef typename ReferenceTraits<T>::ReferredType ReferredType; + }; + /** * @brief Determines wether a type is const or volatile and provides the * unqualified types.