X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FSupport%2FInstIterator.h;h=7d3f8835098e30888a52b1f791578b3cff737bb1;hb=0fd38069cb6699ce21eb159f22d3f23c012c9e81;hp=06fc9bd2818d328de86250d485c4573e244597cb;hpb=02dea4b355f3262a52dd9df0d24e59beb1bc6ec4;p=oota-llvm.git diff --git a/include/llvm/Support/InstIterator.h b/include/llvm/Support/InstIterator.h index 06fc9bd2818..7d3f8835098 100644 --- a/include/llvm/Support/InstIterator.h +++ b/include/llvm/Support/InstIterator.h @@ -1,4 +1,11 @@ -//===-- llvm/Support/InstIterator.h - Classes for inst iteration -*- C++ -*--=// +//===- llvm/Support/InstIterator.h - Classes for inst iteration -*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// // // This file contains definitions of two iterators for iterating over the // instructions in a function. This is effectively a wrapper around a two level @@ -15,6 +22,8 @@ #include "llvm/BasicBlock.h" #include "llvm/Function.h" +namespace llvm { + // This class implements inst_begin() & inst_end() for // inst_iterator and const_inst_iterator's. // @@ -24,15 +33,18 @@ class InstIterator { typedef _BB_i_t BBIty; typedef _BI_t BIty; typedef _II_t IIty; - _BB_t &BBs; // BasicBlocksType + _BB_t *BBs; // BasicBlocksType _BB_i_t BB; // BasicBlocksType::iterator _BI_t BI; // BasicBlock::iterator public: typedef std::bidirectional_iterator_tag iterator_category; typedef IIty value_type; - typedef unsigned difference_type; - typedef BIty pointer; - typedef IIty reference; + typedef signed difference_type; + typedef IIty* pointer; + typedef IIty& reference; + + // Default constructor + InstIterator() {} // Copy constructor... template @@ -42,55 +54,55 @@ public: template InstIterator(InstIterator &II) : BBs(II.BBs), BB(II.BB), BI(II.BI) {} - - template InstIterator(M &m) - : BBs(m.getBasicBlockList()), BB(BBs.begin()) { // begin ctor - if (BB != BBs.end()) { + + template InstIterator(M &m) + : BBs(&m.getBasicBlockList()), BB(BBs->begin()) { // begin ctor + if (BB != BBs->end()) { BI = BB->begin(); advanceToNextBB(); } } - template InstIterator(M &m, bool) - : BBs(m.getBasicBlockList()), BB(BBs.end()) { // end ctor + template InstIterator(M &m, bool) + : BBs(&m.getBasicBlockList()), BB(BBs->end()) { // end ctor } // Accessors to get at the underlying iterators... inline BBIty &getBasicBlockIterator() { return BB; } inline BIty &getInstructionIterator() { return BI; } - - inline IIty operator*() const { return BI; } - inline IIty operator->() const { return operator*(); } - - inline bool operator==(const InstIterator &y) const { - return BB == y.BB && (BB == BBs.end() || BI == y.BI); + + inline reference operator*() const { return *BI; } + inline pointer operator->() const { return &operator*(); } + + inline bool operator==(const InstIterator &y) const { + return BB == y.BB && (BB == BBs->end() || BI == y.BI); } - inline bool operator!=(const InstIterator& y) const { + inline bool operator!=(const InstIterator& y) const { return !operator==(y); } - InstIterator& operator++() { + InstIterator& operator++() { ++BI; advanceToNextBB(); - return *this; + return *this; } - inline InstIterator operator++(int) { - InstIterator tmp = *this; ++*this; return tmp; + inline InstIterator operator++(int) { + InstIterator tmp = *this; ++*this; return tmp; } - - InstIterator& operator--() { - while (BB == BBs.end() || BI == BB->begin()) { + + InstIterator& operator--() { + while (BB == BBs->end() || BI == BB->begin()) { --BB; BI = BB->end(); } --BI; - return *this; + return *this; } - inline InstIterator operator--(int) { - InstIterator tmp = *this; --*this; return tmp; + inline InstIterator operator--(int) { + InstIterator tmp = *this; --*this; return tmp; } - inline bool atEnd() const { return BB == BBs.end(); } + inline bool atEnd() const { return BB == BBs->end(); } private: inline void advanceToNextBB() { @@ -98,7 +110,7 @@ private: // the end() of the current BasicBlock and there are successor BBs. while (BI == BB->end()) { ++BB; - if (BB == BBs.end()) break; + if (BB == BBs->end()) break; BI = BB->begin(); } } @@ -107,11 +119,11 @@ private: typedef InstIterator, Function::iterator, BasicBlock::iterator, - Instruction*> inst_iterator; + Instruction> inst_iterator; typedef InstIterator, - Function::const_iterator, + Function::const_iterator, BasicBlock::const_iterator, - const Instruction*> const_inst_iterator; + const Instruction> const_inst_iterator; inline inst_iterator inst_begin(Function *F) { return inst_iterator(*F); } inline inst_iterator inst_end(Function *F) { return inst_iterator(*F, true); } @@ -130,4 +142,6 @@ inline const_inst_iterator inst_end(const Function &F) { return const_inst_iterator(F, true); } +} // End llvm namespace + #endif