From: Chris Lattner Date: Sat, 28 Mar 2009 07:44:53 +0000 (+0000) Subject: add a traits class for SmallPtrSet that allows us to stick things that are X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=6de603071879bdc5d7d663826354c24a9d176469;p=oota-llvm.git add a traits class for SmallPtrSet that allows us to stick things that are "basically pointers" into it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67930 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ADT/SmallPtrSet.h b/include/llvm/ADT/SmallPtrSet.h index db1583424bf..1818a11a9da 100644 --- a/include/llvm/ADT/SmallPtrSet.h +++ b/include/llvm/ADT/SmallPtrSet.h @@ -20,6 +20,29 @@ #include "llvm/Support/DataTypes.h" 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 +class PointerLikeTypeInfo { + //getAsVoidPointer/getFromVoidPointer +}; + +// Provide PointerLikeTypeInfo for all pointers. +template +struct PointerLikeTypeInfo { + static inline void *getAsVoidPointer(T* P) { return P; } + static inline T *getFromVoidPointer(void *P) { + return static_cast(P); + } +}; +template +struct PointerLikeTypeInfo { + static inline const void *getAsVoidPointer(const T* P) { return P; } + static inline const T *getFromVoidPointer(const void *P) { + return static_cast(P); + } +}; class SmallPtrSetIteratorImpl; @@ -168,6 +191,7 @@ protected: /// SmallPtrSetIterator - This implements a const_iterator for SmallPtrSet. template class SmallPtrSetIterator : public SmallPtrSetIteratorImpl { + typedef PointerLikeTypeInfo PtrTraits; public: explicit SmallPtrSetIterator(const void *const *BP) : SmallPtrSetIteratorImpl(BP) {} @@ -175,7 +199,7 @@ public: // Most methods provided by baseclass. const PtrTy operator*() const { - return static_cast(const_cast(*Bucket)); + return PtrTraits::getFromVoidPointer(const_cast(*Bucket)); } inline SmallPtrSetIterator& operator++() { // Preincrement @@ -213,7 +237,7 @@ template struct NextPowerOfTwo { enum { Val = NextPowerOfTwoH::Val }; }; - + /// SmallPtrSet - This class implements a set which is optimizer for holding /// SmallSize or less elements. This internally rounds up SmallSize to the next @@ -224,6 +248,7 @@ class SmallPtrSet : public SmallPtrSetImpl { // Make sure that SmallSize is a power of two, round up if not. enum { SmallSizePowTwo = NextPowerOfTwo::Val }; void *SmallArray[SmallSizePowTwo]; + typedef PointerLikeTypeInfo PtrTraits; public: SmallPtrSet() : SmallPtrSetImpl(NextPowerOfTwo::Val) {} SmallPtrSet(const SmallPtrSet &that) : SmallPtrSetImpl(that) {} @@ -236,14 +261,20 @@ public: /// insert - This returns true if the pointer was new to the set, false if it /// was already in the set. - bool insert(PtrType Ptr) { return insert_imp(Ptr); } + bool insert(PtrType Ptr) { + return insert_imp(PtrTraits::getAsVoidPointer(Ptr)); + } /// erase - If the set contains the specified pointer, remove it and return /// true, otherwise return false. - bool erase(PtrType Ptr) { return erase_imp(Ptr); } + bool erase(PtrType Ptr) { + return erase_imp(PtrTraits::getAsVoidPointer(Ptr)); + } /// count - Return true if the specified pointer is in the set. - bool count(PtrType Ptr) const { return count_imp(Ptr); } + bool count(PtrType Ptr) const { + return count_imp(PtrTraits::getAsVoidPointer(Ptr)); + } template void insert(IterT I, IterT E) {