diff options
author | Michael Ilseman <milseman@apple.com> | 2012-10-09 16:55:14 +0000 |
---|---|---|
committer | Michael Ilseman <milseman@apple.com> | 2012-10-09 16:55:14 +0000 |
commit | e9c6f98b1ea7261ba2d49f4d038670c0dfe14467 (patch) | |
tree | f889d9d18b8d21761d5287ac21366c4906090888 /include/llvm/User.h | |
parent | 572e1bd109518f80b54d229de10699c4603944c3 (diff) | |
download | llvm-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.h | 39 |
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 |