1#pragma once
2#include <forward_list>
3
4#include <IO/WriteBuffer.h>
5#include <IO/IReadableWriteBuffer.h>
6#include <Common/Allocator.h>
7#include <Core/Defines.h>
8#include <boost/noncopyable.hpp>
9
10
11namespace DB
12{
13
14/// Stores data in memory chunks, size of chunks are exponentially increasing during write
15/// Written data could be reread after write
16class MemoryWriteBuffer : public WriteBuffer, public IReadableWriteBuffer, boost::noncopyable, private Allocator<false>
17{
18public:
19
20 /// Use max_total_size_ = 0 for unlimited storage
21 MemoryWriteBuffer(
22 size_t max_total_size_ = 0,
23 size_t initial_chunk_size_ = DBMS_DEFAULT_BUFFER_SIZE,
24 double growth_rate_ = 2.0,
25 size_t max_chunk_size_ = 128 * DBMS_DEFAULT_BUFFER_SIZE);
26
27 void nextImpl() override;
28
29 ~MemoryWriteBuffer() override;
30
31protected:
32
33 std::shared_ptr<ReadBuffer> getReadBufferImpl() override;
34
35 const size_t max_total_size;
36 const size_t initial_chunk_size;
37 const size_t max_chunk_size;
38 const double growth_rate;
39
40 using Container = std::forward_list<BufferBase::Buffer>;
41
42 Container chunk_list;
43 Container::iterator chunk_tail;
44 size_t total_chunks_size = 0;
45
46 void addChunk();
47
48 friend class ReadBufferFromMemoryWriteBuffer;
49};
50
51
52}
53