Teuchos - Trilinos Tools Package Version of the Day
Loading...
Searching...
No Matches
Teuchos_TypeNameTraits.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Teuchos: Common Tools Package
4//
5// Copyright 2004 NTESS and the Teuchos contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
10#ifndef _TEUCHOS_TYPE_NAME_TRAITS_HPP_
11#define _TEUCHOS_TYPE_NAME_TRAITS_HPP_
12
18// mfh 30 Jan 2013: Thanks to Jim Willenbring for reporting this, and
19// to Mike Glass and Paul Lin for updating the fix for dealing with a
20// bug in IBM's XL C++ compiler. The update was necessary due to a
21// relapse of the bug in a newer version of the compiler.
22//
23// If you don't have this update, you can fix the problem by defining
24// the macro TEUCHOS_TYPE_NAME_TRAITS_OLD_IBM when compiling anything
25// that includes this header file. If you have the current version of
26// this file, then you don't need to do anything.
27#if defined(__IBMCPP__) && ( __IBMCPP__ < 900 || __IBMCPP__ == 1210 )
28# define TEUCHOS_TYPE_NAME_TRAITS_OLD_IBM
29#endif
30
31#include <typeinfo>
32
34
35namespace Teuchos {
36
37
45TEUCHOSCORE_LIB_DLL_EXPORT std::string demangleName( const std::string &mangledName );
46
47
52template<typename T>
54public:
56 static std::string name()
57 {
58 return demangleName(typeid(T).name());
59 }
61#ifndef TEUCHOS_TYPE_NAME_TRAITS_OLD_IBM
62 static std::string concreteName( const T& t )
63#else
64 // the IBM compilers on AIX have a problem with const
65 static std::string concreteName( T t )
66#endif
67 {
68 return demangleName(typeid(t).name());
69 }
70};
71
72
82template<typename T>
83std::string typeName( const T &t )
84{
85 typedef typename std::remove_const_t<T> ncT;
86#ifndef TEUCHOS_TYPE_NAME_TRAITS_OLD_IBM
88#else
89 // You can't pass general objects to AIX by value as above. This means that
90 // you will not get the concrete name printed on AIX but that is life on
91 // such compilers.
93#endif
94}
95
96
105template<typename T>
106std::string concreteTypeName( const T &t )
107{
108 typedef typename std::remove_const_t<T> ncT;
110}
111
112
113#define TEUCHOS_TYPE_NAME_TRAITS_BUILTIN_TYPE_SPECIALIZATION(TYPE) \
114template<> \
115class TypeNameTraits<TYPE> { \
116public: \
117 static std::string name() { return (#TYPE); } \
118 static std::string concreteName(const TYPE&) { return name(); } \
119} \
120
121TEUCHOS_TYPE_NAME_TRAITS_BUILTIN_TYPE_SPECIALIZATION(bool);
122TEUCHOS_TYPE_NAME_TRAITS_BUILTIN_TYPE_SPECIALIZATION(char);
123TEUCHOS_TYPE_NAME_TRAITS_BUILTIN_TYPE_SPECIALIZATION(signed char);
124TEUCHOS_TYPE_NAME_TRAITS_BUILTIN_TYPE_SPECIALIZATION(unsigned char);
125TEUCHOS_TYPE_NAME_TRAITS_BUILTIN_TYPE_SPECIALIZATION(short int);
126TEUCHOS_TYPE_NAME_TRAITS_BUILTIN_TYPE_SPECIALIZATION(int);
127TEUCHOS_TYPE_NAME_TRAITS_BUILTIN_TYPE_SPECIALIZATION(long int);
128TEUCHOS_TYPE_NAME_TRAITS_BUILTIN_TYPE_SPECIALIZATION(unsigned short int);
129TEUCHOS_TYPE_NAME_TRAITS_BUILTIN_TYPE_SPECIALIZATION(unsigned int);
130TEUCHOS_TYPE_NAME_TRAITS_BUILTIN_TYPE_SPECIALIZATION(unsigned long int);
131TEUCHOS_TYPE_NAME_TRAITS_BUILTIN_TYPE_SPECIALIZATION(float);
132TEUCHOS_TYPE_NAME_TRAITS_BUILTIN_TYPE_SPECIALIZATION(double);
133
134#ifdef HAVE_TEUCHOSCORE_QUADMATH
135TEUCHOS_TYPE_NAME_TRAITS_BUILTIN_TYPE_SPECIALIZATION(__float128);
136#endif // HAVE_TEUCHOSCORE_QUADMATH
137
138#ifdef HAVE_TEUCHOS_LONG_DOUBLE
139TEUCHOS_TYPE_NAME_TRAITS_BUILTIN_TYPE_SPECIALIZATION(long double);
140#endif // HAVE_TEUCHOS_LONG_DOUBLE
141
142template<typename T>
143class TEUCHOSCORE_LIB_DLL_EXPORT TypeNameTraits<T*> {
144public:
145 typedef T* T_ptr;
146 static std::string name() { return TypeNameTraits<T>::name() + "*"; }
147 static std::string concreteName(T_ptr) { return name(); }
148};
149
150
151template<>
152class TEUCHOSCORE_LIB_DLL_EXPORT TypeNameTraits<std::string> {
153public:
154 static std::string name() { return "string"; }
155 static std::string concreteName(const std::string&)
156 { return name(); }
157};
158
159
160template<>
161class TEUCHOSCORE_LIB_DLL_EXPORT TypeNameTraits<void*> {
162public:
163 static std::string name() { return "void*"; }
164 static std::string concreteName(const std::string&) { return name(); }
165};
166
167// mfh 31 Jul 2012: Specialization for "void" will hopefully fix
168// compile errors on Windows, such as the following:
169//
170// http://testing.sandia.gov/cdash/viewBuildError.php?buildid=611137
171//
172// I'm imitating the specialization of void* above.
173template<>
174class TEUCHOSCORE_LIB_DLL_EXPORT TypeNameTraits<void> {
175public:
176 static std::string name() { return "void"; }
177 static std::string concreteName(const std::string&) { return name(); }
178};
179
180
181#ifdef HAVE_TEUCHOS_COMPLEX
182
183
184template<typename T>
185class TEUCHOSCORE_LIB_DLL_EXPORT TypeNameTraits<std::complex<T> > {
186public:
187 static std::string name()
188 { return "complex<"+TypeNameTraits<T>::name()+">"; }
189 static std::string concreteName(const std::complex<T>&)
190 { return name(); }
191};
192
193
194#endif // HAVE_TEUCHOS_COMPLEX
195
196
197
198} // namespace Teuchos
199
200
201#endif // _TEUCHOS_TYPE_NAME_TRAITS_HPP_
Teuchos header file which uses auto-configuration information to include necessary C++ headers.
Smart reference counting pointer class for automatic garbage collection.
Default traits class that just returns typeid(T).name().
static std::string concreteName(const T &t)
std::string typeName(const T &t)
Template function for returning the concrete type name of a passed-in object.
std::string concreteTypeName(const T &t)
Template function for returning the type name of the actual concrete name of a passed-in object.
TEUCHOSCORE_LIB_DLL_EXPORT std::string demangleName(const std::string &mangledName)
Demangle a C++ name if valid.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...