diff options
author | Chris Lattner <sabre@nondot.org> | 2007-01-27 07:52:27 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-01-27 07:52:27 +0000 |
commit | af3056c97e56106af7c3b9a5c856d1dc1d21e358 (patch) | |
tree | 69a775bef848cdd39cf84756633e9ed21e6c1294 /include/llvm/ADT/SmallPtrSet.h | |
parent | 18b69106b7a66ac6abde37d1be6d0d952796ed04 (diff) | |
download | external_llvm-af3056c97e56106af7c3b9a5c856d1dc1d21e358.zip external_llvm-af3056c97e56106af7c3b9a5c856d1dc1d21e358.tar.gz external_llvm-af3056c97e56106af7c3b9a5c856d1dc1d21e358.tar.bz2 |
Fix a limitation of SmallPtrSet. Before it would assert if the smallsize
was not a power of two. Now it rounds up to the next power of two internally.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33580 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/ADT/SmallPtrSet.h')
-rw-r--r-- | include/llvm/ADT/SmallPtrSet.h | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/include/llvm/ADT/SmallPtrSet.h b/include/llvm/ADT/SmallPtrSet.h index d617d6b..d2a68ff 100644 --- a/include/llvm/ADT/SmallPtrSet.h +++ b/include/llvm/ADT/SmallPtrSet.h @@ -161,13 +161,41 @@ public: } }; +/// NextPowerOfTwo - This is a helper template that rounds N up to the next +/// power of two. +template<unsigned N> +struct NextPowerOfTwo; + +/// NextPowerOfTwoH - If N is not a power of two, increase it. This is a helper +/// template used to implement NextPowerOfTwo. +template<unsigned N, bool isPowerTwo> +struct NextPowerOfTwoH { + enum { Val = N }; +}; +template<unsigned N> +struct NextPowerOfTwoH<N, false> { + enum { + // We could just use NextVal = N+1, but this converges faster. N|(N-1) sets + // the right-most zero bits to one all at once, e.g. 0b0011000 -> 0b0011111. + NextVal = (N|(N-1)) + 1, + Val = NextPowerOfTwo<NextVal>::Val + }; +}; + +template<unsigned N> +struct NextPowerOfTwo { + enum { Val = NextPowerOfTwoH<N, (N&(N-1)) == 0>::Val }; +}; + /// SmallPtrSet - This class implements template<class PtrType, unsigned SmallSize> class SmallPtrSet : public SmallPtrSetImpl { - void *SmallArray[SmallSize]; + // Make sure that SmallSize is a power of two, round up if not. + enum { SmallSizePowTwo = NextPowerOfTwo<SmallSize>::Val }; + void *SmallArray[SmallSizePowTwo]; public: - SmallPtrSet() : SmallPtrSetImpl(SmallSize) {} + SmallPtrSet() : SmallPtrSetImpl(NextPowerOfTwo<SmallSizePowTwo>::Val) {} typedef SmallPtrSetIterator<PtrType> iterator; typedef SmallPtrSetIterator<PtrType> const_iterator; |