Added iterator and profiling (i.e. FoldingSetNodeID) support to ImmutableMap.
authorTed Kremenek <kremenek@apple.com>
Wed, 2 Jan 2008 21:31:48 +0000 (21:31 +0000)
committerTed Kremenek <kremenek@apple.com>
Wed, 2 Jan 2008 21:31:48 +0000 (21:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45503 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/ImmutableMap.h

index 82037d0b9ea4df94c7005480a26ca9518775337c..6f62960217baf2cb49d9017c83228690377820e3 100644 (file)
@@ -154,8 +154,47 @@ public:
   //===--------------------------------------------------===//  
   
   void verify() const { if (Root) Root->verify(); }
-  unsigned getHeight() const { return Root ? Root->getHeight() : 0; }
   
+  //===--------------------------------------------------===//    
+  // Iterators.
+  //===--------------------------------------------------===//  
+  
+  class iterator {
+    typename TreeTy::iterator itr;
+    
+    iterator() {}
+    iterator(TreeTy* t) : itr(t) {}
+    friend class ImmutableSet<ValT,ValInfo>;
+
+  public:
+    inline value_type_ref operator*() const { return itr->getValue(); }
+    inline key_type_ref getKey() const { return itr->getValue().first; }
+    inline data_type_ref getData() const { return itr->getValue().second; }
+    
+    inline iterator& operator++() { ++itr; return *this; }
+    inline iterator  operator++(int) { iterator tmp(*this); ++itr; return tmp; }
+    inline iterator& operator--() { --itr; return *this; }
+    inline iterator  operator--(int) { iterator tmp(*this); --itr; return tmp; }
+    inline bool operator==(const iterator& RHS) const { return RHS.itr == itr; }
+    inline bool operator!=(const iterator& RHS) const { return RHS.itr != itr; }        
+  };
+  
+  iterator begin() const { return iterator(Root); }
+  iterator end() const { return iterator(); }  
+  
+  //===--------------------------------------------------===//    
+  // Utility methods.
+  //===--------------------------------------------------===//  
+  
+  inline unsigned getHeight() const { return Root ? Root->getHeight() : 0; }
+
+  static inline void Profile(const ImmutableMap& M, FoldingSetNodeID& ID) { 
+    ID.AddPointer(M.Root);
+  }
+  
+  inline void Profile(FoldingSetNodeID& ID) const {
+    return Profile(*this,ID);
+  }  
 };
   
 } // end namespace llvm