1#ifndef LIBFILEZILLA_AIO_READER_HEADER
2#define LIBFILEZILLA_AIO_READER_HEADER
29 reader_base(reader_base
const&) =
delete;
30 reader_base& operator=(reader_base
const&) =
delete;
34 virtual bool seekable()
const {
return false; }
37 bool seek(uint64_t offset, uint64_t
size = nosize);
42 std::wstring
const& name()
const {
return name_; }
45 virtual uint64_t
size()
const {
return size_; }
60 std::pair<aio_result, buffer_lease>
get_buffer(event_handler & h);
75 : event_handler(pool.loop())
77 , logger_(pool.logger())
79 , max_buffers_(max_buffers ? max_buffers : 1)
85 , logger_(pool.logger())
87 , max_buffers_(max_buffers ? max_buffers : 1)
90 virtual std::pair<aio_result, buffer_lease> do_get_buffer(scoped_lock & l) = 0;
108 std::wstring
const name_;
110 size_t const max_buffers_{};
111 std::list<buffer_lease> buffers_;
113 uint64_t size_{nosize};
114 uint64_t max_size_{nosize};
115 uint64_t start_offset_{nosize};
116 uint64_t remaining_{nosize};
118 bool get_buffer_called_{};
125class FZ_PUBLIC_SYMBOL reader_factory
128 explicit reader_factory(std::wstring
const& name)
131 explicit reader_factory(std::wstring && name)
132 : name_(std::move(name))
135 virtual ~reader_factory()
noexcept =
default;
138 virtual std::unique_ptr<reader_factory>
clone()
const = 0;
151 virtual std::unique_ptr<reader_base>
open(
aio_buffer_pool & pool, uint64_t offset = 0, uint64_t size = reader_base::nosize,
size_t max_buffers = 0) = 0;
153 virtual bool seekable()
const {
return false; }
155 std::wstring name()
const {
return name_; }
157 virtual uint64_t size()
const {
return reader_base::nosize; }
158 virtual datetime mtime()
const {
return datetime(); }
175 virtual size_t preferred_buffer_count()
const {
return 1; }
178 reader_factory() =
default;
179 reader_factory(reader_factory
const&) =
default;
181 std::wstring
const name_;
185class FZ_PUBLIC_SYMBOL reader_factory_holder final
188 reader_factory_holder() =
default;
189 reader_factory_holder(std::unique_ptr<reader_factory> && factory);
190 reader_factory_holder(std::unique_ptr<reader_factory>
const& factory);
193 reader_factory_holder(reader_factory_holder
const& op);
194 reader_factory_holder& operator=(reader_factory_holder
const& op);
196 reader_factory_holder(reader_factory_holder && op)
noexcept;
197 reader_factory_holder& operator=(reader_factory_holder && op)
noexcept;
198 reader_factory_holder& operator=(std::unique_ptr<reader_factory> && factory);
205 explicit operator bool()
const {
return impl_.operator bool(); }
207 std::wstring name()
const {
return impl_ ? impl_->name() : std::wstring(); }
209 uint64_t size()
const {
return impl_ ? impl_->size() : aio_base::nosize; }
212 std::unique_ptr<reader_factory> impl_;
221 using reader_base::reader_base;
224 virtual std::pair<aio_result, buffer_lease> do_get_buffer(
scoped_lock & l)
override;
249 virtual
bool seekable() const override;
252 virtual
void FZ_PRIVATE_SYMBOL do_close(
scoped_lock & l) override;
253 virtual
bool FZ_PRIVATE_SYMBOL do_seek(
scoped_lock & l) override;
257 void FZ_PRIVATE_SYMBOL entry();
264class FZ_PUBLIC_SYMBOL file_reader_factory final : public reader_factory
269 virtual std::unique_ptr<reader_base>
open(
aio_buffer_pool & pool, uint64_t offset = 0, uint64_t size = reader_base::nosize,
size_t max_buffers = 4)
override;
270 virtual std::unique_ptr<reader_factory>
clone()
const override;
272 virtual bool seekable()
const override {
return true; }
274 virtual uint64_t size()
const override;
275 virtual datetime mtime()
const override;
279 virtual size_t preferred_buffer_count()
const override {
return 4; }
281 thread_pool & thread_pool_;
288class FZ_PUBLIC_SYMBOL view_reader final :
public reader_base
291 view_reader(std::wstring && name,
aio_buffer_pool & pool, std::string_view data)
noexcept;
293 virtual ~view_reader()
noexcept;
295 virtual bool seekable()
const override {
return true; }
298 virtual std::pair<aio_result, buffer_lease> FZ_PRIVATE_SYMBOL do_get_buffer(
scoped_lock & l)
override;
299 virtual void FZ_PRIVATE_SYMBOL do_close(
scoped_lock & l)
override;
300 virtual bool FZ_PRIVATE_SYMBOL do_seek(
scoped_lock & l)
override;
304 std::string_view
const view_;
312class FZ_PUBLIC_SYMBOL view_reader_factory final :
public reader_factory
315 view_reader_factory(std::wstring && name, std::string_view
const& view)
316 : reader_factory(std::move(name))
319 view_reader_factory(std::wstring
const& name, std::string_view
const& view)
320 : reader_factory(name)
324 virtual std::unique_ptr<reader_base>
open(
aio_buffer_pool & pool, uint64_t offset = 0, uint64_t size = reader_base::nosize,
size_t max_buffers = 1)
override;
325 virtual std::unique_ptr<reader_factory>
clone()
const override;
327 virtual bool seekable()
const override {
return true; }
329 virtual uint64_t size()
const override {
return view_.size(); }
332 std::string_view
const view_;
336class FZ_PUBLIC_SYMBOL string_reader final :
public reader_base
339 string_reader(std::wstring && name,
aio_buffer_pool & pool, std::string
const& data)
noexcept;
340 string_reader(std::wstring && name,
aio_buffer_pool & pool, std::string && data)
noexcept;
342 virtual ~string_reader()
noexcept;
344 virtual bool seekable()
const override {
return true; }
347 virtual std::pair<aio_result, buffer_lease> FZ_PRIVATE_SYMBOL do_get_buffer(
scoped_lock & l)
override;
348 virtual void FZ_PRIVATE_SYMBOL do_close(
scoped_lock & l)
override;
349 virtual bool FZ_PRIVATE_SYMBOL do_seek(
scoped_lock & l)
override;
353 std::string
const data_;
357class FZ_PUBLIC_SYMBOL string_reader_factory final :
public reader_factory
360 string_reader_factory(std::wstring
const& name, std::string
const& data)
361 : reader_factory(name)
364 string_reader_factory(std::wstring && name, std::string && data)
365 : reader_factory(std::move(name))
366 , data_(std::move(data))
369 virtual std::unique_ptr<reader_base>
open(
aio_buffer_pool & pool, uint64_t offset = 0, uint64_t size = reader_base::nosize,
size_t max_buffers = 1)
override;
370 virtual std::unique_ptr<reader_factory>
clone()
const override;
372 virtual bool seekable()
const override {
return true; }
374 virtual uint64_t size()
const override {
return data_.size(); }
377 std::string
const data_;
Buffer management and wait machinery for asynchronous I/O.
A buffer pool for use with async readers/writers.
Definition aio.hpp:107
Handle for asynchronous tasks.
Definition thread_pool.hpp:24
Waitable condition variable.
Definition mutex.hpp:215
Represents a point of time in wallclock, tracking the timestamps accuracy/precision.
Definition time.hpp:41
Common base class for all events.
Definition event.hpp:23
Simple handler for asynchronous event processing.
Definition event_handler.hpp:55
virtual bool multiple_buffer_usage() const override
Whether the reader can benefit from multiple buffers.
Definition reader.hpp:277
virtual std::unique_ptr< reader_base > open(aio_buffer_pool &pool, uint64_t offset=0, uint64_t size=reader_base::nosize, size_t max_buffers=4) override
Creates a reader.
virtual std::unique_ptr< reader_factory > clone() const override
Clones the factory.
file_reader(std::wstring &&name, aio_buffer_pool &pool, file &&f, thread_pool &tpool, uint64_t offset=0, uint64_t size=nosize, size_t max_buffers=4) noexcept
Constructs file reader.
Lean class for file access.
Definition file.hpp:29
Abstract interface for logging strings.
Definition logger.hpp:51
Lean replacement for std::(recursive_)mutex.
Definition mutex.hpp:57
Base class for all readers.
Definition reader.hpp:27
reader_base(std::wstring &&name, aio_buffer_pool &pool, size_t max_buffers) noexcept
Constructs a reader.
Definition reader.hpp:74
bool rewind()
Only seekable readers can be rewound.
virtual bool do_seek(scoped_lock &)
Definition reader.hpp:94
virtual uint64_t size() const
Size of the reader. If the size is indetermined, nosize is returned.
Definition reader.hpp:45
virtual datetime mtime() const
Last modification time, might be indetermined.
Definition reader.hpp:48
std::pair< aio_result, buffer_lease > get_buffer(event_handler &h)
Gets the next buffer with data from the reader.
bool seek(uint64_t offset, uint64_t size=nosize)
If seek fails, the reader is in an undefined state and must be closed.
virtual void operator()(event_base const &) override
Called by the event loop in the worker thread with the event to process.
A reader factory.
Definition reader.hpp:126
virtual size_t min_buffer_usage() const
The reader requires at least this many buffers.
Definition reader.hpp:166
virtual std::unique_ptr< reader_factory > clone() const =0
Clones the factory.
virtual bool multiple_buffer_usage() const
Whether the reader can benefit from multiple buffers.
Definition reader.hpp:173
virtual std::unique_ptr< reader_base > open(aio_buffer_pool &pool, uint64_t offset=0, uint64_t size=reader_base::nosize, size_t max_buffers=0)=0
Creates a reader.
A simple scoped lock.
Definition mutex.hpp:98
virtual std::unique_ptr< reader_base > open(aio_buffer_pool &pool, uint64_t offset=0, uint64_t size=reader_base::nosize, size_t max_buffers=1) override
Creates a reader.
virtual std::unique_ptr< reader_factory > clone() const override
Clones the factory.
A dumb thread-pool for asynchronous tasks.
Definition thread_pool.hpp:64
Base class for threaded readers.
Definition reader.hpp:219
virtual std::unique_ptr< reader_base > open(aio_buffer_pool &pool, uint64_t offset=0, uint64_t size=reader_base::nosize, size_t max_buffers=1) override
Creates a reader.
virtual std::unique_ptr< reader_factory > clone() const override
Clones the factory.
The namespace used by libfilezilla.
Definition apply.hpp:17
Declares thread_pool and async_task.