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_BTreeHeapNodeAccessor_Included
00025 #define Fennel_BTreeHeapNodeAccessor_Included
00026
00027 #include "fennel/btree/BTreeNodeAccessor.h"
00028
00029 FENNEL_BEGIN_NAMESPACE
00030
00037 class FENNEL_BTREE_EXPORT BTreeHeapNodeAccessor
00038 : public BTreeNodeAccessor
00039 {
00040
00041 typedef uint16_t EntryOffset;
00042
00043 inline EntryOffset const *getEntryOffsetPointer(
00044 BTreeNode const &node,uint iEntry);
00045
00046 inline EntryOffset *getEntryOffsetPointer(
00047 BTreeNode &node,uint iEntry);
00048
00049 inline uint getEntryOffset(BTreeNode const &node,uint iEntry);
00050
00051 inline uint getEntrySizeWithOverhead(uint cbEntry);
00052
00053 inline uint getEntryOffsetArrayByteSize(uint nEntries);
00054
00055 public:
00056 explicit BTreeHeapNodeAccessor();
00057
00058 inline PConstBuffer getEntryForReadInline(
00059 BTreeNode const &node,uint iEntry);
00060
00061
00062 virtual void clearNode(BTreeNode &node,uint cbPage);
00063 virtual PBuffer allocateEntry(BTreeNode &node,uint iEntry,uint cbEntry);
00064 virtual void deallocateEntry(BTreeNode &node,uint iEntry);
00065 virtual bool hasFixedWidthEntries() const;
00066 virtual Capacity calculateCapacity(BTreeNode const &node,uint cbEntry);
00067 virtual uint getEntryByteCount(uint cbTuple);
00068 };
00069
00070 inline BTreeHeapNodeAccessor::EntryOffset const *
00071 BTreeHeapNodeAccessor::getEntryOffsetPointer(
00072 BTreeNode const &node,uint iEntry)
00073 {
00074 return reinterpret_cast<EntryOffset const *>(node.getDataForRead())
00075 + iEntry;
00076 }
00077
00078 inline BTreeHeapNodeAccessor::EntryOffset *
00079 BTreeHeapNodeAccessor::getEntryOffsetPointer(
00080 BTreeNode &node,uint iEntry)
00081 {
00082 return reinterpret_cast<EntryOffset *>(node.getDataForWrite())
00083 + iEntry;
00084 }
00085
00086 inline uint BTreeHeapNodeAccessor::getEntryOffset(
00087 BTreeNode const &node,uint iEntry)
00088 {
00089 assert(iEntry < node.nEntries);
00090 return *getEntryOffsetPointer(node,iEntry);
00091 }
00092
00093 inline uint BTreeHeapNodeAccessor::getEntrySizeWithOverhead(uint cbEntry)
00094 {
00095 return cbEntry + sizeof(EntryOffset);
00096 }
00097
00098 inline uint BTreeHeapNodeAccessor::getEntryOffsetArrayByteSize(uint nEntries)
00099 {
00100 assert(sizeof(EntryOffset) == 2);
00101 return nEntries << 1;
00102 }
00103
00104 inline PConstBuffer BTreeHeapNodeAccessor::getEntryForReadInline(
00105 BTreeNode const &node,uint iEntry)
00106 {
00107 uint offset = getEntryOffset(node,iEntry);
00108 return reinterpret_cast<PConstBuffer>(&node) + offset;
00109 }
00110
00111 FENNEL_END_NAMESPACE
00112
00113 #endif
00114
00115