Merge branch 'master' into jgrpp
Remove 'byte' typedef
This commit is contained in:
@@ -94,14 +94,14 @@ public:
|
||||
* @param size the amount of bytes to allocate.
|
||||
* @return the given amounts of bytes zeroed.
|
||||
*/
|
||||
inline void *operator new(size_t size) { return CallocT<byte>(size); }
|
||||
inline void *operator new(size_t size) { return CallocT<uint8_t>(size); }
|
||||
|
||||
/**
|
||||
* Memory allocator for an array of class instances.
|
||||
* @param size the amount of bytes to allocate.
|
||||
* @return the given amounts of bytes zeroed.
|
||||
*/
|
||||
inline void *operator new[](size_t size) { return CallocT<byte>(size); }
|
||||
inline void *operator new[](size_t size) { return CallocT<uint8_t>(size); }
|
||||
|
||||
/**
|
||||
* Memory release for a single class instance.
|
||||
|
@@ -49,7 +49,7 @@ inline bool ShouldLogUpdateStateChecksum()
|
||||
return _networking && (!_network_server || (NetworkClientSocket::IsValidID(0) && NetworkClientSocket::Get(0)->status != NetworkClientSocket::STATUS_INACTIVE));
|
||||
}
|
||||
# define DEBUG_UPDATESTATECHECKSUM(str, ...) if (ShouldLogUpdateStateChecksum()) DEBUG(statecsum, 0, "%s; %04x; %02x; " OTTD_PRINTFHEX64PAD "; %s:%d " str, \
|
||||
debug_date_dumper().HexDate(), _frame_counter, (byte)_current_company, _state_checksum.state, __FILE__, __LINE__, __VA_ARGS__);
|
||||
debug_date_dumper().HexDate(), _frame_counter, (uint8_t)_current_company, _state_checksum.state, __FILE__, __LINE__, __VA_ARGS__);
|
||||
#else
|
||||
# define DEBUG_UPDATESTATECHECKSUM(str, ...)
|
||||
#endif /* RANDOM_DEBUG */
|
||||
|
@@ -49,7 +49,7 @@
|
||||
* other templates below. Here we have only forward declaration. For each enum type
|
||||
* we will create specialization derived from MakeEnumPropsT<>.
|
||||
* i.e.:
|
||||
* template <> struct EnumPropsT<Track> : MakeEnumPropsT<Track, byte, TRACK_BEGIN, TRACK_END, INVALID_TRACK> {};
|
||||
* template <> struct EnumPropsT<Track> : MakeEnumPropsT<Track, uint8_t, TRACK_BEGIN, TRACK_END, INVALID_TRACK> {};
|
||||
*/
|
||||
template <typename Tenum_t> struct EnumPropsT;
|
||||
|
||||
@@ -58,7 +58,7 @@ template <typename Tenum_t> struct EnumPropsT;
|
||||
* from outsize. It is used as base class of several EnumPropsT specializations each
|
||||
* dedicated to one of commonly used enumeration types.
|
||||
* @param Tenum_t enumeration type that you want to describe
|
||||
* @param Tstorage_t what storage type would be sufficient (i.e. byte)
|
||||
* @param Tstorage_t what storage type would be sufficient (i.e. uint8_t)
|
||||
* @param Tbegin first valid value from the contiguous range (i.e. TRACK_BEGIN)
|
||||
* @param Tend one past the last valid value from the contiguous range (i.e. TRACK_END)
|
||||
* @param Tinvalid value used as invalid value marker (i.e. INVALID_TRACK)
|
||||
@@ -67,7 +67,7 @@ template <typename Tenum_t> struct EnumPropsT;
|
||||
template <typename Tenum_t, typename Tstorage_t, Tenum_t Tbegin, Tenum_t Tend, Tenum_t Tinvalid, uint Tnum_bits = 8 * sizeof(Tstorage_t)>
|
||||
struct MakeEnumPropsT {
|
||||
typedef Tenum_t type; ///< enum type (i.e. Trackdir)
|
||||
typedef Tstorage_t storage; ///< storage type (i.e. byte)
|
||||
typedef Tstorage_t storage; ///< storage type (i.e. uint8_t)
|
||||
static const Tenum_t begin = Tbegin; ///< lowest valid value (i.e. TRACKDIR_BEGIN)
|
||||
static const Tenum_t end = Tend; ///< one after the last valid value (i.e. TRACKDIR_END)
|
||||
static const Tenum_t invalid = Tinvalid; ///< what value is used as invalid value (i.e. INVALID_TRACKDIR)
|
||||
|
@@ -46,7 +46,7 @@ inline void MemMoveT(T *destination, const T *source, size_t num = 1)
|
||||
* @param num number of items to be set (!not number of bytes!)
|
||||
*/
|
||||
template <typename T>
|
||||
inline void MemSetT(T *ptr, byte value, size_t num = 1)
|
||||
inline void MemSetT(T *ptr, uint8_t value, size_t num = 1)
|
||||
{
|
||||
memset(ptr, value, num * sizeof(T));
|
||||
}
|
||||
|
@@ -138,7 +138,7 @@ public:
|
||||
inline constexpr OverflowSafeInt operator * (const int factor) const { OverflowSafeInt result = *this; result *= (int64_t)factor; return result; }
|
||||
inline constexpr OverflowSafeInt operator * (const uint factor) const { OverflowSafeInt result = *this; result *= (int64_t)factor; return result; }
|
||||
inline constexpr OverflowSafeInt operator * (const uint16_t factor) const { OverflowSafeInt result = *this; result *= (int64_t)factor; return result; }
|
||||
inline constexpr OverflowSafeInt operator * (const byte factor) const { OverflowSafeInt result = *this; result *= (int64_t)factor; return result; }
|
||||
inline constexpr OverflowSafeInt operator * (const uint8_t factor) const { OverflowSafeInt result = *this; result *= (int64_t)factor; return result; }
|
||||
|
||||
/* Operators for division. */
|
||||
inline constexpr OverflowSafeInt& operator /= (const int64_t divisor) { this->m_value /= divisor; return *this; }
|
||||
@@ -197,11 +197,11 @@ template <class T> inline constexpr OverflowSafeInt<T> operator - (const uint a
|
||||
template <class T> inline constexpr OverflowSafeInt<T> operator * (const uint a, const OverflowSafeInt<T> b) { return b * a; }
|
||||
template <class T> inline constexpr OverflowSafeInt<T> operator / (const uint a, const OverflowSafeInt<T> b) { return (OverflowSafeInt<T>)a / (int)b; }
|
||||
|
||||
/* Sometimes we got byte operator OverflowSafeInt instead of vice versa. Handle that properly. */
|
||||
template <class T> inline constexpr OverflowSafeInt<T> operator + (const byte a, const OverflowSafeInt<T> b) { return b + (uint)a; }
|
||||
template <class T> inline constexpr OverflowSafeInt<T> operator - (const byte a, const OverflowSafeInt<T> b) { return -b + (uint)a; }
|
||||
template <class T> inline constexpr OverflowSafeInt<T> operator * (const byte a, const OverflowSafeInt<T> b) { return b * (uint)a; }
|
||||
template <class T> inline constexpr OverflowSafeInt<T> operator / (const byte a, const OverflowSafeInt<T> b) { return (OverflowSafeInt<T>)a / (int)b; }
|
||||
/* Sometimes we got uint8_t operator OverflowSafeInt instead of vice versa. Handle that properly. */
|
||||
template <class T> inline constexpr OverflowSafeInt<T> operator + (const uint8_t a, const OverflowSafeInt<T> b) { return b + (uint)a; }
|
||||
template <class T> inline constexpr OverflowSafeInt<T> operator - (const uint8_t a, const OverflowSafeInt<T> b) { return -b + (uint)a; }
|
||||
template <class T> inline constexpr OverflowSafeInt<T> operator * (const uint8_t a, const OverflowSafeInt<T> b) { return b * (uint)a; }
|
||||
template <class T> inline constexpr OverflowSafeInt<T> operator / (const uint8_t a, const OverflowSafeInt<T> b) { return (OverflowSafeInt<T>)a / (int)b; }
|
||||
|
||||
typedef OverflowSafeInt<int64_t> OverflowSafeInt64;
|
||||
typedef OverflowSafeInt<int32_t> OverflowSafeInt32;
|
||||
|
@@ -125,9 +125,9 @@ DEFINE_POOL_METHOD(inline void *)::AllocateItem(size_t size, size_t index, Pool:
|
||||
memset((void *)item, 0, sizeof(Titem));
|
||||
}
|
||||
} else if (Tzero) {
|
||||
item = (Titem *)CallocT<byte>(size);
|
||||
item = (Titem *)CallocT<uint8_t>(size);
|
||||
} else {
|
||||
item = (Titem *)MallocT<byte>(size);
|
||||
item = (Titem *)MallocT<uint8_t>(size);
|
||||
}
|
||||
this->data[index] = Tops::PutPtr(item, param);
|
||||
SetBit(this->free_bitmap[index / 64], index % 64);
|
||||
|
@@ -87,7 +87,7 @@ void SetRandomSeed(uint32_t seed)
|
||||
uint32_t DoRandom(int line, const char *file)
|
||||
{
|
||||
if (_networking && (!_network_server || (NetworkClientSocket::IsValidID(0) && NetworkClientSocket::Get(0)->status != NetworkClientSocket::STATUS_INACTIVE))) {
|
||||
DEBUG(random, 0, "%s; %04x; %02x; %s:%d", debug_date_dumper().HexDate(), _frame_counter, (byte)_current_company, file, line);
|
||||
DEBUG(random, 0, "%s; %04x; %02x; %s:%d", debug_date_dumper().HexDate(), _frame_counter, (uint8_t)_current_company, file, line);
|
||||
}
|
||||
|
||||
return _random.Next();
|
||||
|
@@ -25,7 +25,7 @@
|
||||
template <class T>
|
||||
class ring_buffer
|
||||
{
|
||||
std::unique_ptr<byte, FreeDeleter> data;
|
||||
std::unique_ptr<uint8_t, FreeDeleter> data;
|
||||
uint32_t head = 0;
|
||||
uint32_t count = 0;
|
||||
uint32_t mask = (uint32_t)-1;
|
||||
@@ -219,11 +219,11 @@ public:
|
||||
void construct_from(const U &other)
|
||||
{
|
||||
uint32_t cap = round_up_size((uint32_t)other.size());
|
||||
this->data.reset(MallocT<byte>(cap * sizeof(T)));
|
||||
this->data.reset(MallocT<uint8_t>(cap * sizeof(T)));
|
||||
this->mask = cap - 1;
|
||||
this->head = 0;
|
||||
this->count = (uint32_t)other.size();
|
||||
byte *ptr = this->data.get();
|
||||
uint8_t *ptr = this->data.get();
|
||||
for (const T &item : other) {
|
||||
new (ptr) T(item);
|
||||
ptr += sizeof(T);
|
||||
@@ -259,12 +259,12 @@ public:
|
||||
if (!other.empty()) {
|
||||
if (other.size() > this->capacity()) {
|
||||
uint32_t cap = round_up_size(other.count);
|
||||
this->data.reset(MallocT<byte>(cap * sizeof(T)));
|
||||
this->data.reset(MallocT<uint8_t>(cap * sizeof(T)));
|
||||
this->mask = cap - 1;
|
||||
}
|
||||
this->head = 0;
|
||||
this->count = other.count;
|
||||
byte *ptr = this->data.get();
|
||||
uint8_t *ptr = this->data.get();
|
||||
for (const T &item : other) {
|
||||
new (ptr) T(item);
|
||||
ptr += sizeof(T);
|
||||
@@ -341,8 +341,8 @@ private:
|
||||
void reallocate(uint32_t new_cap)
|
||||
{
|
||||
const uint32_t cap = round_up_size(new_cap);
|
||||
byte *new_buf = MallocT<byte>(cap * sizeof(T));
|
||||
byte *pos = new_buf;
|
||||
uint8_t *new_buf = MallocT<uint8_t>(cap * sizeof(T));
|
||||
uint8_t *pos = new_buf;
|
||||
for (T &item : *this) {
|
||||
new (pos) T(std::move(item));
|
||||
item.~T();
|
||||
@@ -522,8 +522,8 @@ private:
|
||||
if (this->count + num > (uint32_t)this->capacity()) {
|
||||
/* grow container */
|
||||
const uint32_t cap = round_up_size(this->count + num);
|
||||
byte *new_buf = MallocT<byte>(cap * sizeof(T));
|
||||
byte *write_to = new_buf;
|
||||
uint8_t *new_buf = MallocT<uint8_t>(cap * sizeof(T));
|
||||
uint8_t *write_to = new_buf;
|
||||
const uint32_t end = this->head + this->count;
|
||||
for (uint32_t idx = this->head; idx != end; idx++) {
|
||||
if (idx == pos) {
|
||||
|
@@ -16,7 +16,7 @@
|
||||
* @param bytes_to_write The amount of bytes we want to try to write.
|
||||
* @return True iff the given amount of bytes can be written to the packet.
|
||||
*/
|
||||
[[maybe_unused]] static bool BufferCanWriteToPacket(const std::vector<byte> &buffer, size_t limit, size_t bytes_to_write)
|
||||
[[maybe_unused]] static bool BufferCanWriteToPacket(const std::vector<uint8_t> &buffer, size_t limit, size_t bytes_to_write)
|
||||
{
|
||||
return buffer.size() + bytes_to_write <= limit;
|
||||
}
|
||||
@@ -37,7 +37,7 @@
|
||||
* Package a boolean in the packet.
|
||||
* @param data The data to send.
|
||||
*/
|
||||
void BufferSend_bool(std::vector<byte> &buffer, size_t limit, bool data)
|
||||
void BufferSend_bool(std::vector<uint8_t> &buffer, size_t limit, bool data)
|
||||
{
|
||||
BufferSend_uint8(buffer, limit, data ? 1 : 0);
|
||||
}
|
||||
@@ -46,7 +46,7 @@ void BufferSend_bool(std::vector<byte> &buffer, size_t limit, bool data)
|
||||
* Package a 8 bits integer in the packet.
|
||||
* @param data The data to send.
|
||||
*/
|
||||
void BufferSend_uint8(std::vector<byte> &buffer, size_t limit, uint8_t data)
|
||||
void BufferSend_uint8(std::vector<uint8_t> &buffer, size_t limit, uint8_t data)
|
||||
{
|
||||
assert(BufferCanWriteToPacket(buffer, limit, sizeof(data)));
|
||||
buffer.emplace_back(data);
|
||||
@@ -56,7 +56,7 @@ void BufferSend_uint8(std::vector<byte> &buffer, size_t limit, uint8_t data)
|
||||
* Package a 16 bits integer in the packet.
|
||||
* @param data The data to send.
|
||||
*/
|
||||
void BufferSend_uint16(std::vector<byte> &buffer, size_t limit, uint16_t data)
|
||||
void BufferSend_uint16(std::vector<uint8_t> &buffer, size_t limit, uint16_t data)
|
||||
{
|
||||
assert(BufferCanWriteToPacket(buffer, limit, sizeof(data)));
|
||||
buffer.insert(buffer.end(), {
|
||||
@@ -69,7 +69,7 @@ void BufferSend_uint16(std::vector<byte> &buffer, size_t limit, uint16_t data)
|
||||
* Package a 32 bits integer in the packet.
|
||||
* @param data The data to send.
|
||||
*/
|
||||
void BufferSend_uint32(std::vector<byte> &buffer, size_t limit, uint32_t data)
|
||||
void BufferSend_uint32(std::vector<uint8_t> &buffer, size_t limit, uint32_t data)
|
||||
{
|
||||
assert(BufferCanWriteToPacket(buffer, limit, sizeof(data)));
|
||||
buffer.insert(buffer.end(), {
|
||||
@@ -84,7 +84,7 @@ void BufferSend_uint32(std::vector<byte> &buffer, size_t limit, uint32_t data)
|
||||
* Package a 64 bits integer in the packet.
|
||||
* @param data The data to send.
|
||||
*/
|
||||
void BufferSend_uint64(std::vector<byte> &buffer, size_t limit, uint64_t data)
|
||||
void BufferSend_uint64(std::vector<uint8_t> &buffer, size_t limit, uint64_t data)
|
||||
{
|
||||
assert(BufferCanWriteToPacket(buffer, limit, sizeof(data)));
|
||||
buffer.insert(buffer.end(), {
|
||||
@@ -104,7 +104,7 @@ void BufferSend_uint64(std::vector<byte> &buffer, size_t limit, uint64_t data)
|
||||
* the string + '\0'. No size-byte or something.
|
||||
* @param data The string to send
|
||||
*/
|
||||
void BufferSend_string(std::vector<byte> &buffer, size_t limit, const std::string_view data)
|
||||
void BufferSend_string(std::vector<uint8_t> &buffer, size_t limit, const std::string_view data)
|
||||
{
|
||||
assert(BufferCanWriteToPacket(buffer, limit, data.size() + 1));
|
||||
buffer.insert(buffer.end(), data.begin(), data.end());
|
||||
@@ -119,7 +119,7 @@ void BufferSend_string(std::vector<byte> &buffer, size_t limit, const std::strin
|
||||
* @param end The end of the buffer to send.
|
||||
* @return The number of bytes that were added to this packet.
|
||||
*/
|
||||
size_t BufferSend_binary_until_full(std::vector<byte> &buffer, size_t limit, const byte *begin, const byte *end)
|
||||
size_t BufferSend_binary_until_full(std::vector<uint8_t> &buffer, size_t limit, const uint8_t *begin, const uint8_t *end)
|
||||
{
|
||||
size_t amount = std::min<size_t>(end - begin, limit - buffer.size());
|
||||
buffer.insert(buffer.end(), begin, begin + amount);
|
||||
@@ -130,7 +130,7 @@ size_t BufferSend_binary_until_full(std::vector<byte> &buffer, size_t limit, con
|
||||
* Sends a binary data over the network.
|
||||
* @param data The data to send
|
||||
*/
|
||||
void BufferSend_binary(std::vector<byte> &buffer, size_t limit, const byte *data, const size_t size)
|
||||
void BufferSend_binary(std::vector<uint8_t> &buffer, size_t limit, const uint8_t *data, const size_t size)
|
||||
{
|
||||
assert(data != nullptr);
|
||||
assert(BufferCanWriteToPacket(buffer, limit, size));
|
||||
@@ -142,7 +142,7 @@ void BufferSend_binary(std::vector<byte> &buffer, size_t limit, const byte *data
|
||||
* The data is length prefixed with a uint16.
|
||||
* @param data The string to send
|
||||
*/
|
||||
void BufferSend_buffer(std::vector<byte> &buffer, size_t limit, const byte *data, const size_t size)
|
||||
void BufferSend_buffer(std::vector<uint8_t> &buffer, size_t limit, const uint8_t *data, const size_t size)
|
||||
{
|
||||
assert(size <= UINT16_MAX);
|
||||
assert(BufferCanWriteToPacket(buffer, limit, size + 2));
|
||||
|
@@ -18,15 +18,15 @@
|
||||
#include <string>
|
||||
#include <limits>
|
||||
|
||||
void BufferSend_bool (std::vector<byte> &buffer, size_t limit, bool data);
|
||||
void BufferSend_uint8 (std::vector<byte> &buffer, size_t limit, uint8_t data);
|
||||
void BufferSend_uint16(std::vector<byte> &buffer, size_t limit, uint16_t data);
|
||||
void BufferSend_uint32(std::vector<byte> &buffer, size_t limit, uint32_t data);
|
||||
void BufferSend_uint64(std::vector<byte> &buffer, size_t limit, uint64_t data);
|
||||
void BufferSend_string(std::vector<byte> &buffer, size_t limit, const std::string_view data);
|
||||
size_t BufferSend_binary_until_full(std::vector<byte> &buffer, size_t limit, const byte *begin, const byte *end);
|
||||
void BufferSend_binary(std::vector<byte> &buffer, size_t limit, const byte *data, const size_t size);
|
||||
void BufferSend_buffer(std::vector<byte> &buffer, size_t limit, const byte *data, const size_t size);
|
||||
void BufferSend_bool (std::vector<uint8_t> &buffer, size_t limit, bool data);
|
||||
void BufferSend_uint8 (std::vector<uint8_t> &buffer, size_t limit, uint8_t data);
|
||||
void BufferSend_uint16(std::vector<uint8_t> &buffer, size_t limit, uint16_t data);
|
||||
void BufferSend_uint32(std::vector<uint8_t> &buffer, size_t limit, uint32_t data);
|
||||
void BufferSend_uint64(std::vector<uint8_t> &buffer, size_t limit, uint64_t data);
|
||||
void BufferSend_string(std::vector<uint8_t> &buffer, size_t limit, const std::string_view data);
|
||||
size_t BufferSend_binary_until_full(std::vector<uint8_t> &buffer, size_t limit, const uint8_t *begin, const uint8_t *end);
|
||||
void BufferSend_binary(std::vector<uint8_t> &buffer, size_t limit, const uint8_t *data, const size_t size);
|
||||
void BufferSend_buffer(std::vector<uint8_t> &buffer, size_t limit, const uint8_t *data, const size_t size);
|
||||
|
||||
template <typename T>
|
||||
struct BufferSerialisationHelper {
|
||||
@@ -66,30 +66,30 @@ struct BufferSerialisationHelper {
|
||||
BufferSend_string(self->GetSerialisationBuffer(), self->GetSerialisationLimit(), data);
|
||||
}
|
||||
|
||||
size_t Send_binary_until_full(const byte *begin, const byte *end)
|
||||
size_t Send_binary_until_full(const uint8_t *begin, const uint8_t *end)
|
||||
{
|
||||
T *self = static_cast<T *>(this);
|
||||
return BufferSend_binary_until_full(self->GetSerialisationBuffer(), self->GetSerialisationLimit(), begin, end);
|
||||
}
|
||||
|
||||
void Send_binary(const byte *data, const size_t size)
|
||||
void Send_binary(const uint8_t *data, const size_t size)
|
||||
{
|
||||
T *self = static_cast<T *>(this);
|
||||
BufferSend_binary(self->GetSerialisationBuffer(), self->GetSerialisationLimit(), data, size);
|
||||
}
|
||||
|
||||
void Send_binary(std::span<const byte> data)
|
||||
void Send_binary(std::span<const uint8_t> data)
|
||||
{
|
||||
this->Send_binary(data.data(), data.size());
|
||||
}
|
||||
|
||||
void Send_buffer(const byte *data, const size_t size)
|
||||
void Send_buffer(const uint8_t *data, const size_t size)
|
||||
{
|
||||
T *self = static_cast<T *>(this);
|
||||
BufferSend_buffer(self->GetSerialisationBuffer(), self->GetSerialisationLimit(), data, size);
|
||||
}
|
||||
|
||||
void Send_buffer(const std::vector<byte> &data)
|
||||
void Send_buffer(const std::vector<uint8_t> &data)
|
||||
{
|
||||
this->Send_buffer(data.data(), data.size());
|
||||
}
|
||||
@@ -100,7 +100,7 @@ void BufferRecvStringValidate(std::string &buffer, StringValidationSettings sett
|
||||
template <typename T>
|
||||
struct BufferDeserialisationHelper {
|
||||
private:
|
||||
const byte *GetBuffer()
|
||||
const uint8_t *GetBuffer()
|
||||
{
|
||||
return static_cast<T *>(this)->GetDeserialisationBuffer();
|
||||
}
|
||||
@@ -253,7 +253,7 @@ public:
|
||||
* @param buffer The buffer to put the data into.
|
||||
* @param size The size of the data.
|
||||
*/
|
||||
void Recv_binary(byte *buffer, size_t size)
|
||||
void Recv_binary(uint8_t *buffer, size_t size)
|
||||
{
|
||||
if (!this->CanRecvBytes(size, true)) return;
|
||||
|
||||
@@ -267,7 +267,7 @@ public:
|
||||
* Reads binary data.
|
||||
* @param buffer The buffer to put the data into.
|
||||
*/
|
||||
void Recv_binary(std::span<byte> buffer)
|
||||
void Recv_binary(std::span<uint8_t> buffer)
|
||||
{
|
||||
this->Recv_binary(buffer.data(), buffer.size());
|
||||
}
|
||||
@@ -331,11 +331,11 @@ public:
|
||||
};
|
||||
|
||||
struct BufferSerialiser : public BufferSerialisationHelper<BufferSerialiser> {
|
||||
std::vector<byte> &buffer;
|
||||
std::vector<uint8_t> &buffer;
|
||||
|
||||
BufferSerialiser(std::vector<byte> &buffer) : buffer(buffer) {}
|
||||
BufferSerialiser(std::vector<uint8_t> &buffer) : buffer(buffer) {}
|
||||
|
||||
std::vector<byte> &GetSerialisationBuffer() { return this->buffer; }
|
||||
std::vector<uint8_t> &GetSerialisationBuffer() { return this->buffer; }
|
||||
size_t GetSerialisationLimit() const { return std::numeric_limits<size_t>::max(); }
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user