100 : m_buffer(data.begin(), data.end()) {}
107 : m_buffer(std::make_move_iterator(data.begin()),
108 std::make_move_iterator(data.end())) {}
115 template<Type::ByteInputRange R>
117 inline explicit Ring(
const R& r)
noexcept {
118 auto converted = DataConvert(r);
119 m_buffer.assign(converted.begin(), converted.end());
127 template<Type::ByteInputRange Rr>
128 inline explicit Ring(Rr&& r)
noexcept {
129 auto converted = DataConvert(std::forward<Rr>(r));
130 m_buffer.assign(std::make_move_iterator(converted.begin()),
131 std::make_move_iterator(converted.end()));
138 inline explicit Ring(std::string_view sv)
noexcept {
139 auto converted = DataConvert(sv);
140 m_buffer.assign(converted.begin(), converted.end());
147 inline explicit Ring(
const char* s) noexcept
148 :
Ring(s ? std::string_view(s) :
std::string_view{}) {}
190 bool operator==(const
Ring& other) const noexcept;
197 inline
bool operator!=(const
Ring& other) const noexcept {
198 return !(*
this == other);
224 bool Empty() const noexcept override;
230 bool EoF() const noexcept override;
236 bool HasError() const noexcept;
242 bool IsReadable() const noexcept override;
248 bool IsWritable() const noexcept override;
266 void Clean() noexcept override;
272 void Clear() noexcept override;
279 void Close() noexcept override;
293 void Seek(const
std::ptrdiff_t& offset, const
Position& mode) const noexcept override;
299 void SetError() noexcept override;
373 void ReadUntilEoF(
WriteOnly& outBuffer) const noexcept override;
408 void ExtractUntilEoF(
WriteOnly& outBuffer) noexcept override;
537 std::deque<
std::
byte> m_buffer;
539 bool m_closed{
false};
544 mutable std::shared_mutex m_mutex;
545 mutable std::condition_variable_any m_cv;
static StormByte::String::String FormatHexLines(std::span< const std::byte > data, StormByte::ByteSize start_offset, StormByte::ByteSize columns) noexcept
Format hex/ASCII lines for a data span.