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);
85 ByteBuffer(
ByteBuffer&& buf) noexcept : _rpos(buf._rpos), _wpos(buf._wpos), _storage(std::move(buf._storage))
115 _storage = std::move(right._storage);
129 template <
typename T>
void append(T value)
131 static_assert(std::is_fundamental<T>::value,
"append(compound)");
133 append((
uint8 *)&value,
sizeof(value));
136 template <
typename T>
137 void put(std::size_t pos, T value)
139 static_assert(std::is_fundamental<T>::value,
"append(compound)");
141 put(pos, (
uint8 *)&value,
sizeof(value));
146 append<uint8>(value ? 1 : 0);
152 append<uint8>(value);
158 append<uint16>(value);
164 append<uint32>(value);
170 append<uint64>(value);
183 append<int16>(value);
189 append<int32>(value);
195 append<int64>(value);
202 append<float>(value);
208 append<double>(value);
214 if (
size_t len = value.length())
215 append(
reinterpret_cast<uint8 const*
>(value.data()), len);
216 append(
static_cast<uint8>(0));
227 return operator<<(std::string_view(str ? str :
""));
232 value = read<char>() > 0 ? true :
false;
238 value = read<uint8>();
244 value = read<uint16>();
250 value = read<uint32>();
256 value = read<uint64>();
263 value = read<int8>();
269 value = read<int16>();
275 value = read<int32>();
281 value = read<int64>();
290 value = ReadCString(
true);
298 return _storage[pos];
305 return _storage[pos];
308 size_t rpos()
const {
return _rpos; }
321 size_t wpos()
const {
return _wpos; }
334 if (_rpos + skip > size())
341 T r = read<T>(_rpos);
346 template <
typename T> T
read(
size_t pos)
const
348 if (pos +
sizeof(T) > size())
350 T val = *((T
const*)&_storage[pos]);
357 if (_rpos + len > size())
359 std::memcpy(dest, &_storage[_rpos], len);
363 template <
size_t Size>
364 void read(std::array<uint8, Size>& arr)
366 read(arr.data(), Size);
371 if (rpos() + 1 > size())
379 for (
int i = 0; i < 8; ++i)
381 if (guidmark & (
uint8(1) << i))
383 if (rpos() + 1 > size())
388 guid |= (
uint64(bit) << (i * 8));
393 std::string ReadCString(
bool requireValidUtf8 =
true);
397 if (_storage.empty())
399 return _storage.data();
404 if (_storage.empty())
406 return _storage.data();
409 size_t size()
const {
return _storage.size(); }
410 bool empty()
const {
return _storage.empty(); }
414 _storage.resize(newsize, 0);
421 if (ressize > size())
422 _storage.reserve(ressize);
427 _storage.shrink_to_fit();
432 return append((
const uint8 *)src, cnt);
435 template<
class T>
void append(
const T *src,
size_t cnt)
437 return append((
const uint8 *)src, cnt *
sizeof(T));
440 void append(
uint8 const* src,
size_t cnt);
448 template <
size_t Size>
449 void append(std::array<uint8, Size>
const& arr)
451 append(arr.data(), Size);
458 packed |= ((int)(x / 0.25f) & 0x7FF);
459 packed |= ((int)(y / 0.25f) & 0x7FF) << 11;
460 packed |= ((int)(z / 0.25f) & 0x3FF) << 22;
469 for (
uint8 i = 0;guid != 0;++i)
473 packGUID[0] |=
uint8(1 << i);
474 packGUID[size] =
uint8(guid & 0xFF);
480 append(packGUID, size);
483 void put(
size_t pos,
const uint8 *src,
size_t cnt);
485 void print_storage()
const;
487 void textlike()
const;
489 void hexlike()
const;
497template<>
inline std::string ByteBuffer::read<std::string>()
505inline void ByteBuffer::read_skip<char*>()
512inline void ByteBuffer::read_skip<char const*>()
518inline 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)
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)