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_TupleAccessor_Included
00025 #define Fennel_TupleAccessor_Included
00026 
00027 #include "fennel/tuple/TupleFormat.h"
00028 
00029 #include <boost/dynamic_bitset.hpp>
00030 #include <boost/utility.hpp>
00031 #include <vector>
00032 
00033 FENNEL_BEGIN_NAMESPACE
00034 
00035 class TupleData;
00036 class TupleDescriptor;
00037 class AttributeAccessor;
00038 
00039 
00040 
00041 
00048 class FENNEL_TUPLE_EXPORT TupleAccessor
00049     : public boost::noncopyable
00050 {
00054     std::vector<AttributeAccessor *> ppAttributeAccessors;
00055 
00059     VectorOfUint pVarWidthAttrIndices;
00060 
00066     VectorOfUint marshalOrder;
00067 
00071     uint cbMaxStorage;
00072 
00076     uint cbMinStorage;
00077 
00081     uint nBitFields;
00082 
00086     uint iBitFieldOffset;
00087 
00092     uint iFirstVarEndIndirectOffset;
00093 
00098     uint iLastVarEndIndirectOffset;
00099 
00104     uint iFirstVarOffset;
00105 
00111     bool bAlignedVar;
00112 
00116     PConstBuffer pTupleBuf;
00117 
00121     boost::dynamic_bitset<FixedBuffer> bitFields;
00122 
00123     TupleFormat format;
00124 
00125     
00126     void initFixedAccessors(TupleDescriptor const &,VectorOfUint &);
00127     void clear();
00128 
00129 public:
00130     typedef uint16_t StoredValueOffset;
00131 
00137     static const bool BOOL_TRUE;
00138 
00144     static const bool BOOL_FALSE;
00145 
00146     explicit TupleAccessor();
00147 
00148     virtual ~TupleAccessor();
00149 
00158     void compute(
00159         TupleDescriptor const &tuple,
00160         TupleFormat format = TUPLE_FORMAT_STANDARD);
00161 
00165     uint getMaxByteCount() const
00166     {
00167         return cbMaxStorage;
00168     }
00169 
00173     uint getMinByteCount() const
00174     {
00175         return cbMinStorage;
00176     }
00177 
00181     bool isFixedWidth() const
00182     {
00183         return isMAXU(iFirstVarOffset);
00184     }
00185 
00190     uint getBitFieldOffset() const
00191     {
00192         return iBitFieldOffset;
00193     }
00194 
00200     PConstBuffer getCurrentTupleBuf() const
00201     {
00202         return pTupleBuf;
00203     }
00204 
00216     void setCurrentTupleBuf(PConstBuffer pTupleBuf, bool valid = true);
00217 
00221     void resetCurrentTupleBuf();
00222 
00230     inline uint getCurrentByteCount() const;
00231 
00240     uint getBufferByteCount(PConstBuffer pBuf) const;
00241 
00250     uint getByteCount(TupleData const &tuple) const;
00251 
00261     bool isBufferSufficient(TupleData const &tuple,uint cbBuffer) const;
00262 
00263     
00264     
00276     void unmarshal(TupleData &tuple,uint iFirstDatum = 0) const;
00277 
00284     AttributeAccessor const &getAttributeAccessor(uint iAttribute) const
00285     {
00286         return *(ppAttributeAccessors[iAttribute]);
00287     }
00288 
00297     void marshal(TupleData const &tuple,PBuffer pTupleBuf);
00298 
00302     uint size() const
00303     {
00304         return ppAttributeAccessors.size();
00305     }
00306 
00307     
00308 
00312     boost::dynamic_bitset<FixedBuffer> const &getBitFields() const
00313     {
00314         return bitFields;
00315     }
00316 
00324     StoredValueOffset const *referenceIndirectOffset(uint iIndirectOffset) const
00325     {
00326         return referenceIndirectOffset(
00327             const_cast<PBuffer>(pTupleBuf),
00328             iIndirectOffset);
00329     }
00330 
00340     static StoredValueOffset *referenceIndirectOffset(
00341         PBuffer pTupleBuf,uint iIndirectOffset)
00342     {
00343         return reinterpret_cast<StoredValueOffset *>(
00344             pTupleBuf + iIndirectOffset);
00345     }
00346 };
00347 
00348 inline uint TupleAccessor::getCurrentByteCount() const
00349 {
00350     assert(pTupleBuf);
00351     return getBufferByteCount(pTupleBuf);
00352 }
00353 
00354 FENNEL_END_NAMESPACE
00355 
00356 #endif
00357 
00358