BadgerDB
|
00001 00008 #pragma once 00009 00010 #include <cassert> 00011 #include "file.h" 00012 #include "page.h" 00013 #include "types.h" 00014 00015 namespace badgerdb { 00016 00023 class PageIterator { 00024 public: 00028 PageIterator() 00029 : page_(NULL) { 00030 current_record_ = {Page::INVALID_NUMBER, Page::INVALID_SLOT}; 00031 } 00032 00039 PageIterator(Page* page) 00040 : page_(page) { 00041 assert(page_ != NULL); 00042 const SlotId used_slot = getNextUsedSlot(Page::INVALID_SLOT /* start */); 00043 current_record_ = {page_->page_number(), used_slot}; 00044 } 00045 00046 PageIterator(Page* page, SlotId slot) 00047 : page_(page) { 00048 assert(page_ != NULL); 00049 current_record_ = {page_->page_number(), slot}; 00050 } 00051 00059 PageIterator(Page* page, const RecordId& record_id) 00060 : page_(page), 00061 current_record_(record_id) { 00062 } 00063 00067 inline PageIterator& operator++() { 00068 assert(page_ != NULL); 00069 const SlotId used_slot = getNextUsedSlot(current_record_.slot_number); 00070 current_record_ = {page_->page_number(), used_slot}; 00071 00072 return *this; 00073 } 00074 00075 inline PageIterator operator++(int) { 00076 PageIterator tmp = *this; // copy ourselves 00077 00078 assert(page_ != NULL); 00079 const SlotId used_slot = getNextUsedSlot(current_record_.slot_number); 00080 current_record_ = {page_->page_number(), used_slot}; 00081 00082 return tmp; 00083 } 00090 inline bool operator==(const PageIterator& rhs) const { 00091 return page_->page_number() == rhs.page_->page_number() && 00092 current_record_ == rhs.current_record_; 00093 } 00094 00095 inline bool operator!=(const PageIterator& rhs) const { 00096 return (page_->page_number() != rhs.page_->page_number()) || 00097 (current_record_ != rhs.current_record_); 00098 } 00099 00106 inline std::string operator*() const { 00107 return page_->getRecord(current_record_); 00108 } 00109 00117 SlotId getNextUsedSlot(const SlotId start) const { 00118 SlotId slot_number = Page::INVALID_SLOT; 00119 for (SlotId i = start + 1; i <= page_->header_.num_slots; ++i) { 00120 const PageSlot* slot = page_->getSlot(i); 00121 if (slot->used) { 00122 slot_number = i; 00123 break; 00124 } 00125 } 00126 return slot_number; 00127 } 00128 00129 RecordId getCurrentRecord() 00130 { 00131 return current_record_; 00132 } 00133 00134 private: 00138 Page* page_; 00139 00143 RecordId current_record_; 00144 00145 //FRIEND_TEST(PageTest, GetNextUsedSlot); 00146 //FRIEND_TEST(BufferTest, GetNextUsedSlot); 00147 }; 00148 00149 }