diff options
author | Chris Lattner <sabre@nondot.org> | 2007-01-27 07:59:10 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-01-27 07:59:10 +0000 |
commit | 39ab70cf80d56157ac25202932c4c5cc63ef7f72 (patch) | |
tree | e9907872a3a47cf6a60e69cc3af8f5cfdd9c71dd /llvm/lib/Support/SmallPtrSet.cpp | |
parent | 030a2dcc1edf89eb86bdfcd9e4f821fa9d3c6334 (diff) | |
download | llvm-39ab70cf80d56157ac25202932c4c5cc63ef7f72.zip llvm-39ab70cf80d56157ac25202932c4c5cc63ef7f72.tar.gz llvm-39ab70cf80d56157ac25202932c4c5cc63ef7f72.tar.bz2 |
implement SmallPtrSet::erase
llvm-svn: 33581
Diffstat (limited to 'llvm/lib/Support/SmallPtrSet.cpp')
-rw-r--r-- | llvm/lib/Support/SmallPtrSet.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/llvm/lib/Support/SmallPtrSet.cpp b/llvm/lib/Support/SmallPtrSet.cpp index 48552a5..1eea727 100644 --- a/llvm/lib/Support/SmallPtrSet.cpp +++ b/llvm/lib/Support/SmallPtrSet.cpp @@ -45,6 +45,33 @@ bool SmallPtrSetImpl::insert(void *Ptr) { return true; } +bool SmallPtrSetImpl::erase(void *Ptr) { + if (isSmall()) { + // Check to see if it is in the set. + for (void **APtr = SmallArray, **E = SmallArray+NumElements; + APtr != E; ++APtr) + if (*APtr == Ptr) { + // If it is in the set, move everything over, replacing this element. + memmove(APtr, APtr+1, sizeof(void*)*(E-APtr-1)); + // Clear the end element. + E[-1] = getEmptyMarker(); + --NumElements; + return false; + } + + return false; + } + + // Okay, we know we have space. Find a hash bucket. + void **Bucket = const_cast<void**>(FindBucketFor(Ptr)); + if (*Bucket != Ptr) return false; // Not in the set? + + // Set this as a tombstone. + *Bucket = getTombstoneMarker(); + --NumElements; + return true; +} + void * const *SmallPtrSetImpl::FindBucketFor(void *Ptr) const { unsigned Bucket = Hash(Ptr); unsigned ArraySize = CurArraySize; |