Skip to content

Commit ff86b3e

Browse files
authored
Merge pull request #254 from HyperloopUPV-H8/features/packetarray
Features/packetarray
2 parents f09c94a + 7c40ca8 commit ff86b3e

2 files changed

Lines changed: 63 additions & 2 deletions

File tree

Inc/HALAL/Models/Packets/Packet.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ class HeapPacket : public Packet{
214214
HeapPacket() = default;
215215

216216
template<class... Types>
217-
HeapPacket(uint16_t id, Types*... values): id(id), values{new PacketValue<Types>(values)...} {packets[id] = this;}
217+
HeapPacket(uint16_t id, Types*... values): id(id), values{new PacketValue(values)...} {packets[id] = this;}
218218

219219
void parse(void* data) override {
220220
data += sizeof(id);

Inc/HALAL/Models/Packets/PacketValue.hpp

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class PacketValue<> {
4444
virtual void copy_to(void* data) = 0;
4545
};
4646

47-
template<class Type> requires NotContainer<Type>
47+
template<class Type> requires NotContainer<Type>
4848
class PacketValue<Type>: public PacketValue<> {
4949
public:
5050
using value_type = Type;
@@ -119,3 +119,64 @@ class PacketValue<string> : public PacketValue<>{
119119
template<class Type> requires Container<Type>
120120
PacketValue(Type)->PacketValue<Type>;
121121
#endif
122+
123+
template<class Type,size_t N>
124+
class PacketValue<Type(&)[N]>: public PacketValue<> {
125+
public:
126+
using value_type = Type;
127+
Type(*src )[N] = nullptr;
128+
PacketValue() = default;
129+
PacketValue(Type(*src)[N]): src(src) {}
130+
~PacketValue() = default;
131+
void* get_pointer() override {
132+
return src;
133+
}
134+
size_t get_size() override {
135+
return N*sizeof(Type);
136+
}
137+
void parse(void* data) override {
138+
memcpy(src, data, get_size());
139+
}
140+
void copy_to(void* data) override {
141+
memcpy(data, src, get_size());
142+
}
143+
};
144+
145+
#if __cpp_deduction_guides >= 201606
146+
template<class Type,size_t N>
147+
PacketValue(Type(*)[N])->PacketValue<Type(&)[N]>;
148+
#endif
149+
150+
151+
template<class Type,size_t N>
152+
class PacketValue<Type*(&)[N]>: public PacketValue<> {
153+
public:
154+
using value_type = Type*;
155+
Type*(*src )[N] = nullptr;
156+
PacketValue() = default;
157+
PacketValue(Type*(*src)[N]): src(src) {}
158+
~PacketValue() = default;
159+
void* get_pointer() override {
160+
return src;
161+
}
162+
size_t get_size() override {
163+
return N*sizeof(Type);
164+
}
165+
void parse(void* data) override {
166+
for(Type* i : *src) {
167+
*i = *(Type*)data;
168+
data += sizeof(Type);
169+
}
170+
}
171+
void copy_to(void* data) override {
172+
for(Type* i : *src) {
173+
*(Type*)data = *i;
174+
data += sizeof(Type);
175+
}
176+
}
177+
};
178+
179+
#if __cpp_deduction_guides >= 201606
180+
template<class Type,size_t N>
181+
PacketValue(Type*(*)[N])->PacketValue<Type*(&)[N]>;
182+
#endif

0 commit comments

Comments
 (0)