diff options
author | Chris Lattner <sabre@nondot.org> | 2002-11-18 21:42:19 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-11-18 21:42:19 +0000 |
commit | c59a1ba33b68be1bf9bea525cc977c17d805372d (patch) | |
tree | 0ec3c36f31fd27a8f8e8f0eee729b78dcb59c06c /include/llvm/Analysis/DataStructure | |
parent | 985023753683c9179e7db30ab49679775fb4bf94 (diff) |
Templatize graph traits and iterator to work with const and non-const clients
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4746 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/Analysis/DataStructure')
-rw-r--r-- | include/llvm/Analysis/DataStructure/DSGraphTraits.h | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/include/llvm/Analysis/DataStructure/DSGraphTraits.h b/include/llvm/Analysis/DataStructure/DSGraphTraits.h index 231a64c71f..11d00f7d67 100644 --- a/include/llvm/Analysis/DataStructure/DSGraphTraits.h +++ b/include/llvm/Analysis/DataStructure/DSGraphTraits.h @@ -14,15 +14,16 @@ #include "Support/iterator" #include "Support/STLExtras.h" +template<typename NodeTy> class DSNodeIterator : public forward_iterator<const DSNode, ptrdiff_t> { friend class DSNode; - const DSNode * const Node; + NodeTy * const Node; unsigned Offset; - typedef DSNodeIterator _Self; + typedef DSNodeIterator<NodeTy> _Self; - DSNodeIterator(const DSNode *N) : Node(N), Offset(0) {} // begin iterator - DSNodeIterator(const DSNode *N, bool) // Create end iterator + DSNodeIterator(NodeTy *N) : Node(N), Offset(0) {} // begin iterator + DSNodeIterator(NodeTy *N, bool) // Create end iterator : Node(N) { Offset = (N->getSize()+((1 << DS::PointerShift)-1)) & ~((1 << DS::PointerShift)-1); @@ -60,8 +61,18 @@ public: }; // Provide iterators for DSNode... -inline DSNode::iterator DSNode::begin() const { return DSNodeIterator(this); } -inline DSNode::iterator DSNode::end() const { return DSNodeIterator(this, false); } +inline DSNode::iterator DSNode::begin() { + return DSNode::iterator(this); +} +inline DSNode::iterator DSNode::end() { + return DSNode::iterator(this, false); +} +inline DSNode::const_iterator DSNode::begin() const { + return DSNode::const_iterator(this); +} +inline DSNode::const_iterator DSNode::end() const { + return DSNode::const_iterator(this, false); +} template <> struct GraphTraits<DSNode*> { typedef DSNode NodeType; @@ -72,6 +83,15 @@ template <> struct GraphTraits<DSNode*> { static ChildIteratorType child_end(NodeType *N) { return N->end(); } }; +template <> struct GraphTraits<const DSNode*> { + typedef const DSNode NodeType; + typedef DSNode::const_iterator ChildIteratorType; + + static NodeType *getEntryNode(NodeType *N) { return N; } + static ChildIteratorType child_begin(NodeType *N) { return N->begin(); } + static ChildIteratorType child_end(NodeType *N) { return N->end(); } +}; + static DSNode &dereference ( DSNode *N) { return *N; } static const DSNode &dereferenceC(const DSNode *N) { return *N; } @@ -97,7 +117,7 @@ template <> struct GraphTraits<DSGraph*> { template <> struct GraphTraits<const DSGraph*> { typedef const DSNode NodeType; - typedef DSNode::iterator ChildIteratorType; + typedef DSNode::const_iterator ChildIteratorType; typedef std::pointer_to_unary_function<const DSNode *,const DSNode&> DerefFun; |