]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - opencl/llvm.git/commitdiff
Add a iterator and interator_range interface to the operands of a NamedMDNode.
authorOwen Anderson <resistor@mac.com>
Thu, 6 Mar 2014 01:12:56 +0000 (01:12 +0000)
committerOwen Anderson <resistor@mac.com>
Thu, 6 Mar 2014 01:12:56 +0000 (01:12 +0000)
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

include/llvm/IR/Metadata.h

index 2d272d3fcec5d5ecd85e26fcb58e04f90af31ea3..27f7fd935dec1abc39e0839360149b3c19655fa4 100644 (file)
@@ -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