| 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
 | #include "buffer.h"
#include "mem_copy.h"
#include "string.h"
#include "ymath.h"
#include <util/system/sys_alloc.h>
#include <util/system/sanitizers.h>
TBuffer::TBuffer(size_t len)
    : Data_(nullptr)
    , Len_(0)
    , Pos_(0)
{
    Reserve(len);
}
TBuffer::TBuffer(TBuffer&& b) noexcept
    : Data_(nullptr)
    , Len_(0)
    , Pos_(0)
{
    Swap(b);
}
TBuffer::TBuffer(const char* buf, size_t len)
    : Data_(nullptr)
    , Len_(0)
    , Pos_(0)
{
    Append(buf, len);
}
TBuffer& TBuffer::operator=(TBuffer&& b) noexcept {
    y_deallocate(Data_);
    Data_ = b.Data_;
    Len_ = b.Len_;
    Pos_ = b.Pos_;
    b.Data_ = nullptr;
    b.Len_ = 0;
    b.Pos_ = 0;
    return *this;
}
void TBuffer::Append(const char* buf, size_t len) {
    if (len > Avail()) {
        Reserve(Pos_ + len);
    }
    Y_ASSERT(len <= Avail());
    MemCopy(Data() + Pos_, buf, len);
    NSan::Unpoison(Data() + Pos_, len);
    Pos_ += len;
    Y_ASSERT(Pos_ <= Len_);
}
void TBuffer::Fill(char ch, size_t len) {
    if (len > Avail()) {
        Reserve(Pos_ + len);
    }
    Y_ASSERT(len <= Avail());
    memset(Data() + Pos_, ch, len);
    NSan::Unpoison(Data() + Pos_, len);
    Pos_ += len;
    Y_ASSERT(Pos_ <= Len_);
}
void TBuffer::DoReserve(size_t realLen) {
    // FastClp2<T>(x) returns 0 on x from [Max<T>/2 + 2, Max<T>]
    const size_t len = Max<size_t>(FastClp2(realLen), realLen);
    Y_ASSERT(realLen > Len_);
    Y_ASSERT(len >= realLen);
    Realloc(len);
}
void TBuffer::Realloc(size_t len) {
    Y_ASSERT(Pos_ <= len);
    Data_ = (char*)y_reallocate(Data_, len);
    Len_ = len;
}
TBuffer::~TBuffer() {
    y_deallocate(Data_);
}
void TBuffer::AsString(TString& s) {
    s.assign(Data(), Size());
    Clear();
}
 |