36 char const* what() const noexcept
override {
return msg_.c_str(); }
39 std::string &
message() noexcept {
return msg_; }
72 constexpr static size_t DEFAULT_SIZE = 0x1000;
77 _storage.reserve(DEFAULT_SIZE);
82 _storage.reserve(reserve);
93 std::vector<uint8>&&
Move()
97 return std::move(_storage);
118 _storage = right.Move();
133 template <
typename T>
void append(T value)
135 static_assert(std::is_fundamental<T>::value,
"append(compound)");
137 append((
uint8 *)&value,
sizeof(value));
140 template <
typename T>
141 void put(std::size_t pos, T value)
143 static_assert(std::is_fundamental<T>::value,
"append(compound)");
145 put(pos, (
uint8 *)&value,
sizeof(value));
150 append<uint8>(value ? 1 : 0);
156 append<uint8>(value);
162 append<uint16>(value);
168 append<uint32>(value);
174 append<uint64>(value);
187 append<int16>(value);
193 append<int32>(value);
199 append<int64>(value);
206 append<float>(value);
212 append<double>(value);
218 if (
size_t len = value.length())
219 append(
reinterpret_cast<uint8 const*
>(value.data()), len);
220 append(
static_cast<uint8>(0));
231 return operator<<(std::string_view(str ? str :
""));
236 value = read<char>() > 0 ? true :
false;
242 value = read<uint8>();
248 value = read<uint16>();
254 value = read<uint32>();
260 value = read<uint64>();
267 value = read<int8>();
273 value = read<int16>();
279 value = read<int32>();
285 value = read<int64>();
294 value = ReadCString(
true);
302 return _storage[pos];
309 return _storage[pos];
312 size_t rpos()
const {
return _rpos; }
325 size_t wpos()
const {
return _wpos; }
338 if (_rpos + skip > size())
345 T r = read<T>(_rpos);
350 template <
typename T> T
read(
size_t pos)
const
352 if (pos +
sizeof(T) > size())
354 T val = *((T
const*)&_storage[pos]);
361 if (_rpos + len > size())
363 std::memcpy(dest, &_storage[_rpos], len);
367 template <
size_t Size>
368 void read(std::array<uint8, Size>& arr)
370 read(arr.data(), Size);
375 if (rpos() + 1 > size())
383 for (
int i = 0; i < 8; ++i)
385 if (guidmark & (
uint8(1) << i))
387 if (rpos() + 1 > size())
392 guid |= (
uint64(bit) << (i * 8));
397 std::string ReadCString(
bool requireValidUtf8 =
true);
401 if (_storage.empty())
403 return _storage.data();
408 if (_storage.empty())
410 return _storage.data();
413 size_t size()
const {
return _storage.size(); }
414 bool empty()
const {
return _storage.empty(); }
418 _storage.resize(newsize, 0);
425 if (ressize > size())
426 _storage.reserve(ressize);
431 _storage.shrink_to_fit();
436 return append((
const uint8 *)src, cnt);
439 template<
class T>
void append(
const T *src,
size_t cnt)
441 return append((
const uint8 *)src, cnt *
sizeof(T));
444 void append(
uint8 const* src,
size_t cnt);
452 template <
size_t Size>
453 void append(std::array<uint8, Size>
const& arr)
455 append(arr.data(), Size);
462 packed |= ((int)(x / 0.25f) & 0x7FF);
463 packed |= ((int)(y / 0.25f) & 0x7FF) << 11;
464 packed |= ((int)(z / 0.25f) & 0x3FF) << 22;
473 for (
uint8 i = 0;guid != 0;++i)
477 packGUID[0] |=
uint8(1 << i);
478 packGUID[size] =
uint8(guid & 0xFF);
484 append(packGUID, size);
487 void put(
size_t pos,
const uint8 *src,
size_t cnt);
489 void print_storage()
const;
491 void textlike()
const;
493 void hexlike()
const;
501template<>
inline std::string ByteBuffer::read<std::string>()
509inline void ByteBuffer::read_skip<char*>()
516inline void ByteBuffer::read_skip<char const*>()
522inline void ByteBuffer::read_skip<std::string>()
void EndianConvert(T &val)
ByteBuffer & operator<<(ByteBuffer &buf, ObjectGuid const &guid)
ByteBuffer & operator>>(ByteBuffer &buf, ObjectGuid &guid)
~ByteBufferException() noexcept=default
std::string & message() noexcept
~ByteBufferInvalidValueException() noexcept=default
~ByteBufferPositionException() noexcept=default
~ByteBufferSourceException() noexcept=default
ByteBuffer & operator<<(bool value)
void append(std::array< uint8, Size > const &arr)
void read(std::array< uint8, Size > &arr)
ByteBuffer & operator<<(uint32 value)
ByteBuffer & operator>>(int64 &value)
ByteBuffer & operator<<(double value)
ByteBuffer & operator<<(std::string const &str)
ByteBuffer(size_t reserve)
void appendPackXYZ(float x, float y, float z)
ByteBuffer & operator>>(uint32 &value)
ByteBuffer & operator<<(uint8 value)
std::vector< uint8 > _storage
ByteBuffer & operator<<(int32 value)
void reserve(size_t ressize)
uint8 const * contents() const
ByteBuffer & operator=(ByteBuffer const &right)
void appendPackGUID(uint64 guid)
ByteBuffer & operator<<(int64 value)
ByteBuffer & operator<<(std::string_view value)
std::vector< uint8 > && Move()
void resize(size_t newsize)
ByteBuffer & operator>>(int16 &value)
void read_skip(size_t skip)
ByteBuffer & operator>>(uint8 &value)
ByteBuffer & operator<<(float value)
void append(const T *src, size_t cnt)
ByteBuffer & operator>>(int8 &value)
ByteBuffer & operator>>(uint16 &value)
uint8 & operator[](size_t const pos)
uint8 const & operator[](size_t const pos) const
ByteBuffer & operator<<(uint16 value)
void append(ByteBuffer const &buffer)
ByteBuffer & operator>>(std::string &value)
ByteBuffer & operator=(ByteBuffer &&right) noexcept
size_t rpos(size_t rpos_)
void put(std::size_t pos, T value)
ByteBuffer(ByteBuffer &&buf) noexcept
ByteBuffer & operator>>(int32 &value)
ByteBuffer & operator<<(uint64 value)
ByteBuffer & operator<<(int16 value)
ByteBuffer(ByteBuffer const &right)=default
void readPackGUID(uint64 &guid)
size_t wpos(size_t wpos_)
ByteBuffer & operator<<(int8 value)
void append(const char *src, size_t cnt)
ByteBuffer & operator>>(bool &value)
ByteBuffer & operator>>(uint64 &value)
ByteBuffer & operator<<(char const *str)
virtual ~ByteBuffer()=default
void read(uint8 *dest, size_t len)