-
Notifications
You must be signed in to change notification settings - Fork 0
/
writebuffer.h
70 lines (56 loc) · 1.42 KB
/
writebuffer.h
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
#pragma once
class WriteBuffer {
byte* buffer;
size_t raise;
long initial, size, len;
public:
WriteBuffer() : WriteBuffer(1024, 500) {}
WriteBuffer(size_t initial, size_t raise) {
this->initial = initial;
this->raise = raise;
this->reset();
}
void reset() {
if (this->buffer) delete[] this->buffer;
this->buffer = new byte[this->initial];
this->size = this->initial;
this->len = 0;
}
void Oversize(int b_len) {
int target = this->len + b_len;
if (target < this->size) return;
while (target > (this->size += this->raise));
byte* tmp = new byte[this->size];
if (len) memcpy(tmp, this->buffer, this->len + 1);
delete[] this->buffer;
this->buffer = tmp;
}
void write(byte* bytes, int b_len) {
Oversize(b_len);
memcpy(&this->buffer[this->len], bytes, b_len);
this->len += b_len;
}
void rewrite(byte* bytes, long pos, int b_len) {
memcpy(&this->buffer[pos], bytes, b_len);
}
void write(ReadBuffer& rf, long pos, int b_len) {
byte* tmp = new byte[b_len];
rf.get(tmp, pos, b_len);
this->write(tmp, b_len);
delete[] tmp;
}
long lensub(int sub = 0) {
return this->len - sub;
}
byte* fbuf() {
return this->buffer;
}
void outFile(const char* filepath) {
FILE* fp = fopen(filepath, "wb");
fwrite(this->buffer, 1, this->len, fp);
fclose(fp);
}
~WriteBuffer() {
if (this->buffer) delete[] this->buffer;
}
};