diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /library/cpp/yson_pull/input.h | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'library/cpp/yson_pull/input.h')
-rw-r--r-- | library/cpp/yson_pull/input.h | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/library/cpp/yson_pull/input.h b/library/cpp/yson_pull/input.h new file mode 100644 index 0000000000..2cdfae857e --- /dev/null +++ b/library/cpp/yson_pull/input.h @@ -0,0 +1,81 @@ +#pragma once + +#include "buffer.h" + +#include <util/generic/ptr.h> +#include <util/generic/strbuf.h> +#include <util/system/types.h> +#include <util/system/yassert.h> + +#include <cstddef> +#include <memory> + +class IInputStream; +class IZeroCopyInput; + +namespace NYsonPull { + namespace NInput { + //! \brief Input stream adaptor interface. + //! + //! Represents a model of a chunked input data stream. + class IStream { + input_buffer buffer_; + bool at_end_ = false; + + public: + virtual ~IStream() = default; + + bool at_end() const { + return at_end_; + } + + input_buffer& buffer() noexcept { + return buffer_; + } + const input_buffer& buffer() const noexcept { + return buffer_; + } + + void fill_buffer() { + while (buffer_.is_empty() && !at_end()) { + at_end_ = do_fill_buffer() == result::at_end; + } + } + + protected: + enum class result { + have_more_data, //! May continue reading + at_end, //! Reached end of stream + }; + + //! \brief Read next chunk of data. + //! + //! The implementation is to discard the buffer contents + //! and reset the buffer to a next chunk of data. + //! End-of-stream condition is to be reported via return value. + //! + //! Read is assumed to always succeed unless it throws an exception. + virtual result do_fill_buffer() = 0; + }; + + //! \brief Read data from a contiguous memory block (i.e. a string) + //! + //! Does not take ownership on memory. + THolder<IStream> FromMemory(TStringBuf data); + + //! \brief Read data from C FILE* object. + //! + //! Does not take ownership on file object. + //! Data is buffered internally regardless of file buffering. + THolder<IStream> FromStdioFile(FILE* file, size_t buffer_size = 65536); + + //! \brief Read data from POSIX file descriptor. + //! + //! Does not take ownership on streambuf. + THolder<IStream> FromPosixFd(int fd, size_t buffer_size = 65536); + + THolder<IStream> FromZeroCopyInput(IZeroCopyInput* input); + + THolder<IStream> FromInputStream(IInputStream* input, size_t buffer_size = 65536); + } +} |