Fennel: /home/pub/open/dev/fennel/segment/SegPageIter.h Source File (original) (raw)

00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 00015 00016 00017 00018 00019 00020 00021 00022 00023 00024 #ifndef Fennel_SegPageIter_Included 00025 #define Fennel_SegPageIter_Included 00026 00027 #include 00028 #include "fennel/segment/SegmentAccessor.h" 00029 00030 FENNEL_BEGIN_NAMESPACE 00031 00032 class Segment; 00033 00044 class FENNEL_SEGMENT_EXPORT SegPageIter 00045 { 00049 uint prefetchPagesMax; 00050 00055 uint prefetchThrottleRate; 00056 00060 uint currPageSlot; 00061 00065 bool noPrefetch; 00066 00071 uint throttleCount; 00072 00076 bool forceReject; 00077 00078 protected: 00082 SegmentAccessor segmentAccessor; 00083 00087 PageId endPageId; 00088 00092 std::vector prefetchQueue; 00093 00097 uint iFetch; 00098 00103 bool atEnd; 00104 00108 uint queueSize; 00109 00114 int nFreePageSlots; 00115 00120 void initPrefetchQueue(); 00121 00127 void prefetchPage(PageId pageId); 00128 00129 public: 00133 explicit SegPageIter(); 00134 00148 void mapRange( 00149 SegmentAccessor const &segmentAccessor, 00150 PageId beginPageId, 00151 PageId endPageId = NULL_PAGE_ID); 00152 00156 PageId operator *() const 00157 { 00158 assert(!isSingular()); 00159 return prefetchQueue[iFetch]; 00160 } 00161 00166 void operator ++ (); 00167 00172 void forcePrefetchReject(); 00173 00177 void makeSingular() 00178 { 00179 segmentAccessor.reset(); 00180 } 00181 00185 bool isSingular() const 00186 { 00187 return segmentAccessor.pSegment ? false : true; 00188 } 00189 }; 00190 00191 FENNEL_END_NAMESPACE 00192 00193 #endif 00194 00195