diff options
author | Owen Anderson <resistor@mac.com> | 2014-03-06 01:51:01 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2014-03-06 01:51:01 +0000 |
commit | 907423f7db7b9537cc3101398fc981f140fef348 (patch) | |
tree | fbfa3b75d52603881bf5a66a3c430e42d84e8cca | |
parent | 4b2ab80c3ebd3bd8214ee0ca6d991d6c691c63a8 (diff) | |
download | llvm-907423f7db7b9537cc3101398fc981f140fef348.tar.gz llvm-907423f7db7b9537cc3101398fc981f140fef348.tar.bz2 llvm-907423f7db7b9537cc3101398fc981f140fef348.tar.xz |
Fix issues in the NamedMDNode operand iterator, including those pointed out by
Chandler in review.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203058 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/IR/Metadata.h | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/include/llvm/IR/Metadata.h b/include/llvm/IR/Metadata.h index 27f7fd935d..9992e5cbde 100644 --- a/include/llvm/IR/Metadata.h +++ b/include/llvm/IR/Metadata.h @@ -208,8 +208,9 @@ class NamedMDNode : public ilist_node<NamedMDNode> { explicit NamedMDNode(const Twine &N); - template<class T> - class op_iterator_impl { + template<class T1, class T2> + class op_iterator_impl : + public std::iterator<std::random_access_iterator_tag, T2> { const NamedMDNode *Node; unsigned Idx; op_iterator_impl(const NamedMDNode *N, unsigned i) : Node(N), Idx(i) { } @@ -220,10 +221,11 @@ class NamedMDNode : public ilist_node<NamedMDNode> { op_iterator_impl() : Node(0), Idx(0) { } op_iterator_impl(const op_iterator_impl &o) : Node(o.Node), Idx(o.Idx) { } - bool operator==(const op_iterator_impl<T> &o) const { return Idx == o.Idx; } - bool operator!=(const op_iterator_impl<T> &o) const { return Idx != o.Idx; } + bool operator==(const op_iterator_impl &o) const { return Idx == o.Idx; } + bool operator!=(const op_iterator_impl &o) const { return Idx != o.Idx; } op_iterator_impl &operator++() { - ++Idx; return *this; + ++Idx; + return *this; } op_iterator_impl operator++(int) { op_iterator_impl tmp(*this); @@ -231,10 +233,11 @@ class NamedMDNode : public ilist_node<NamedMDNode> { return tmp; } op_iterator_impl &operator=(const op_iterator_impl &o) { + Node = o.Node; Idx = o.Idx; return *this; } - T operator*() const { return Node->getOperand(Idx); } + T1 operator*() const { return Node->getOperand(Idx); } }; public: @@ -273,11 +276,11 @@ public: // --------------------------------------------------------------------------- // Operand Iterator interface... // - typedef op_iterator_impl<MDNode*> op_iterator; + typedef op_iterator_impl<MDNode*, MDNode> op_iterator; op_iterator op_begin() { return op_iterator(this, 0); } op_iterator op_end() { return op_iterator(this, getNumOperands()); } - typedef op_iterator_impl<const MDNode*> const_op_iterator; + typedef op_iterator_impl<const MDNode*, MDNode> const_op_iterator; const_op_iterator op_begin() const { return const_op_iterator(this, 0); } const_op_iterator op_end() const { return const_op_iterator(this, getNumOperands()); } |