rename PointerLikeTypeInto to PointerLikeTypeTraits, add trait for

# low bits free, and move to its own header.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67973 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-03-29 00:39:30 +00:00
parent 6a0dcc1077
commit 8ee1b5e916
3 changed files with 67 additions and 29 deletions

View File

@ -22,7 +22,7 @@ namespace llvm {
template<typename T> template<typename T>
struct DenseMapInfo; struct DenseMapInfo;
template<typename> template<typename>
class PointerLikeTypeInfo; class PointerLikeTypeTraits;
/// PointerIntPair - This class implements a pair of a pointer and small /// PointerIntPair - This class implements a pair of a pointer and small
/// integer. It is designed to represent this in the space required by one /// integer. It is designed to represent this in the space required by one
@ -97,7 +97,7 @@ struct DenseMapInfo<PointerIntPair<PointerTy, IntBits, IntType> > {
// Teach SmallPtrSet that PointerIntPair is "basically a pointer". // Teach SmallPtrSet that PointerIntPair is "basically a pointer".
template<typename PointerTy, unsigned IntBits, typename IntType> template<typename PointerTy, unsigned IntBits, typename IntType>
class PointerLikeTypeInfo<PointerIntPair<PointerTy, IntBits, IntType> > { class PointerLikeTypeTraits<PointerIntPair<PointerTy, IntBits, IntType> > {
public: public:
static inline void * static inline void *
getAsVoidPointer(const PointerIntPair<PointerTy, IntBits, IntType> &P) { getAsVoidPointer(const PointerIntPair<PointerTy, IntBits, IntType> &P) {
@ -107,6 +107,7 @@ public:
getFromVoidPointer(void *P) { getFromVoidPointer(void *P) {
return PointerIntPair<PointerTy, IntBits, IntType>::getFromOpaqueValue(P); return PointerIntPair<PointerTy, IntBits, IntType>::getFromOpaqueValue(P);
} }
static inline unsigned getNumLowBitsAvailable() { return 0; }
}; };
} // end namespace llvm } // end namespace llvm

View File

@ -18,33 +18,9 @@
#include <cassert> #include <cassert>
#include <cstring> #include <cstring>
#include "llvm/Support/DataTypes.h" #include "llvm/Support/DataTypes.h"
#include "llvm/Support/PointerLikeTypeTraits.h"
namespace llvm { namespace llvm {
/// PointerLikeTypeInfo - This is a traits object that is used to handle pointer
/// types and things that are just wrappers for pointers as a uniform entity.
template <typename T>
class PointerLikeTypeInfo {
//getAsVoidPointer/getFromVoidPointer
};
// Provide PointerLikeTypeInfo for all pointers.
template<typename T>
class PointerLikeTypeInfo<T*> {
public:
static inline void *getAsVoidPointer(T* P) { return P; }
static inline T *getFromVoidPointer(void *P) {
return static_cast<T*>(P);
}
};
template<typename T>
class PointerLikeTypeInfo<const T*> {
public:
static inline const void *getAsVoidPointer(const T* P) { return P; }
static inline const T *getFromVoidPointer(const void *P) {
return static_cast<const T*>(P);
}
};
class SmallPtrSetIteratorImpl; class SmallPtrSetIteratorImpl;
@ -193,7 +169,7 @@ protected:
/// SmallPtrSetIterator - This implements a const_iterator for SmallPtrSet. /// SmallPtrSetIterator - This implements a const_iterator for SmallPtrSet.
template<typename PtrTy> template<typename PtrTy>
class SmallPtrSetIterator : public SmallPtrSetIteratorImpl { class SmallPtrSetIterator : public SmallPtrSetIteratorImpl {
typedef PointerLikeTypeInfo<PtrTy> PtrTraits; typedef PointerLikeTypeTraits<PtrTy> PtrTraits;
public: public:
explicit SmallPtrSetIterator(const void *const *BP) explicit SmallPtrSetIterator(const void *const *BP)
: SmallPtrSetIteratorImpl(BP) {} : SmallPtrSetIteratorImpl(BP) {}
@ -250,7 +226,7 @@ class SmallPtrSet : public SmallPtrSetImpl {
// Make sure that SmallSize is a power of two, round up if not. // Make sure that SmallSize is a power of two, round up if not.
enum { SmallSizePowTwo = NextPowerOfTwo<SmallSize>::Val }; enum { SmallSizePowTwo = NextPowerOfTwo<SmallSize>::Val };
void *SmallArray[SmallSizePowTwo]; void *SmallArray[SmallSizePowTwo];
typedef PointerLikeTypeInfo<PtrType> PtrTraits; typedef PointerLikeTypeTraits<PtrType> PtrTraits;
public: public:
SmallPtrSet() : SmallPtrSetImpl(NextPowerOfTwo<SmallSizePowTwo>::Val) {} SmallPtrSet() : SmallPtrSetImpl(NextPowerOfTwo<SmallSizePowTwo>::Val) {}
SmallPtrSet(const SmallPtrSet &that) : SmallPtrSetImpl(that) {} SmallPtrSet(const SmallPtrSet &that) : SmallPtrSetImpl(that) {}

View File

@ -0,0 +1,61 @@
//===- llvm/Support/PointerLikeTypeTraits.h - Pointer Traits ----*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines the PointerLikeTypeTraits class. This allows data
// structures to reason about pointers and other things that are pointer sized.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_SUPPORT_POINTERLIKETYPETRAITS_H
#define LLVM_SUPPORT_POINTERLIKETYPETRAITS_H
namespace llvm {
/// PointerLikeTypeTraits - This is a traits object that is used to handle
/// pointer types and things that are just wrappers for pointers as a uniform
/// entity.
template <typename T>
class PointerLikeTypeTraits {
// getAsVoidPointer
// getFromVoidPointer
// getNumLowBitsAvailable
};
// Provide PointerLikeTypeTraits for non-cvr pointers.
template<typename T>
class PointerLikeTypeTraits<T*> {
public:
static inline void *getAsVoidPointer(T* P) { return P; }
static inline T *getFromVoidPointer(void *P) {
return static_cast<T*>(P);
}
/// Note, we assume here that malloc returns objects at least 8-byte aligned.
/// However, this may be wrong, or pointers may be from something other than
/// malloc. In this case, you should specialize this template to reduce this.
///
/// All clients should use assertions to do a run-time check to ensure that
/// this is actually true.
static inline unsigned getNumLowBitsAvailable() { return 3; }
};
// Provide PointerLikeTypeTraits for const pointers.
template<typename T>
class PointerLikeTypeTraits<const T*> {
public:
static inline const void *getAsVoidPointer(const T* P) { return P; }
static inline const T *getFromVoidPointer(const void *P) {
return static_cast<const T*>(P);
}
static inline unsigned getNumLowBitsAvailable() { return 3; }
};
} // end namespace llvm
#endif