#ifndef GRID_MATH_TRAITS_H #define GRID_MATH_TRAITS_H #include namespace Grid { ////////////////////////////////////////////////////////////////////////////////// // Want to recurse: GridTypeMapper >::scalar_type == ComplexD. // Use of a helper class like this allows us to template specialise and "dress" // other classes such as RealD == double, ComplexD == std::complex with these // traits. // // It is possible that we could do this more elegantly if I introduced a // queryable trait in iScalar, iMatrix and iVector and used the query on vtype in // place of the type mapper? // // Not sure how to do this, but probably could be done with a research effort // to study C++11's type_traits.h file. (std::enable_if >) // ////////////////////////////////////////////////////////////////////////////////// template class GridTypeMapper { public: typedef typename T::scalar_type scalar_type; typedef typename T::vector_type vector_type; typedef typename T::tensor_reduced tensor_reduced; typedef typename T::scalar_object scalar_object; typedef typename T::Complexified Complexified; typedef typename T::Realified Realified; enum { TensorLevel = T::TensorLevel }; }; ////////////////////////////////////////////////////////////////////////////////// // Recursion stops with these template specialisations ////////////////////////////////////////////////////////////////////////////////// template<> class GridTypeMapper { public: typedef RealF scalar_type; typedef RealF vector_type; typedef RealF tensor_reduced ; typedef RealF scalar_object; typedef ComplexF Complexified; typedef RealF Realified; enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef RealD scalar_type; typedef RealD vector_type; typedef RealD tensor_reduced; typedef RealD scalar_object; typedef ComplexD Complexified; typedef RealD Realified; enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef ComplexF scalar_type; typedef ComplexF vector_type; typedef ComplexF tensor_reduced; typedef ComplexF scalar_object; typedef ComplexF Complexified; typedef RealF Realified; enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef ComplexD scalar_type; typedef ComplexD vector_type; typedef ComplexD tensor_reduced; typedef ComplexD scalar_object; typedef ComplexD Complexified; typedef RealD Realified; enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef Integer scalar_type; typedef Integer vector_type; typedef Integer tensor_reduced; typedef Integer scalar_object; typedef void Complexified; typedef void Realified; enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef RealF scalar_type; typedef vRealF vector_type; typedef vRealF tensor_reduced; typedef RealF scalar_object; typedef vComplexF Complexified; typedef vRealF Realified; enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef RealD scalar_type; typedef vRealD vector_type; typedef vRealD tensor_reduced; typedef RealD scalar_object; typedef vComplexD Complexified; typedef vRealD Realified; enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef ComplexF scalar_type; typedef vComplexF vector_type; typedef vComplexF tensor_reduced; typedef ComplexF scalar_object; typedef vComplexF Complexified; typedef vRealF Realified; enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef ComplexD scalar_type; typedef vComplexD vector_type; typedef vComplexD tensor_reduced; typedef ComplexD scalar_object; typedef vComplexD Complexified; typedef vRealD Realified; enum { TensorLevel = 0 }; }; template<> class GridTypeMapper { public: typedef Integer scalar_type; typedef vInteger vector_type; typedef vInteger tensor_reduced; typedef Integer scalar_object; typedef void Complexified; typedef void Realified; enum { TensorLevel = 0 }; }; // First some of my own traits template struct isGridTensor { static const bool value = true; static const bool notvalue = false; }; template<> struct isGridTensor { static const bool value = false; static const bool notvalue = true; }; template<> struct isGridTensor { static const bool value = false; static const bool notvalue = true; }; template<> struct isGridTensor { static const bool value = false; static const bool notvalue = true; }; template<> struct isGridTensor { static const bool value = false; static const bool notvalue = true; }; template<> struct isGridTensor { static const bool value = false; static const bool notvalue = true; }; template<> struct isGridTensor { static const bool value = false; static const bool notvalue = true; }; template<> struct isGridTensor { static const bool value = false; static const bool notvalue = true; }; template<> struct isGridTensor { static const bool value = false; static const bool notvalue = true; }; template<> struct isGridTensor { static const bool value = false; static const bool notvalue = true; }; template<> struct isGridTensor { static const bool value = false; static const bool notvalue = true; }; template<> struct isGridTensor { static const bool value = false; static const bool notvalue = true; }; // Match the index template struct matchGridTensorIndex { static const bool value = (Level==T::TensorLevel); static const bool notvalue = (Level!=T::TensorLevel); }; // What is the vtype template struct isComplex { static const bool value = false; }; template<> struct isComplex { static const bool value = true; }; template<> struct isComplex { static const bool value = true; }; } #endif