File: pvFile.cc

package info (click to toggle)
gpsshogi 0.7.0-3.3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 111,280 kB
  • sloc: cpp: 80,962; perl: 12,610; ruby: 3,929; javascript: 1,631; makefile: 1,202; sh: 473; tcl: 166; ansic: 67
file content (103 lines) | stat: -rw-r--r-- 1,996 bytes parent folder | download | duplicates (5)
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: