diff options
Diffstat (limited to 'include/llvm/Support/type_traits.h')
-rw-r--r-- | include/llvm/Support/type_traits.h | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/include/llvm/Support/type_traits.h b/include/llvm/Support/type_traits.h index ce916b5..1f3f1e4 100644 --- a/include/llvm/Support/type_traits.h +++ b/include/llvm/Support/type_traits.h @@ -17,6 +17,8 @@ #ifndef LLVM_SUPPORT_TYPE_TRAITS_H #define LLVM_SUPPORT_TYPE_TRAITS_H +#include <utility> + // This is actually the conforming implementation which works with abstract // classes. However, enough compilers have trouble with it that most will use // the one in boost/type_traits/object_traits.hpp. This implementation actually @@ -24,6 +26,33 @@ namespace llvm { +/// isPodLike - This is a type trait that is used to determine whether a given +/// type can be copied around with memcpy instead of running ctors etc. +template <typename T> +struct isPodLike { + static const bool value = false; +}; + +// pointers are all pod-like. +template <typename T> +struct isPodLike<T*> { static const bool value = true; }; + +// builtin types are pod-like as well. +// There is probably a much better way to do this. +template <> struct isPodLike<char> { static const bool value = true; }; +template <> struct isPodLike<unsigned> { static const bool value = true; }; +template <> struct isPodLike<unsigned long> { static const bool value = true; }; +template <> struct isPodLike<unsigned long long> { + static const bool value = true; +}; + + +// pairs are pod-like if their elements are. +template<typename T, typename U> +struct isPodLike<std::pair<T, U> > { + static const bool value = isPodLike<T>::value & isPodLike<U>::value; +}; + namespace dont_use { // These two functions should never be used. They are helpers to |