-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtape.cpp
More file actions
106 lines (83 loc) · 2.33 KB
/
Copy pathtape.cpp
File metadata and controls
106 lines (83 loc) · 2.33 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
#include "tape.h"
Tape::Tape(const std::string &path)
: file(path, std::ios::binary | std::ios::in | std::ios::out) {
if (file.is_open()) {
file.seekg(0, std::ios::end);
fileSize = file.tellg();
file.seekg(0, std::ios::beg);
filePath = path;
sizeTapeCell = fileSize / sizeof(T);
}
}
Tape::Tape(std::streampos fileSizeInBytes, const std::string &fileName)
: file(fileName,
std::ios::binary | std::ios::in | std::ios::out | std::ios::trunc) {
if (file.is_open()) {
fileSize = fileSizeInBytes;
const uint numBlocks = fileSizeInBytes / sizeof(T);
filePath = fileName;
sizeTapeCell = fileSize / sizeof(T);
for (uint i = 0; i < numBlocks; i++) {
T zeroByte = 0;
file.write(reinterpret_cast<const char *>(&zeroByte),
sizeof(zeroByte));
}
headBegin();
}
}
T Tape::getData() {
T value;
std::this_thread::sleep_for(
std::chrono::seconds(config.get<uint>("getData")));
file.read(reinterpret_cast<char *>(&value), sizeof(value));
file.seekg(uint(file.tellg()) - BLOCK_SIZE);
return value;
}
void Tape::writeData(T value) {
std::this_thread::sleep_for(
std::chrono::seconds(config.get<uint>("writeData")));
file.write(reinterpret_cast<char *>(&value), sizeof(value));
file.seekg(uint(file.tellg()) - BLOCK_SIZE);
}
void Tape::moveRight() {
if (!isEnd()) {
std::this_thread::sleep_for(
std::chrono::seconds(config.get<uint>("move")));
file.seekg(uint(file.tellg()) + BLOCK_SIZE);
}
}
void Tape::moveLeft() {
if (!isBegin()) {
std::this_thread::sleep_for(
std::chrono::seconds(config.get<uint>("move")));
file.seekg(uint(file.tellg()) - BLOCK_SIZE);
}
}
void Tape::headBegin() {
while (!isBegin()) {
moveLeft();
}
}
void Tape::headEnd() {
while (!isEnd()) {
moveRight();
}
}
bool Tape::isBegin() {
if (file.tellg() == 0 || file.tellg() == -1) {
return true;
}
return false;
}
bool Tape::isEnd() {
if (file.tellg() == fileSize || file.tellg() == -1) {
return true;
}
return false;
}
void Tape::deleteTape() {
file.close();
std::filesystem::remove(filePath);
fileSize = 0;
filePath = "";
}