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 <vector>
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<PageId> 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