77 : m_buffer(data.begin(), data.end()) {}
84 : m_buffer(std::make_move_iterator(data.begin()),
85 std::make_move_iterator(data.end())) {}
92 template<Type::ByteInputRange R>
93 requires (!Type::SameAs<R, DataType>)
94 inline explicit Ring(
const R& r)
noexcept {
95 auto converted = DataConvert(r);
96 m_buffer.assign(converted.begin(), converted.end());
104 template<Type::ByteInputRange Rr>
105 inline explicit Ring(Rr&& r)
noexcept {
106 auto converted = DataConvert(std::forward<Rr>(r));
107 m_buffer.assign(std::make_move_iterator(converted.begin()),
108 std::make_move_iterator(converted.end()));
115 inline explicit Ring(std::string_view sv)
noexcept {
116 auto converted = DataConvert(sv);
117 m_buffer.assign(converted.begin(), converted.end());
124 inline explicit Ring(
const char* s) noexcept
125 :
Ring(s ? std::string_view(s) : std::string_view{}) {}
161 bool operator==(const
Ring& other) const noexcept;
168 inline
bool operator!=(const
Ring& other) const noexcept {
169 return !(*
this == other);
195 bool Empty() const noexcept override;
201 bool EoF() const noexcept override;
207 bool HasError() const noexcept;
213 bool IsReadable() const noexcept override;
219 bool IsWritable() const noexcept override;
225 std::
size_t Size() const noexcept override;
237 void Clean() noexcept override;
243 void Clear() noexcept override;
250 void Close() noexcept override;
257 bool Drop(const std::
size_t& count) noexcept override;
264 void Seek(const std::ptrdiff_t& offset, const
Position& mode) const noexcept override;
270 void SetError() noexcept override;
285 std::
string HexDump(const std::
size_t& columns = 16,
286 const std::
size_t& byte_limit = 0) const noexcept;
294 bool Peek(const std::
size_t& count,
DataType& outBuffer) const noexcept override;
295 bool Peek(const std::
size_t& count,
WriteOnly& outBuffer) const noexcept override;
302 bool Read(const std::
size_t& count,
DataType& outBuffer) const noexcept override;
303 bool Read(const std::
size_t& count,
WriteOnly& outBuffer) const noexcept override;
304 void ReadUntilEoF(
DataType& outBuffer) const noexcept override;
305 void ReadUntilEoF(
WriteOnly& outBuffer) const noexcept override;
312 bool Extract(const std::
size_t& count,
DataType& outBuffer) noexcept override;
313 bool Extract(const std::
size_t& count,
WriteOnly& outBuffer) noexcept override;
314 void ExtractUntilEoF(
DataType& outBuffer) noexcept override;
315 void ExtractUntilEoF(
WriteOnly& outBuffer) noexcept override;
322 bool Write(const std::
size_t& count, const
DataType& data) noexcept override;
323 bool Write(const std::
size_t& count,
DataType&& data) noexcept override;
324 bool Write(const std::
size_t& count, const
ReadOnly& data) noexcept override;
325 bool Write(const std::
size_t& count,
ReadOnly&& data) noexcept override;
349 std::size_t start_offset,
350 std::size_t columns)
noexcept;
362 virtual
bool ReadInternal(const std::
size_t& count,
DataType& outBuffer,
Operation flag) noexcept;
367 virtual
bool WriteInternal(const std::
size_t& count, const
DataType& src) noexcept;
368 virtual
bool WriteInternal(const std::
size_t& count,
DataType&& src) noexcept;
372 std::deque<std::
byte> m_buffer;
373 mutable std::
size_t m_position_offset{0};
374 bool m_closed{
false};
376 std::string m_error_message;
378 mutable DataType m_data_cache;
379 mutable std::shared_mutex m_mutex;
380 mutable std::condition_variable_any m_cv;
387 void Wait(
const std::size_t& n, std::unique_lock<std::shared_mutex>& lock)
const;
static std::string FormatHexLines(std::span< const std::byte > data, std::size_t start_offset, std::size_t columns) noexcept
Format hex/ASCII lines for a data span.