1 //===- llvm/Support/GetElementPtrTypeIterator.h -----------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by the LLVM research group and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements an iterator for walking through the types indexed by
11 // getelementptr instructions.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_SUPPORT_GETELEMENTPTRTYPE_H
16 #define LLVM_SUPPORT_GETELEMENTPTRTYPE_H
18 #include "llvm/User.h"
19 #include "llvm/DerivedTypes.h"
22 class gep_type_iterator
23 : public forward_iterator<const Type *, ptrdiff_t> {
24 typedef forward_iterator<const Type*, ptrdiff_t> super;
26 User::op_iterator OpIt;
28 gep_type_iterator() {}
31 static gep_type_iterator begin(const Type *Ty, User::op_iterator It) {
37 static gep_type_iterator end(User::op_iterator It) {
44 bool operator==(const gep_type_iterator& x) const {
45 return OpIt == x.OpIt;
47 bool operator!=(const gep_type_iterator& x) const {
48 return !operator==(x);
51 const Type *operator*() const {
55 // This is a non-standard operator->. It allows you to call methods on the
56 // current type directly.
57 const Type *operator->() const { return operator*(); }
59 Value *getOperand() const { return *OpIt; }
61 gep_type_iterator& operator++() { // Preincrement
62 if (const CompositeType *CT = dyn_cast<CompositeType>(CurTy)) {
63 CurTy = CT->getTypeAtIndex(getOperand());
71 gep_type_iterator operator++(int) { // Postincrement
72 gep_type_iterator tmp = *this; ++*this; return tmp;
76 inline gep_type_iterator gep_type_begin(User *GEP) {
77 return gep_type_iterator::begin(GEP->getOperand(0)->getType(),
80 inline gep_type_iterator gep_type_end(User *GEP) {
81 return gep_type_iterator::end(GEP->op_end());
83 inline gep_type_iterator gep_type_begin(User &GEP) {
84 return gep_type_iterator::begin(GEP.getOperand(0)->getType(),
87 inline gep_type_iterator gep_type_end(User &GEP) {
88 return gep_type_iterator::end(GEP.op_end());
90 inline gep_type_iterator gep_type_begin(const Type *Op0, User::op_iterator I,
91 User::op_iterator E) {
92 return gep_type_iterator::begin(Op0, I);
94 inline gep_type_iterator gep_type_end(const Type *Op0, User::op_iterator I,
95 User::op_iterator E) {
96 return gep_type_iterator::end(E);
98 } // end namespace llvm