mirror of
https://github.com/KartKrewDev/RingRacers.git
synced 2025-12-23 16:32:36 +00:00
io: Fix name lookup for read_exact friend specializations
This commit is contained in:
parent
a2ea3bfd6c
commit
f35de20c72
1 changed files with 46 additions and 42 deletions
|
|
@ -448,33 +448,35 @@ public:
|
||||||
return head_;
|
return head_;
|
||||||
}
|
}
|
||||||
|
|
||||||
friend void read_exact(SpanStream& stream, tcb::span<std::byte> buffer)
|
friend void read_exact(SpanStream& stream, tcb::span<std::byte> buffer);
|
||||||
{
|
|
||||||
const std::size_t remaining = stream.span_.size() - stream.head_;
|
|
||||||
const std::size_t buffer_size = buffer.size();
|
|
||||||
if (buffer_size > remaining)
|
|
||||||
{
|
|
||||||
// The span's size will never change, so the generic impl of read_exact will enter an inifinite loop. We can
|
|
||||||
// throw out early.
|
|
||||||
throw UnexpectedEof("read buffer size > remaining bytes in span");
|
|
||||||
}
|
|
||||||
if (buffer_size == 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto copy_begin = std::next(stream.span_.begin(), stream.head_);
|
|
||||||
auto copy_end = std::next(stream.span_.begin(), stream.head_ + buffer_size);
|
|
||||||
stream.head_ += buffer_size;
|
|
||||||
|
|
||||||
std::copy(copy_begin, copy_end, buffer.begin());
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
tcb::span<std::byte> span_;
|
tcb::span<std::byte> span_;
|
||||||
std::size_t head_ {0};
|
std::size_t head_ {0};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline void read_exact(SpanStream& stream, tcb::span<std::byte> buffer)
|
||||||
|
{
|
||||||
|
const std::size_t remaining = stream.span_.size() - stream.head_;
|
||||||
|
const std::size_t buffer_size = buffer.size();
|
||||||
|
if (buffer_size > remaining)
|
||||||
|
{
|
||||||
|
// The span's size will never change, so the generic impl of read_exact will enter an inifinite loop. We can
|
||||||
|
// throw out early.
|
||||||
|
throw UnexpectedEof("read buffer size > remaining bytes in span");
|
||||||
|
}
|
||||||
|
if (buffer_size == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto copy_begin = std::next(stream.span_.begin(), stream.head_);
|
||||||
|
auto copy_end = std::next(stream.span_.begin(), stream.head_ + buffer_size);
|
||||||
|
stream.head_ += buffer_size;
|
||||||
|
|
||||||
|
std::copy(copy_begin, copy_end, buffer.begin());
|
||||||
|
}
|
||||||
|
|
||||||
class VecStream {
|
class VecStream {
|
||||||
std::vector<std::byte> vec_;
|
std::vector<std::byte> vec_;
|
||||||
std::size_t head_ {0};
|
std::size_t head_ {0};
|
||||||
|
|
@ -543,29 +545,31 @@ public:
|
||||||
|
|
||||||
std::vector<std::byte>& vector() { return vec_; }
|
std::vector<std::byte>& vector() { return vec_; }
|
||||||
|
|
||||||
friend void read_exact(VecStream& stream, tcb::span<std::byte> buffer)
|
friend void read_exact(VecStream& stream, tcb::span<std::byte> buffer);
|
||||||
{
|
|
||||||
const std::size_t remaining = stream.vec_.size() - stream.head_;
|
|
||||||
const std::size_t buffer_size = buffer.size();
|
|
||||||
if (buffer_size > remaining)
|
|
||||||
{
|
|
||||||
// VecStream is not thread safe, so the generic impl of read_exact would enter an infinite loop under
|
|
||||||
// correct usage. We know when we've reached the end and can throw out early.
|
|
||||||
throw UnexpectedEof("read buffer size > remaining bytes in vector");
|
|
||||||
}
|
|
||||||
if (buffer_size == 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto copy_begin = std::next(stream.vec_.begin(), stream.head_);
|
|
||||||
auto copy_end = std::next(stream.vec_.begin(), stream.head_ + buffer_size);
|
|
||||||
stream.head_ += buffer_size;
|
|
||||||
|
|
||||||
std::copy(copy_begin, copy_end, buffer.begin());
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
inline void read_exact(VecStream& stream, tcb::span<std::byte> buffer)
|
||||||
|
{
|
||||||
|
const std::size_t remaining = stream.vec_.size() - stream.head_;
|
||||||
|
const std::size_t buffer_size = buffer.size();
|
||||||
|
if (buffer_size > remaining)
|
||||||
|
{
|
||||||
|
// VecStream is not thread safe, so the generic impl of read_exact would enter an infinite loop under
|
||||||
|
// correct usage. We know when we've reached the end and can throw out early.
|
||||||
|
throw UnexpectedEof("read buffer size > remaining bytes in vector");
|
||||||
|
}
|
||||||
|
if (buffer_size == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto copy_begin = std::next(stream.vec_.begin(), stream.head_);
|
||||||
|
auto copy_end = std::next(stream.vec_.begin(), stream.head_ + buffer_size);
|
||||||
|
stream.head_ += buffer_size;
|
||||||
|
|
||||||
|
std::copy(copy_begin, copy_end, buffer.begin());
|
||||||
|
}
|
||||||
|
|
||||||
class ZlibException : public std::exception {
|
class ZlibException : public std::exception {
|
||||||
int err_ {0};
|
int err_ {0};
|
||||||
std::string msg_;
|
std::string msg_;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue