| 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 |