summaryrefslogtreecommitdiff
path: root/include/llvm/User.h
diff options
context:
space:
mode:
authorMichael Ilseman <milseman@apple.com>2012-10-09 16:55:14 +0000
committerMichael Ilseman <milseman@apple.com>2012-10-09 16:55:14 +0000
commite9c6f98b1ea7261ba2d49f4d038670c0dfe14467 (patch)
treef889d9d18b8d21761d5287ac21366c4906090888 /include/llvm/User.h
parent572e1bd109518f80b54d229de10699c4603944c3 (diff)
downloadllvm-e9c6f98b1ea7261ba2d49f4d038670c0dfe14467.tar.gz
llvm-e9c6f98b1ea7261ba2d49f4d038670c0dfe14467.tar.bz2
llvm-e9c6f98b1ea7261ba2d49f4d038670c0dfe14467.tar.xz
New value_op_iterator for User. This allows other code to iterate over the User's operands directly as values, which can be convenient.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165508 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/User.h')
-rw-r--r--include/llvm/User.h39
1 files changed, 38 insertions, 1 deletions
diff --git a/include/llvm/User.h b/include/llvm/User.h
index abd80afb70..8b1895d469 100644
--- a/include/llvm/User.h
+++ b/include/llvm/User.h
@@ -104,7 +104,7 @@ public:
assert(i < NumOperands && "getOperandUse() out of range!");
return OperandList[i];
}
-
+
unsigned getNumOperands() const { return NumOperands; }
// ---------------------------------------------------------------------------
@@ -118,6 +118,43 @@ public:
inline op_iterator op_end() { return OperandList+NumOperands; }
inline const_op_iterator op_end() const { return OperandList+NumOperands; }
+ class value_op_iterator : public std::iterator<std::forward_iterator_tag,
+ Value*> {
+ op_iterator OI;
+ public:
+ explicit value_op_iterator(Use *U) : OI(U) {}
+
+ bool operator==(const value_op_iterator &x) const {
+ return OI == x.OI;
+ }
+ bool operator!=(const value_op_iterator &x) const {
+ return !operator==(x);
+ }
+
+ // Iterator traversal: forward iteration only
+ value_op_iterator &operator++() { // Preincrement
+ ++OI;
+ return *this;
+ }
+ value_op_iterator operator++(int) { // Postincrement
+ value_op_iterator tmp = *this; ++*this; return tmp;
+ }
+
+ // Retrieve a pointer to the current User.
+ Value *operator*() const {
+ return *OI;
+ }
+
+ Value *operator->() const { return operator*(); }
+ };
+
+ inline value_op_iterator value_op_begin() {
+ return value_op_iterator(op_begin());
+ }
+ inline value_op_iterator value_op_end() {
+ return value_op_iterator(op_end());
+ }
+
// dropAllReferences() - This function is in charge of "letting go" of all
// objects that this User refers to. This allows one to
// 'delete' a whole class at a time, even though there may be circular