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 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
/* pvFile.cc
*/
#include "pvFile.h"
#include "pvVector.h"
gpsshogi::
PVFileWriter::PVFileWriter(const char *filename)
: fp(gzopen(filename, "wb9")), written(0)
{
}
gpsshogi::
PVFileWriter::~PVFileWriter()
{
gzclose(fp);
}
void gpsshogi::
PVFileWriter::newPosition(int record, int position)
{
if (written) {
Move invalid;
gzwrite(fp, &invalid, sizeof(invalid));
}
++written;
gzwrite(fp, &record, sizeof(record));
gzwrite(fp, &position, sizeof(position));
}
void gpsshogi::
PVFileWriter::addPv(const PVVector& pv)
{
assert(! pv.empty());
gzwrite(fp, &pv[0], sizeof(Move)*pv.size());
Move invalid;
gzwrite(fp, &invalid, sizeof(invalid));
}
/* ------------------------------------------------------------------------- */
gpsshogi::
PVFileReader::PVFileReader(const char *filename)
: fp(gzopen(filename, "rb"))
{
}
gpsshogi::
PVFileReader::~PVFileReader()
{
gzclose(fp);
}
bool gpsshogi::
PVFileReader::newPosition(int& record, int& position)
{
int r0 = gzread(fp, &record, sizeof(record));
int r1 = gzread(fp, &position, sizeof(position));
return r0 == sizeof(record) && r1 == sizeof(position);
}
bool gpsshogi::
PVFileReader::readPv(PVVector& pv)
{
pv.clear();
Move m;
gzread(fp, &m, sizeof(m));
if (m.isInvalid())
return false;
do {
pv.push_back(m);
gzread(fp, &m, sizeof(m));
} while (! m.isInvalid());
return true;
}
void gpsshogi::
PVFileReader::count(const char *filename, int& num_position, int& num_pv)
{
num_position = num_pv = 0;
PVFileReader pr(filename);
int record, position;
PVVector pv;
while (pr.newPosition(record, position)) {
++num_position;
while (pr.readPv(pv))
++num_pv;
}
}
int gpsshogi::
PVFileReader::countPosition(const char *filename)
{
int position, pv;
count(filename, position, pv);
return position;
}
/* ------------------------------------------------------------------------- */
// ;;; Local Variables:
// ;;; mode:c++
// ;;; c-basic-offset:2
// ;;; End:
|