From 3c6255c376127f9e79b8bab47a2fd585131e8fcd Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Wed, 2 Jan 2008 21:31:48 +0000 Subject: [PATCH] Added iterator and profiling (i.e. FoldingSetNodeID) support to ImmutableMap. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45503 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/ADT/ImmutableMap.h | 41 ++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/include/llvm/ADT/ImmutableMap.h b/include/llvm/ADT/ImmutableMap.h index 82037d0b9ea..6f62960217b 100644 --- a/include/llvm/ADT/ImmutableMap.h +++ b/include/llvm/ADT/ImmutableMap.h @@ -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; + + 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