1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
typedef struct _TDataChunk
{
int nType; // Type : Numeric, String or Binary (Redondant pour plus de surete)
int nSFID; // FileID
int nRecNo; // RecNo
int nRecLen ; // Record Length
int nRecOffset; // Offset From Record
int nBuffOffset;// Offset from Linear Buffer
int nDataOffset;// Sert à trier
int nChunkSize; // Size in BITS of the chunk
} TDataChunk;
typedef struct _TDataInfo
{
_TDataInfo() {}
_TDataInfo(int CustomSize, int Type, int StdSize)
{
nType = Type;
nStdSize = StdSize;
nCustomSize = CustomSize;
}
int nType; // Type : Numeric, String or Binary
int nStdSize; // Standard architecture size (8, 16, 32 or 64)
int nCustomSize; // DataLen in BITS
std::list<TDataChunk> chunklist;
} TDataInfo;
void CDataIndex::AddDataChunk(LPCTSTR szTag, int nStdSize, TDataChunk dataChunk)
{
map<CString, TDataInfo>::iterator it = NULL;
// Si la donnée recherché n'existe pas on la crée
it = m_dataIndex.find(szTag);
if ( it == m_dataIndex.end() ){
m_dataIndex[ szTag ] = TDataInfo(dataChunk.nChunkSize, dataChunk.nType, nStdSize);
it = m_dataIndex.begin(); // on pointe sur le nouvel element
}
// Clé existe alors on verifie d'abord le type
if ( (*it).second.nType != dataChunk.nType ){
CMisc::Message( _T("Erreur de mapping : une donnée fragmentée comporte des types différents\n") );
}
// On ajoute le bout de donnée
m_dataIndex[ szTag ].chunklist.push_back( dataChunk );
// Maintenant on trie par DataOffset
std::sort((*it).second.chunklist.begin(), (*it).second.chunklist.end(), SortByDataOffset() );
} |
Partager