00001 #ifndef _Iterator_h_ 00002 #define _Iterator_h_ 00003 00004 #include <Base.h> 00005 00006 class AddressIterator { 00007 protected: 00008 uint64_t baseAddress; 00009 uint64_t sizeInBytes; 00010 uint64_t currAddress; 00011 uint8_t unitInBytes; 00012 00013 inline AddressIterator(uint64_t base,uint64_t size,uint8_t unit) : 00014 baseAddress(base),sizeInBytes(size),currAddress(base),unitInBytes(unit) 00015 {} 00016 00017 public: 00018 virtual ~AddressIterator() {} 00019 bool hasMore() { 00020 return ((baseAddress <= currAddress) && (currAddress < (baseAddress + sizeInBytes))); 00021 } 00022 bool hasPrev() { 00023 return ((baseAddress < currAddress) && (currAddress <= (baseAddress + sizeInBytes))); 00024 } 00025 inline void reset() { currAddress = baseAddress; } 00026 inline uint8_t unitSize() { return unitInBytes; } 00027 inline uint64_t operator*() { return currAddress; } 00028 uint64_t getOffset(){ return (currAddress-baseAddress); } 00029 00030 uint64_t operator++(); 00031 uint64_t operator--(); 00032 uint64_t operator++(int n); 00033 uint64_t operator--(int n); 00034 00035 void skip(uint64_t s) { currAddress += s; } 00036 void skipTo(uint64_t s) { currAddress = s; } 00037 00038 static AddressIterator newAddressIteratorWord(uint64_t base,uint64_t size){ 00039 return AddressIterator(base,size,sizeof(uint32_t)); 00040 } 00041 00042 static AddressIterator newAddressIteratorDouble(uint64_t base,uint64_t size){ 00043 return AddressIterator(base,size,sizeof(uint64_t)); 00044 } 00045 00046 static AddressIterator invalidIterator(){ 00047 return AddressIterator(0,0,0); 00048 } 00049 00050 bool isInvalid() { return !unitInBytes; } 00051 00052 uint64_t readBytes(char* ptr); 00053 void print() { PRINT_INFOR("AI : %#18llx - %6lld - %#18llx",baseAddress,sizeInBytes,currAddress); } 00054 00055 uint8_t unit() { return unitInBytes; } 00056 00057 bool isWord() { return (unitInBytes == sizeof(uint32_t)); } 00058 bool isDouble() { return (unitInBytes == sizeof(uint64_t)); } 00059 }; 00060 00061 #endif