18
|
1 #ifndef TABLE_HPP
|
|
2 #define TABLE_HPP
|
|
3
|
|
4 #include <iostream>
|
|
5 #include <fstream>
|
|
6 #include <string>
|
|
7 #include <stdio.h>
|
|
8 using namespace std;
|
|
9
|
|
10 typedef unsigned int Value;
|
|
11 static const unsigned int SENTINEL = -1;
|
|
12
|
|
13 class Table {
|
|
14 private:
|
|
15 int sentinel;
|
|
16 Value *values;
|
|
17
|
|
18 public:
|
|
19 string fileName;
|
|
20 unsigned int width;
|
|
21 unsigned int height;
|
|
22 fstream file;
|
|
23
|
|
24 Table (string fileName, unsigned int width, unsigned int height): sentinel(-1), fileName(fileName), width(width), height(height) {
|
|
25 file.open(fileName.c_str(), ios::out | ios::in | ios::binary);
|
|
26 Value v = 0;
|
|
27 for (unsigned int i = 0; i < width * height; i++) {
|
|
28 writeHere(v);
|
|
29 }
|
|
30 file.flush();
|
|
31 values = new Value[width];
|
|
32 }
|
|
33
|
|
34 ~Table () {
|
|
35 delete[] values;
|
|
36 }
|
|
37
|
|
38 void moveTo (unsigned int col, unsigned int line) {
|
|
39 if (col == SENTINEL) {
|
|
40 sentinel = line;
|
|
41 }
|
|
42 else {
|
|
43 sentinel = -1;
|
|
44 file.seekp((col * width + line) * sizeof(Value));
|
|
45 }
|
|
46 }
|
|
47
|
|
48 void write (Value v, unsigned int col, unsigned int line) {
|
|
49 moveTo(col, line);
|
|
50 writeHere(v);
|
|
51 }
|
|
52
|
|
53 void writeHere(Value v) {
|
|
54 if (sentinel >= 0)
|
|
55 values[sentinel] = v;
|
|
56 else
|
|
57 file.write(reinterpret_cast<const char*>(&v), sizeof(Value));
|
|
58 }
|
|
59
|
|
60
|
|
61 Value read (unsigned int col, unsigned int line) {
|
|
62 moveTo(col, line);
|
|
63 return readHere();
|
|
64 }
|
|
65
|
|
66 Value readHere () {
|
|
67 if (sentinel >= 0) {
|
|
68 return values[sentinel];
|
|
69 }
|
|
70 else {
|
|
71 Value v;
|
|
72 file.read(reinterpret_cast<char*>(&v), sizeof(Value));
|
|
73 return v;
|
|
74 }
|
|
75 }
|
|
76
|
|
77 void destroy () {
|
|
78 file.close();
|
|
79 remove(fileName.c_str());
|
|
80 }
|
|
81
|
|
82 };
|
|
83
|
|
84 #endif
|