summaryrefslogtreecommitdiffstats
path: root/llvm/include
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/include')
-rw-r--r--llvm/include/llvm/IR/User.h51
1 files changed, 39 insertions, 12 deletions
diff --git a/llvm/include/llvm/IR/User.h b/llvm/include/llvm/IR/User.h
index abe68221df7..66442e82df0 100644
--- a/llvm/include/llvm/IR/User.h
+++ b/llvm/include/llvm/IR/User.h
@@ -129,11 +129,12 @@ public:
/// Convenience iterator for directly iterating over the Values in the
/// OperandList
- class value_op_iterator : public std::iterator<std::forward_iterator_tag,
- Value*> {
+ class value_op_iterator
+ : public std::iterator<std::random_access_iterator_tag, Value *,
+ ptrdiff_t, Value *, Value *> {
op_iterator OI;
public:
- explicit value_op_iterator(Use *U) : OI(U) {}
+ explicit value_op_iterator(Use *U = nullptr) : OI(U) {}
bool operator==(const value_op_iterator &x) const {
return OI == x.OI;
@@ -142,21 +143,47 @@ public:
return !operator==(x);
}
- /// Iterator traversal: forward iteration only
- value_op_iterator &operator++() { // Preincrement
- ++OI;
+ value_op_iterator &operator+=(ptrdiff_t n) {
+ OI += n;
return *this;
}
- value_op_iterator operator++(int) { // Postincrement
- value_op_iterator tmp = *this; ++*this; return tmp;
+ value_op_iterator &operator-=(ptrdiff_t n) {
+ OI -= n;
+ return *this;
}
-
- /// Retrieve a pointer to the current Value.
- Value *operator*() const {
- return *OI;
+ value_op_iterator operator+(ptrdiff_t n) const {
+ return value_op_iterator(OI + n);
+ }
+ friend value_op_iterator operator+(ptrdiff_t n,
+ const value_op_iterator &i) {
+ return i + n;
+ }
+ value_op_iterator operator-(ptrdiff_t n) const {
+ return value_op_iterator(OI - n);
+ }
+ ptrdiff_t operator-(const value_op_iterator &RHS) const {
+ return OI - RHS.OI;
+ }
+ bool operator<(const value_op_iterator &RHS) const { return OI < RHS.OI; }
+ bool operator>(const value_op_iterator &RHS) const { return OI > RHS.OI; }
+ bool operator<=(const value_op_iterator &RHS) const { return OI <= RHS.OI; }
+ bool operator>=(const value_op_iterator &RHS) const { return OI >= RHS.OI; }
+ value_op_iterator &operator++() { return *this += 1; }
+ value_op_iterator &operator--() { return *this -= 1; }
+ value_op_iterator operator++(int) {
+ value_op_iterator tmp = *this;
+ ++*this;
+ return tmp;
+ }
+ value_op_iterator operator--(int) {
+ value_op_iterator tmp = *this;
+ --*this;
+ return tmp;
}
+ Value *operator*() const { return *OI; }
Value *operator->() const { return operator*(); }
+ Value *operator[](ptrdiff_t n) const { return *(*this + n); }
};
inline value_op_iterator value_op_begin() {
OpenPOWER on IntegriCloud