mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-28 21:34:23 +00:00
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
This commit is contained in:
parent
f4ec8bfaec
commit
d6ea721c1f
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user