99 lines
2.0 KiB
C++
99 lines
2.0 KiB
C++
/*
|
|
* EntryBuffer.cpp
|
|
*
|
|
* Created on: 2014-7-3
|
|
* Author: hanshuo
|
|
*/
|
|
|
|
#include"EntryBuffer.h"
|
|
#include"../Signature/SigEntry.h"
|
|
#include"../Database/Database.h"
|
|
|
|
int EntryBuffer::DEFAULT_CAPACITY = 2*1000*1000;
|
|
|
|
|
|
EntryBuffer::EntryBuffer(int _capacity)
|
|
{
|
|
this->capacity = _capacity;
|
|
this->num = 0;
|
|
this->elems = new SigEntry[this->capacity];
|
|
}
|
|
|
|
EntryBuffer::~EntryBuffer()
|
|
{
|
|
delete [] this->elems;
|
|
}
|
|
|
|
int EntryBuffer::getCapacity()const
|
|
{
|
|
return this->capacity;
|
|
}
|
|
|
|
int EntryBuffer::getNum()const
|
|
{
|
|
return this->num;
|
|
}
|
|
|
|
bool EntryBuffer::isEmpty()const
|
|
{
|
|
return (this->num == 0);
|
|
}
|
|
|
|
bool EntryBuffer::isFull()const
|
|
{
|
|
return (this->num == this->capacity);
|
|
}
|
|
|
|
SigEntry* EntryBuffer::getElem(int _i)
|
|
{
|
|
return &this->elems[_i];
|
|
}
|
|
|
|
bool EntryBuffer::insert(const SigEntry& _entry)
|
|
{
|
|
if (this->isFull())
|
|
{
|
|
cerr << "error, entry buffer is full, can not insert now in EntryBuffer::insert." << endl;
|
|
return false;
|
|
}
|
|
|
|
this->elems[this->num ++] = _entry;
|
|
|
|
return true;
|
|
}
|
|
|
|
/* clear the entry buffer and fill it from the entry file until the buffer is full or the file ends. */
|
|
int EntryBuffer::fillElemsFromFile(FILE* _p_file)
|
|
{
|
|
this->clear();
|
|
SigEntry entry;
|
|
|
|
|
|
// bug here! if we read an entry, we must put it into buffer. Otherwise this entry will be missed.
|
|
// fread((char *)&entry, sizeof(SigEntry), 1, _p_file);
|
|
// while (!this->isFull() && !feof(_p_file))
|
|
// {
|
|
// this->insert(entry);
|
|
// fread((char *)&entry, sizeof(SigEntry), 1, _p_file);
|
|
// }
|
|
|
|
while (!this->isFull())
|
|
{
|
|
bool is_reach_EOF = feof(_p_file);
|
|
bool is_entry_read = (fread((char *)&entry, sizeof(SigEntry), 1, _p_file) == 1);
|
|
if (is_reach_EOF || !is_entry_read)
|
|
{
|
|
break;
|
|
}
|
|
this->insert(entry);
|
|
}
|
|
|
|
return this->num;
|
|
}
|
|
|
|
void EntryBuffer::clear()
|
|
{
|
|
this->num = 0;
|
|
}
|
|
|