mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
improve isPodLike to know that all non-class types are pod.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@91425 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
729a8acc9f
commit
dc2e570411
@ -46,6 +46,13 @@ namespace std {
|
||||
|
||||
namespace llvm {
|
||||
|
||||
/// SmallVectorBase - This is all the non-templated stuff common to all
|
||||
/// SmallVectors.
|
||||
class SmallVectorBase {
|
||||
|
||||
};
|
||||
|
||||
|
||||
/// SmallVectorImpl - This class consists of common code factored out of the
|
||||
/// SmallVector class to reduce code duplication based on the SmallVector 'N'
|
||||
/// template parameter.
|
||||
|
@ -25,33 +25,6 @@
|
||||
// works with VC7.0, but other interactions seem to fail when we use it.
|
||||
|
||||
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
|
||||
{
|
||||
@ -77,6 +50,23 @@ struct is_class
|
||||
public:
|
||||
enum { value = sizeof(char) == sizeof(dont_use::is_class_helper<T>(0)) };
|
||||
};
|
||||
|
||||
|
||||
/// 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 {
|
||||
// If we don't know anything else, we can (at least) assume that all non-class
|
||||
// types are PODs.
|
||||
static const bool value = !is_class<T>::value;
|
||||
};
|
||||
|
||||
// std::pair's 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;
|
||||
};
|
||||
|
||||
|
||||
/// \brief Metafunction that determines whether the two given types are
|
||||
/// equivalent.
|
||||
|
Loading…
Reference in New Issue
Block a user