aboutsummaryrefslogtreecommitdiffstats
path: root/include/llvm/Support/type_traits.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/llvm/Support/type_traits.h')
-rw-r--r--include/llvm/Support/type_traits.h29
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