71class TZeroCopyEnvelopeReaderV2 {
73 TZeroCopyEnvelopeReaderV2(
size_t chunkSize = 1024 * 1024,
size_t lowWatermark = 64 * 1024);
75 std::span<char> Acquire(
size_t size);
76 void Commit(
size_t size);
77 std::optional<TEnvelope> Pop();
81 bool NeedMoreData()
const {
82 return !HasHeader || Size() < Header.Size;
86 void Push(
const char* p,
size_t len);
88 int UsedChunksCount()
const {
89 return UsedChunks.Size();
96 void ReleaseDrained(std::unique_ptr<TChunk> chunk);
98 bool CopyOut(
char* buf);
99 void CopyOut(
char* buf,
size_t size);
100 TBlob ExtractBlob(TChunk& chunk,
size_t size);
103 TChunk(
size_t size, TZeroCopyEnvelopeReaderV2* parent);
105 std::span<char> TryAcquire(
size_t size,
size_t lowWatermark);
106 std::span<char> Acquire(
size_t size);
107 void Commit(
size_t size);
108 template<
size_t size>
109 bool CopyOut(
char* buf);
110 bool CopyOut(
char* buf,
size_t size);
114 std::vector<char> Data;
119 TZeroCopyEnvelopeReaderV2* Parent =
nullptr;
122 const size_t ChunkSize;
123 const size_t LowWatermark;
124 size_t CurrentSize = 0;
126 bool HasHeader =
false;
127 std::unique_ptr<TChunk> CurrentChunk;
129 std::vector<std::unique_ptr<TChunk>> FreeChunks;