VMRecordIterator(MemPointerArray* arr) : _itr(arr) { MemPointerRecord* cur = (MemPointerRecord*)_itr.current(); MemPointerRecord* next = (MemPointerRecord*)_itr.peek_next(); while (next != NULL) { assert(cur != NULL, "Sanity check"); assert(((SeqMemPointerRecord*)next)->seq() > ((SeqMemPointerRecord*)cur)->seq(), "pre-sort order"); if (is_duplicated_record(cur, next)) { _itr.next(); next = (MemPointerRecord*)_itr.peek_next(); } else { break; } } }
// get next record, but skip the duplicated records virtual MemPointer* next() { MemPointerRecord* cur = (MemPointerRecord*)_itr.next(); MemPointerRecord* next = (MemPointerRecord*)_itr.peek_next(); while (next != NULL) { assert(cur != NULL, "Sanity check"); assert(((SeqMemPointerRecord*)next)->seq() > ((SeqMemPointerRecord*)cur)->seq(), "pre-sort order"); if (is_duplicated_record(cur, next)) { _itr.next(); cur = next; next = (MemPointerRecord*)_itr.peek_next(); } else { break; } } return cur; }
virtual MemPointer* current() const { #ifdef ASSERT MemPointer* cur_rec = _itr.current(); if (cur_rec != NULL) { MemPointer* prev_rec = _itr.peek_prev(); MemPointer* next_rec = _itr.peek_next(); assert(prev_rec == NULL || prev_rec->addr() < cur_rec->addr(), "Sorting order"); assert(next_rec == NULL || next_rec->addr() > cur_rec->addr(), "Sorting order"); } #endif return _itr.current(); }