diff --git a/dune/xt/common/type_traits.hh b/dune/xt/common/type_traits.hh index 3c8854b11121ff3478dbce8bf1a7fd4c78ec028d..1496b76a008ca4b9807e64cbebf9765113f866c1 100644 --- a/dune/xt/common/type_traits.hh +++ b/dune/xt/common/type_traits.hh @@ -9,20 +9,16 @@ #ifndef DUNE_XT_COMMON_TYPENAMES_HH #define DUNE_XT_COMMON_TYPENAMES_HH +#ifdef __GNUC__ +#include <cxxabi.h> +#endif + #include <complex> #include <memory> #include <type_traits> -#include <dune/common/version.hh> - -// static_assert/AlwaysFalse redirect to avoid warnings -#if DUNE_VERSION_NEWER(DUNE_COMMON, 2, 4) // post 2.3 release #include <dune/common/typetraits.hh> -#else -#include <dune/common/static_assert.hh> -#endif -#include <dune/xt/common/color.hh> /** use this to define Typename specializations in the GLOBAL namespace ONLY **/ #define DUNE_XT_COMMON_TYPENAME(NAME) \ @@ -41,10 +37,12 @@ } \ } + namespace Dune { namespace XT { namespace Common { + inline std::string demangle_typename(const std::string& mangled_name) { #ifdef __GNUC__ @@ -54,6 +52,7 @@ inline std::string demangle_typename(const std::string& mangled_name) #endif // ifdef __GNUC__ } + //! demangles typeid template <class T> std::string demangled_type_id(T& obj) @@ -61,6 +60,7 @@ std::string demangled_type_id(T& obj) return demangle_typename(typeid(obj).name()); } // demangled_type_id + //! create output for demangled typeid template <class T> void real_type_id(T& obj, std::string name = "", size_t maxlevel = 10000) @@ -69,6 +69,7 @@ void real_type_id(T& obj, std::string name = "", size_t maxlevel = 10000) << std::endl; } + //! an extensible mechanism to assign "cleartext" names to types template <typename T> struct Typename @@ -89,6 +90,7 @@ std::string get_typename(const T&) return Typename<T>::value(); } + template <class T, class Ptr = void> struct is_smart_ptr { @@ -117,6 +119,7 @@ struct is_smart_ptr<T, typename std::enable_if<std::is_same<std::weak_ptr<typena typedef T type; }; + template <class T, class = void> struct PtrCaller { @@ -135,6 +138,7 @@ struct PtrCaller<T, typename std::enable_if<is_smart_ptr<T>::value || std::is_po } }; + //! workaround for gcc 4.7 missing underlying type, via //! https://stackoverflow.com/questions/9343329/how-to-know-underlying-type-of-class-enum/10956467#10956467 template <class T> @@ -148,6 +152,7 @@ struct underlying_type #endif }; + //! gcc < 4.8 fires a static-assert if std::hash< T > () isn't implemented #if __GNUC__ == 4 && (__GNUC_MINOR__ < 8) template <typename> @@ -168,12 +173,26 @@ struct is_hashable<T, typename std::enable_if<!!sizeof(std::declval<std::hash<T> }; #endif + +template <class T> +struct is_complex : public std::false_type +{ +}; + +template <class T> +struct is_complex<std::complex<T>> : public std::true_type +{ +}; + + } // namespace Common } // namespace XT } // namespace Dune + /** * \brief Helper macro to be used before DXTC_has_typedef. + * \see DXTC_has_typedef * * Taken from * http://stackoverflow.com/questions/7834226/detecting-typedef-at-compile-time-template-metaprogramming @@ -252,6 +271,7 @@ DXTC_has_static_member(bar)< Foo >::value */ #define DXTC_has_static_member(mmbr) DXTC_has_static_member_helper_##mmbr + DUNE_XT_COMMON_TYPENAME(int) DUNE_XT_COMMON_TYPENAME(double) DUNE_XT_COMMON_TYPENAME(float) @@ -260,33 +280,5 @@ DUNE_XT_COMMON_TYPENAME(unsigned int) DUNE_XT_COMMON_TYPENAME(unsigned long) DUNE_XT_COMMON_TYPENAME(char) -namespace Dune { -namespace XT { -namespace Common { -namespace internal { - -template <class Tt> -struct is_complex_helper -{ - DXTC_has_typedef_initialize_once(value_type); - - static const bool is_candidate = DXTC_has_typedef(value_type)<Tt>::value; -}; // class is_complex_helper - -} // namespace internal - -template <class T, bool candidate = internal::is_complex_helper<T>::is_candidate> -struct is_complex : public std::is_base_of<std::complex<typename T::value_type>, T> -{ -}; - -template <class T> -struct is_complex<T, false> : public std::false_type -{ -}; - -} // namespace Common -} // namespace XT -} // namespace Dune #endif // DUNE_XT_COMMON_TYPENAMES_HH