/
Piece.h
106 lines (84 loc) · 1.71 KB
/
Piece.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
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
#ifndef __TORRENTSTREAM_PIECE_H
#define __TORRENTSTREAM_PIECE_H
namespace TorrentStream
{
class Piece
{
public:
Piece(size_t size) : m_Size(size)
{
}
Piece(size_t size, const std::vector<char>& hash) : m_Size(size), m_Hash(hash)
{
}
Piece(const Piece&) = delete;
Piece(Piece&& p)
{
m_Data = std::move(p.m_Data);
m_Hash = p.m_Hash;
m_Size = p.m_Size;
m_IsComplete = p.m_IsComplete;
m_IsWrittenOut = p.m_IsWrittenOut;
}
void SubmitData(size_t offset, const std::vector<char>& data)
{
if (m_Data == nullptr)
{
m_Data = std::make_unique<std::vector<char>>();
}
if (offset + data.size() > m_Data->size())
{
m_Data->resize(offset + data.size());
}
if (offset + data.size() > m_Size)
{
std::cout << "data out of bounds" << std::endl;
return;
}
memcpy(m_Data->data() + offset, data.data(), data.size());
m_SubmittedBytes += data.size();
m_SubmittedOffsets.push_back(offset);
}
const std::vector<char>& GetHash() const
{
return m_Hash;
}
void SetHash(const std::vector<char>& hash)
{
m_Hash = hash;
}
const std::vector<char>& GetData() const
{
return *m_Data;
}
bool IsComplete() const
{
return m_IsComplete;
}
void SetComplete(bool state)
{
m_IsComplete = state;
}
bool IsWrittenOut()
{
return m_IsWrittenOut;
}
void SetWrittenOut(bool state)
{
m_IsWrittenOut = state;
if (m_IsWrittenOut)
{
m_Data = nullptr;
}
}
private:
size_t m_Size = 0;
size_t m_SubmittedBytes = 0;
std::vector<size_t> m_SubmittedOffsets;
std::vector<char> m_Hash;
std::unique_ptr<std::vector<char>> m_Data;
bool m_IsComplete = false;
bool m_IsWrittenOut = false;
};
}
#endif