diff options
author | Chris Lattner <sabre@nondot.org> | 2007-10-03 21:12:09 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2007-10-03 21:12:09 +0000 |
commit | 116c3219df347f169b1bd24acca2d53ab0ae26ec (patch) | |
tree | 7b89c7d4fb946e59360da0d3978b114221df260f /include/llvm/ADT/FoldingSet.h | |
parent | 6ccc2d579e7e9f2bce353391aa487f218b3dc5c1 (diff) | |
download | llvm-116c3219df347f169b1bd24acca2d53ab0ae26ec.tar.gz llvm-116c3219df347f169b1bd24acca2d53ab0ae26ec.tar.bz2 llvm-116c3219df347f169b1bd24acca2d53ab0ae26ec.tar.xz |
Add initial iterator support for folding set.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42589 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/ADT/FoldingSet.h')
-rw-r--r-- | include/llvm/ADT/FoldingSet.h | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/include/llvm/ADT/FoldingSet.h b/include/llvm/ADT/FoldingSet.h index 7fca63867b..6f486512e5 100644 --- a/include/llvm/ADT/FoldingSet.h +++ b/include/llvm/ADT/FoldingSet.h @@ -220,6 +220,8 @@ protected: typedef FoldingSetImpl::Node FoldingSetNode; typedef FoldingSetImpl::NodeID FoldingSetNodeID; +template<class T> class FoldingSetIterator; + //===----------------------------------------------------------------------===// /// FoldingSet - This template class is used to instantiate a specialized /// implementation of the folding set to the node class T. T must be a @@ -238,6 +240,14 @@ public: explicit FoldingSet(unsigned Log2InitSize = 6) : FoldingSetImpl(Log2InitSize) {} + + typedef FoldingSetIterator<T> iterator; + iterator begin() { return iterator(Buckets); } + iterator end() { return iterator(Buckets+NumBuckets); } + + typedef FoldingSetIterator<const T> const_iterator; + const_iterator begin() const { return const_iterator(Buckets); } + const_iterator end() const { return const_iterator(Buckets+NumBuckets); } /// GetOrInsertNode - If there is an existing simple Node exactly /// equal to the specified node, return it. Otherwise, insert 'N' and @@ -254,6 +264,47 @@ public: } }; +//===----------------------------------------------------------------------===// +/// FoldingSetIteratorImpl - This is the common iterator support shared by all +/// folding sets, which knows how to walk the folding set hash table. +class FoldingSetIteratorImpl { +protected: + FoldingSetNode *NodePtr; + FoldingSetIteratorImpl(void **Bucket); + void advance(); + +public: + bool operator==(const FoldingSetIteratorImpl &RHS) const { + return NodePtr == RHS.NodePtr; + } + bool operator!=(const FoldingSetIteratorImpl &RHS) const { + return NodePtr != RHS.NodePtr; + } +}; + + +template<class T> +class FoldingSetIterator : public FoldingSetIteratorImpl { +public: + FoldingSetIterator(void **Bucket) : FoldingSetIteratorImpl(Bucket) {} + + T &operator*() const { + return *static_cast<T*>(NodePtr); + } + + T *operator->() const { + return static_cast<T*>(NodePtr); + } + + inline FoldingSetIterator& operator++() { // Preincrement + advance(); + return *this; + } + FoldingSetIterator operator++(int) { // Postincrement + FoldingSetIterator tmp = *this; ++*this; return tmp; + } +}; + } // End of namespace llvm. |