-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPatternDatabase.cpp
More file actions
113 lines (85 loc) · 2.68 KB
/
PatternDatabase.cpp
File metadata and controls
113 lines (85 loc) · 2.68 KB
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
104
105
106
107
108
109
110
111
112
113
//
// Created by Ayushi Saha on 16-12-2022.
//
#include "PatternDatabase.h"
using namespace std;
//Database operations are performed.
PatternDatabase::PatternDatabase(const size_t size) :
database(size, 0xFF), size(size), numItems(0) {
}
PatternDatabase::PatternDatabase(const size_t size, uint8_t init_val) :
database(size, init_val), size(size), numItems(0) {
}
// If the index is already set, it does nothing and returns false
// Else it sets ind and returns true
bool PatternDatabase::setNumMoves(const uint32_t ind, const uint8_t numMoves) {
uint8_t oldMoves = this->getNumMoves(ind);
// New item is getting added
if(oldMoves == 0xF){
++this->numItems;
}
if(oldMoves > numMoves){
this->database.set(ind, numMoves);
return true;
}
return false;
}
bool PatternDatabase::setNumMoves(const Generic_Rubiks_Cube &cube, const uint8_t numMoves) {
return this->setNumMoves(this->getDatabaseIndex(cube), numMoves);
}
uint8_t PatternDatabase::getNumMoves(const uint32_t ind) const {
return this->database.get(ind);
}
uint8_t PatternDatabase::getNumMoves(const Generic_Rubiks_Cube &cube) const {
return this->getNumMoves(this->getDatabaseIndex(cube));
}
size_t PatternDatabase::getSize() const {
return this->size;
}
size_t PatternDatabase::getNumItems() const {
return this->numItems;
}
bool PatternDatabase::isFull() const {
return this->numItems == this->size;
}
void PatternDatabase::toFile(const string &filePath) const {
ofstream writer(filePath, ios::out | ios::binary | ios::trunc);
if(!writer.is_open())
throw "Failed to open the file to write";
writer.write(
reinterpret_cast<const char*>(this->database.data()),
this->database.storageSize()
);
writer.close();
}
// Returns true of database is loaded successfully
// else return false
bool PatternDatabase::fromFile(const string &filePath) {
ifstream reader(filePath, ios::in | ios::ate);
if(!reader.is_open())
return false;
size_t fileSize = reader.tellg();
if(fileSize != this->database.storageSize()){
reader.close();
throw "Database corrupt! Failed to open Reader";
}
reader.seekg(0, ios::beg);
reader.read(
reinterpret_cast<char*> (this->database.data()),
this->database.storageSize()
);
reader.close();
this->numItems = this->size;
return true;
}
vector<uint8_t> PatternDatabase::inflate() const {
vector<uint8_t> inflated;
this->database.inflate(inflated);
return inflated;
}
void PatternDatabase::reset() {
if(this->numItems != 0){
this->database.reset(0xFF);
this->numItems = 0;
}
}