mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-08 18:30:26 +00:00
Add initial iterator support for folding set.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42589 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -151,6 +151,7 @@ static FoldingSetImpl::Node *GetNextPtr(void *NextInBucketPtr) {
|
||||
/// testing.
|
||||
static void **GetBucketPtr(void *NextInBucketPtr) {
|
||||
intptr_t Ptr = reinterpret_cast<intptr_t>(NextInBucketPtr);
|
||||
assert((Ptr & 1) && "Not a bucket pointer");
|
||||
return reinterpret_cast<void**>(Ptr & ~intptr_t(1));
|
||||
}
|
||||
|
||||
@@ -323,3 +324,34 @@ FoldingSetImpl::Node *FoldingSetImpl::GetOrInsertNode(FoldingSetImpl::Node *N) {
|
||||
InsertNode(N, IP);
|
||||
return N;
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// FoldingSetIteratorImpl Implementation
|
||||
|
||||
FoldingSetIteratorImpl::FoldingSetIteratorImpl(void **Bucket) {
|
||||
// Skip to the first non-null non-self-cycle bucket.
|
||||
while (*Bucket == 0 || GetNextPtr(*Bucket) == 0)
|
||||
++Bucket;
|
||||
|
||||
NodePtr = static_cast<FoldingSetNode*>(*Bucket);
|
||||
}
|
||||
|
||||
void FoldingSetIteratorImpl::advance() {
|
||||
// If there is another link within this bucket, go to it.
|
||||
void *Probe = NodePtr->getNextInBucket();
|
||||
|
||||
if (FoldingSetNode *NextNodeInBucket = GetNextPtr(Probe))
|
||||
NodePtr = NextNodeInBucket;
|
||||
else {
|
||||
// Otherwise, this is the last link in this bucket.
|
||||
void **Bucket = GetBucketPtr(Probe);
|
||||
|
||||
// Skip to the next non-null non-self-cycle bucket.
|
||||
do {
|
||||
++Bucket;
|
||||
} while (*Bucket == 0 || GetNextPtr(*Bucket) == 0);
|
||||
|
||||
NodePtr = static_cast<FoldingSetNode*>(*Bucket);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user