summaryrefslogtreecommitdiff
path: root/include/llvm/IR
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2014-03-06 01:12:56 +0000
committerOwen Anderson <resistor@mac.com>2014-03-06 01:12:56 +0000
commitd6ea721c1f92d1b35af98fc4a6a74fb9f05be22d (patch)
tree644ce3b90f7589e44f1db1489b4dcea620d1dccc /include/llvm/IR
parentf4ec8bfaecef4e38f713b9e05d89869b023e1ce8 (diff)
downloadllvm-d6ea721c1f92d1b35af98fc4a6a74fb9f05be22d.tar.gz
llvm-d6ea721c1f92d1b35af98fc4a6a74fb9f05be22d.tar.bz2
llvm-d6ea721c1f92d1b35af98fc4a6a74fb9f05be22d.tar.xz
Add a iterator and interator_range interface to the operands of a NamedMDNode.
The iterator is a little complex because we don't want to expose the implementation details (TrackingVH) of the operand vector to clients. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203053 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/IR')
-rw-r--r--include/llvm/IR/Metadata.h48
1 files changed, 48 insertions, 0 deletions
diff --git a/include/llvm/IR/Metadata.h b/include/llvm/IR/Metadata.h
index 2d272d3fce..27f7fd935d 100644
--- a/include/llvm/IR/Metadata.h
+++ b/include/llvm/IR/Metadata.h
@@ -19,6 +19,7 @@
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/FoldingSet.h"
#include "llvm/ADT/ilist_node.h"
+#include "llvm/ADT/iterator_range.h"
#include "llvm/IR/Value.h"
namespace llvm {
@@ -207,6 +208,35 @@ class NamedMDNode : public ilist_node<NamedMDNode> {
explicit NamedMDNode(const Twine &N);
+ template<class T>
+ class op_iterator_impl {
+ const NamedMDNode *Node;
+ unsigned Idx;
+ op_iterator_impl(const NamedMDNode *N, unsigned i) : Node(N), Idx(i) { }
+
+ friend class NamedMDNode;
+
+ public:
+ 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; }
+ op_iterator_impl &operator++() {
+ ++Idx; return *this;
+ }
+ op_iterator_impl operator++(int) {
+ op_iterator_impl tmp(*this);
+ operator++();
+ return tmp;
+ }
+ op_iterator_impl &operator=(const op_iterator_impl &o) {
+ Idx = o.Idx;
+ return *this;
+ }
+ T operator*() const { return Node->getOperand(Idx); }
+ };
+
public:
/// eraseFromParent - Drop all references and remove the node from parent
/// module.
@@ -239,6 +269,24 @@ public:
/// dump() - Allow printing of NamedMDNodes from the debugger.
void dump() const;
+
+ // ---------------------------------------------------------------------------
+ // Operand Iterator interface...
+ //
+ typedef op_iterator_impl<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;
+ const_op_iterator op_begin() const { return const_op_iterator(this, 0); }
+ const_op_iterator op_end() const { return const_op_iterator(this, getNumOperands()); }
+
+ inline iterator_range<op_iterator> operands() {
+ return iterator_range<op_iterator>(op_begin(), op_end());
+ }
+ inline iterator_range<const_op_iterator> operands() const {
+ return iterator_range<const_op_iterator>(op_begin(), op_end());
+ }
};
} // end llvm namespace