aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Support/SmallPtrSet.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2007-01-27 07:59:10 +0000
committerChris Lattner <sabre@nondot.org>2007-01-27 07:59:10 +0000
commit39ab70cf80d56157ac25202932c4c5cc63ef7f72 (patch)
treee9907872a3a47cf6a60e69cc3af8f5cfdd9c71dd /llvm/lib/Support/SmallPtrSet.cpp
parent030a2dcc1edf89eb86bdfcd9e4f821fa9d3c6334 (diff)
downloadllvm-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.cpp27
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;