00001 #ifndef Impala_Core_Feature_VirtualFeatureTableIOBufferReader_h
00002 #define Impala_Core_Feature_VirtualFeatureTableIOBufferReader_h
00003
00004 #include "Core/Feature/VirtualFeatureTable.h"
00005 #include "Core/Matrix/VirtualMatrixIOBufferReader.h"
00006 #include "Core/Column/Read.h"
00007
00008 namespace Impala
00009 {
00010 namespace Core
00011 {
00012 namespace Feature
00013 {
00014
00015
00016 class VirtualFeatureTableIOBufferReader : public VirtualFeatureTable
00017 {
00018 public:
00019
00020 VirtualFeatureTableIOBufferReader(Util::IOBuffer* buffer, bool ownBuffer)
00021 {
00022 Init(buffer, ownBuffer);
00023 }
00024
00025 virtual
00026 ~VirtualFeatureTableIOBufferReader()
00027 {
00028 delete mMatrix;
00029 mMatrix = 0;
00030 if (mOwnBuffer)
00031 {
00032 delete mIOBuffer;
00033 mIOBuffer = 0;
00034 }
00035 }
00036
00037 virtual int
00038 Size() const
00039 {
00040 return mSize;
00041 }
00042
00043 virtual void
00044 GetQuids(Table::QuidTable* quids)
00045 {
00046 mIOBuffer->SetPosition(mBaseOffset + mQuidsOffset);
00047 Column::Read(quids->GetColumn1(), mIOBuffer);
00048 quids->SetSize(Size());
00049 }
00050
00051 virtual int
00052 GetVectorLength() const
00053 {
00054 return mVectorLength;
00055 }
00056
00057 private:
00058
00059 virtual int
00060 GetVectorImpl(int rowNr, Real64* buffer, int bufferSize)
00061 {
00062 return mMatrix->GetRow(rowNr, buffer, bufferSize);
00063 }
00064
00065 void
00066 Init(Util::IOBuffer* buffer, bool ownBuffer)
00067 {
00068 mIOBuffer = buffer;
00069 mOwnBuffer = ownBuffer;
00070 mBaseOffset = buffer->GetPosition();
00071
00072 mIOBuffer->SetPosition(mBaseOffset + 1024);
00073 Int64 footer[16];
00074 Int64 nRead = mIOBuffer->Read(footer, sizeof(Int64) * 16);
00075 mSize = footer[3];
00076 mQuidsOffset = footer[4];
00077 mIOBuffer->SetPosition(mBaseOffset + footer[5]);
00078 mMatrix = new Core::Matrix::VirtualMatrixIOBufferReader<Matrix::Mat>
00079 (mIOBuffer, false);
00080 mVectorLength = mMatrix->NrCol();
00081 }
00082
00083 Util::IOBuffer* mIOBuffer;
00084 bool mOwnBuffer;
00085 Int64 mBaseOffset;
00086 Int64 mQuidsOffset;
00087 Int64 mSize;
00088 Int64 mVectorLength;
00089 Matrix::VirtualMatrix* mMatrix;
00090
00091 ILOG_VAR_DEC;
00092 };
00093
00094 ILOG_VAR_INIT(VirtualFeatureTableIOBufferReader, Impala.Core.Feature);
00095
00096 }
00097 }
00098 }
00099
00100 #endif