Fennel: /home/pub/open/dev/fennel/lucidera/bitmap/LbmSegment.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 #ifndef Fennel_LbmSegment_Included 00023 #define Fennel_LbmSegment_Included 00024 00025 #include "fennel/lucidera/colstore/LcsClusterNode.h" 00026 00027 FENNEL_BEGIN_NAMESPACE 00028 00034 class FENNEL_LBM_EXPORT LbmSegment 00035 : public boost::noncopyable 00036 { 00037 protected: 00042 LcsRid startRID; 00043 00047 PBuffer pSegDescStart; 00048 PBuffer pSegDescEnd; 00049 00053 PBuffer pSegStart; 00054 PBuffer pSegEnd; 00055 00060 static const uint LbmHalfByteSize = 4; 00061 00066 static const uint8_t LbmSegLengthMask = 0xf0; 00067 00073 static const uint8_t LbmZeroLengthMask = 0x0f; 00074 00081 static const uint LbmZeroLengthCompact = 12; 00082 00088 static const uint LbmZeroLengthExtended = 00089 (uint)LbmZeroLengthMask - LbmZeroLengthCompact; 00090 00095 static const uint LbmMaxSegSize = 16; 00096 00107 static uint byteArray2Value(PBuffer array, uint arraySize); 00108 00121 static uint value2ByteArray(uint value, PBuffer array, uint arraySize); 00122 00132 uint computeSpaceForZeroBytes(uint nZeroBytes); 00133 00147 static void readSegDescAndAdvance( 00148 PBuffer &pSegDesc, uint &bmSegLen, uint &zeroBytes); 00149 00160 uint computeSegLength(PBuffer segDesc); 00161 00173 uint computeSegDescLength(PBuffer segDesc); 00174 00178 uint countSegments(); 00179 00180 public: 00188 static inline LcsRid roundToByteBoundary(LcsRid rid); 00189 00199 static inline bool setSegLength(uint8_t &segDescByte, uint segLen); 00200 00211 static inline bool adjustSegLength(uint8_t &segDescByte, uint segLen); 00212 00218 static inline uint getSegLength(uint8_t segDescByte); 00219 00225 inline uint getZeroLengthByteCount(uint8_t segDescByte); 00226 00230 inline LcsRid getStartRID(); 00231 00235 static const uint LbmOneByteSize = 8; 00236 static const uint LbmOneByteSizeBitShift = 3; 00237 static const LcsRidPrimitive LbmOneByteSizeBitMask = 00238 0xfffffffffffffff8ULL; 00239 }; 00240 00241 inline LcsRid LbmSegment::roundToByteBoundary(LcsRid rid) 00242 { 00243 return LcsRid(opaqueToInt(rid) & LbmOneByteSizeBitMask); 00244 } 00245 00246 inline bool LbmSegment::setSegLength(uint8_t &segDescByte, uint segLen) 00247 { 00248 if (segLen > LbmMaxSegSize) { 00249 return false; 00250 } 00251 segDescByte = (uint8_t) ((segLen - 1) << LbmHalfByteSize); 00252 return true; 00253 } 00254 00255 inline bool LbmSegment::adjustSegLength(uint8_t &segDescByte, uint segLen) 00256 { 00257 if (segLen > LbmMaxSegSize) { 00258 return false; 00259 } 00260 segDescByte &= ~LbmSegLengthMask; 00261 segDescByte |= (uint8_t) ((segLen - 1) << LbmHalfByteSize); 00262 return true; 00263 } 00264 00265 inline uint LbmSegment::getSegLength(uint8_t segDescByte) 00266 { 00267 return (((segDescByte & LbmSegLengthMask) >> LbmHalfByteSize) + 1); 00268 } 00269 00270 inline uint LbmSegment::getZeroLengthByteCount(uint8_t segDescByte) 00271 { 00272 uint lengthBytes = segDescByte & LbmZeroLengthMask; 00273 if (lengthBytes > LbmZeroLengthCompact) { 00274 return (lengthBytes - LbmZeroLengthCompact); 00275 } else { 00276 return 0; 00277 } 00278 } 00279 00280 inline LcsRid LbmSegment::getStartRID() 00281 { 00282 return startRID; 00283 } 00284 00289 DEFINE_OPAQUE_INTEGER(LbmByteNumber, uint64_t); 00290 00294 inline LbmByteNumber ridToByteNumber(LcsRid rid) 00295 { 00296 return LbmByteNumber( 00297 opaqueToInt(rid) >> LbmSegment::LbmOneByteSizeBitShift); 00298 } 00299 00303 inline LcsRid byteNumberToRid(LbmByteNumber byteNum) 00304 { 00305 return LcsRid( 00306 opaqueToInt(byteNum) << LbmSegment::LbmOneByteSizeBitShift); 00307 } 00308 00309 FENNEL_END_NAMESPACE 00310 00311 #endif 00312 00313