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
|
/* This file is part of the Spring engine (GPL v2 or later), see LICENSE.html */
#ifndef PACK_PACKET_H
#define PACK_PACKET_H
#include "RawPacket.h"
#include "System/SafeVector.h"
#include <string>
#include <vector>
#include <cassert>
#include <cstring>
#include <stdexcept>
namespace netcode
{
class PackPacketException : public std::runtime_error {
public:
PackPacketException(const std::string& what) : std::runtime_error(what) {}
};
class PackPacket : public RawPacket
{
public:
PackPacket(const uint32_t length);
PackPacket(const uint32_t length, uint8_t msgID);
template <typename T>
PackPacket& operator<<(const T& t) {
const uint32_t size = sizeof(T);
assert((size + pos) <= length);
*reinterpret_cast<T*>(GetWritingPos()) = t;
pos += size;
return *this;
}
PackPacket& operator<<(const std::string& text);
template <typename element>
PackPacket& operator<<(const std::vector<element>& vec) {
const size_t size = vec.size() * sizeof(element);
assert((size + pos) <= length);
if (size > 0) {
std::memcpy(GetWritingPos(), (void*)(vec.data()), size);
pos += size;
}
return *this;
}
#ifdef USE_SAFE_VECTOR
template <typename element>
PackPacket& operator<<(const safe_vector<element>& vec) {
const size_t size = vec.size() * sizeof(element);
assert((size + pos) <= length);
if (size > 0) {
std::memcpy(GetWritingPos(), (void*)(vec.data()), size);
pos += size;
}
return *this;
}
#endif
uint8_t* GetWritingPos() { return (data + pos); }
private:
uint8_t id;
uint32_t pos;
};
} // namespace netcode
#endif // PACK_PACKET_H
|