From 1027c42352ee49606d72109bd890b4d8f7f7a88c Mon Sep 17 00:00:00 2001 From: Shauren Date: Fri, 23 May 2025 15:20:57 +0200 Subject: Core/PacketIO: Replace static_asserts with concepts and add them to PacketUtilities as well --- src/server/shared/Packets/ByteBuffer.cpp | 1 + src/server/shared/Packets/ByteBuffer.h | 70 ++++++++++++++------------------ 2 files changed, 31 insertions(+), 40 deletions(-) (limited to 'src/server/shared') diff --git a/src/server/shared/Packets/ByteBuffer.cpp b/src/server/shared/Packets/ByteBuffer.cpp index c8980a93fe4..f5d6a5ab4b5 100644 --- a/src/server/shared/Packets/ByteBuffer.cpp +++ b/src/server/shared/Packets/ByteBuffer.cpp @@ -198,6 +198,7 @@ void ByteBuffer::OnInvalidPosition(size_t pos, size_t valueSize) const throw ByteBufferPositionException(pos, _storage.size(), valueSize); } +template TC_SHARED_API char ByteBuffer::read(); template TC_SHARED_API uint8 ByteBuffer::read(); template TC_SHARED_API uint16 ByteBuffer::read(); template TC_SHARED_API uint32 ByteBuffer::read(); diff --git a/src/server/shared/Packets/ByteBuffer.h b/src/server/shared/Packets/ByteBuffer.h index 94c22206aa0..df6fc935a58 100644 --- a/src/server/shared/Packets/ByteBuffer.h +++ b/src/server/shared/Packets/ByteBuffer.h @@ -18,8 +18,9 @@ #ifndef TRINITYCORE_BYTE_BUFFER_H #define TRINITYCORE_BYTE_BUFFER_H -#include "Define.h" #include "ByteConverter.h" +#include "Concepts.h" +#include "Define.h" #include #include #include @@ -50,6 +51,14 @@ public: ByteBufferInvalidValueException(char const* type, std::string_view value); }; +template +concept ByteBufferNumeric = std::same_as || std::same_as + || std::same_as || std::same_as + || std::same_as || std::same_as + || std::same_as || std::same_as + || std::same_as || std::same_as + || std::same_as || std::is_enum_v; + class TC_SHARED_API ByteBuffer { public: @@ -117,10 +126,9 @@ class TC_SHARED_API ByteBuffer _storage.clear(); } - template + template void append(T value) { - static_assert(std::is_trivially_copyable_v, "append(T) must be used with trivially copyable types"); EndianConvert(value); append(reinterpret_cast(&value), sizeof(value)); } @@ -248,10 +256,9 @@ class TC_SHARED_API ByteBuffer return value; } - template + template void put(std::size_t pos, T value) { - static_assert(std::is_trivially_copyable_v, "put(size_t, T) must be used with trivially copyable types"); EndianConvert(value); put(pos, reinterpret_cast(&value), sizeof(value)); } @@ -469,7 +476,7 @@ class TC_SHARED_API ByteBuffer return _wpos * 8 + 8 - _bitpos; } - template + template void read_skip() { read_skip(sizeof(T)); } void read_skip(size_t skip) @@ -481,7 +488,7 @@ class TC_SHARED_API ByteBuffer _rpos += skip; } - template + template T read() { ResetBitPos(); @@ -490,7 +497,7 @@ class TC_SHARED_API ByteBuffer return r; } - template + template T read(size_t pos) const { if (pos + sizeof(T) > _storage.size()) @@ -502,7 +509,7 @@ class TC_SHARED_API ByteBuffer return val; } - template + template void read(T* dest, size_t count) { static_assert(std::is_trivially_copyable_v, "read(T*, size_t) must be used with trivially copyable types"); @@ -523,8 +530,8 @@ class TC_SHARED_API ByteBuffer _rpos += len; } - template - void read(std::array& arr) + template + void read(std::array& arr) { read(arr.data(), Size); } @@ -549,6 +556,8 @@ class TC_SHARED_API ByteBuffer append(str, len); } + void ReadSkipCString(bool requireValidUtf8 = true) { (void)ReadCString(requireValidUtf8); } + std::string_view ReadCString(bool requireValidUtf8 = true); std::string_view ReadString(uint32 length, bool requireValidUtf8 = true); @@ -563,12 +572,12 @@ class TC_SHARED_API ByteBuffer { _storage.resize(newsize, 0); _rpos = 0; - _wpos = size(); + _wpos = _storage.size(); } void reserve(size_t ressize) { - if (ressize > size()) + if (ressize > _storage.size()) _storage.reserve(ressize); } @@ -577,7 +586,7 @@ class TC_SHARED_API ByteBuffer _storage.shrink_to_fit(); } - template + template void append(T const* src, size_t cnt) { #if TRINITY_ENDIAN == TRINITY_LITTLEENDIAN @@ -596,8 +605,8 @@ class TC_SHARED_API ByteBuffer append(buffer.data(), buffer.size()); } - template - void append(std::array const& arr) + template + void append(std::array const& arr) { append(arr.data(), Size); } @@ -619,30 +628,7 @@ class TC_SHARED_API ByteBuffer std::vector _storage; }; -template <> -inline std::string ByteBuffer::read() -{ - return std::string(ReadCString()); -} - -template <> -inline void ByteBuffer::read_skip() -{ - (void)ReadCString(); -} - -template <> -inline void ByteBuffer::read_skip() -{ - read_skip(); -} - -template <> -inline void ByteBuffer::read_skip() -{ - read_skip(); -} - +extern template char ByteBuffer::read(); extern template uint8 ByteBuffer::read(); extern template uint16 ByteBuffer::read(); extern template uint32 ByteBuffer::read(); @@ -654,4 +640,8 @@ extern template int64 ByteBuffer::read(); extern template float ByteBuffer::read(); extern template double ByteBuffer::read(); +template +concept HasByteBufferShiftOperators = requires(ByteBuffer& data, T const& value) { { data << value } -> std::convertible_to; } + && requires(ByteBuffer& data, T& value) { { data >> value } -> std::convertible_to; }; + #endif -- cgit v1.2.3