X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FSupport%2FGetElementPtrTypeIterator.h;h=f5915c992cdbb50bc408647dd8f5f304dac0c5f5;hb=7362ce08cb2c1f0b544b18dbc21630fb4baebcfc;hp=068ec45dc5a2f97abdc1863350475f62f8b97a27;hpb=43cb041754df231f488fa7c203f13ec731ca389c;p=oota-llvm.git diff --git a/include/llvm/Support/GetElementPtrTypeIterator.h b/include/llvm/Support/GetElementPtrTypeIterator.h index 068ec45dc5a..f5915c992cd 100644 --- a/include/llvm/Support/GetElementPtrTypeIterator.h +++ b/include/llvm/Support/GetElementPtrTypeIterator.h @@ -1,10 +1,10 @@ //===- llvm/Support/GetElementPtrTypeIterator.h -----------------*- C++ -*-===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// //===----------------------------------------------------------------------===// // // This file implements an iterator for walking through the types indexed by @@ -19,10 +19,11 @@ #include "llvm/DerivedTypes.h" namespace llvm { - template + template class generic_gep_type_iterator - : public forward_iterator { - typedef forward_iterator super; + : public std::iterator { + typedef std::iterator super; ItTy OpIt; const Type *CurTy; @@ -42,21 +43,26 @@ namespace llvm { return I; } - bool operator==(const generic_gep_type_iterator& x) const { + bool operator==(const generic_gep_type_iterator& x) const { return OpIt == x.OpIt; } bool operator!=(const generic_gep_type_iterator& x) const { return !operator==(x); } - const Type *operator*() const { + const Type *operator*() const { return CurTy; } + const Type *getIndexedType() const { + const CompositeType *CT = cast(CurTy); + return CT->getTypeAtIndex(getOperand()); + } + // This is a non-standard operator->. It allows you to call methods on the // current type directly. const Type *operator->() const { return operator*(); } - + Value *getOperand() const { return *OpIt; } generic_gep_type_iterator& operator++() { // Preincrement @@ -66,28 +72,28 @@ namespace llvm { CurTy = 0; } ++OpIt; - return *this; + return *this; } generic_gep_type_iterator operator++(int) { // Postincrement - generic_gep_type_iterator tmp = *this; ++*this; return tmp; + generic_gep_type_iterator tmp = *this; ++*this; return tmp; } }; typedef generic_gep_type_iterator<> gep_type_iterator; - inline gep_type_iterator gep_type_begin(User *GEP) { + inline gep_type_iterator gep_type_begin(const User *GEP) { return gep_type_iterator::begin(GEP->getOperand(0)->getType(), GEP->op_begin()+1); } - inline gep_type_iterator gep_type_end(User *GEP) { + inline gep_type_iterator gep_type_end(const User *GEP) { return gep_type_iterator::end(GEP->op_end()); } - inline gep_type_iterator gep_type_begin(User &GEP) { + inline gep_type_iterator gep_type_begin(const User &GEP) { return gep_type_iterator::begin(GEP.getOperand(0)->getType(), GEP.op_begin()+1); } - inline gep_type_iterator gep_type_end(User &GEP) { + inline gep_type_iterator gep_type_end(const User &GEP) { return gep_type_iterator::end(GEP.op_end()); }