BadgerDB
/afs/cs.wisc.edu/u/n/w/nwilliam/private/workspace/Quut/src/page_iterator.h
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 }
 All Classes Namespaces Functions Variables Typedefs Enumerations Friends