Coverage Report

Created: 2025-07-01 06:10

/src/qpdf/libqpdf/Buffer.cc
Line
Count
Source (jump to first uncovered line)
1
#include <qpdf/assert_test.h>
2
3
#include <qpdf/Buffer.hh>
4
5
#include <cstring>
6
7
class Buffer::Members
8
{
9
    friend class Buffer;
10
11
  public:
12
    ~Members();
13
14
  private:
15
    Members(size_t size, unsigned char* buf, bool own_memory);
16
    Members(std::string&& content);
17
    Members(Members const&) = delete;
18
19
    std::string str;
20
    bool own_memory;
21
    size_t size;
22
    unsigned char* buf;
23
};
24
25
Buffer::Members::Members(size_t size, unsigned char* buf, bool own_memory) :
26
0
    own_memory(own_memory),
27
0
    size(size),
28
0
    buf(nullptr)
29
0
{
30
0
    if (own_memory) {
31
0
        this->buf = (size ? new unsigned char[size] : nullptr);
32
0
    } else {
33
0
        this->buf = buf;
34
0
    }
35
0
}
36
37
Buffer::Members::Members(std::string&& content) :
38
0
    str(std::move(content)),
39
0
    own_memory(false),
40
0
    size(str.size()),
41
0
    buf(reinterpret_cast<unsigned char*>(str.data()))
42
0
{
43
0
}
44
45
Buffer::Members::~Members()
46
0
{
47
0
    if (this->own_memory) {
48
0
        delete[] this->buf;
49
0
    }
50
0
}
51
52
Buffer::Buffer() :
53
0
    m(new Members(0, nullptr, true))
54
0
{
55
0
}
56
57
Buffer::Buffer(size_t size) :
58
0
    m(new Members(size, nullptr, true))
59
0
{
60
0
}
61
62
Buffer::Buffer(std::string&& content) :
63
0
    m(new Members(std::move(content)))
64
0
{
65
0
}
66
67
Buffer::Buffer(unsigned char* buf, size_t size) :
68
0
    m(new Members(size, buf, false))
69
0
{
70
0
}
71
72
Buffer::Buffer(std::string& content) :
73
0
    m(new Members(content.size(), reinterpret_cast<unsigned char*>(content.data()), false))
74
0
{
75
0
}
76
77
Buffer::Buffer(Buffer&& rhs) noexcept :
78
0
    m(std::move(rhs.m))
79
0
{
80
0
}
81
82
Buffer&
83
Buffer::operator=(Buffer&& rhs) noexcept
84
0
{
85
0
    std::swap(m, rhs.m);
86
0
    return *this;
87
0
}
88
89
0
Buffer::~Buffer() = default;
90
91
void
92
Buffer::copy(Buffer const& rhs)
93
0
{
94
0
    if (this != &rhs) {
95
0
        m = std::unique_ptr<Members>(new Members(rhs.m->size, nullptr, true));
96
0
        if (m->size) {
97
0
            memcpy(m->buf, rhs.m->buf, m->size);
98
0
        }
99
0
    }
100
0
}
101
102
size_t
103
Buffer::getSize() const
104
0
{
105
0
    return m->size;
106
0
}
107
108
unsigned char const*
109
Buffer::getBuffer() const
110
0
{
111
0
    return m->buf;
112
0
}
113
114
unsigned char*
115
Buffer::getBuffer()
116
0
{
117
0
    return m->buf;
118
0
}
119
120
Buffer
121
Buffer::copy() const
122
0
{
123
0
    auto result = Buffer(m->size);
124
0
    if (m->size) {
125
0
        memcpy(result.m->buf, m->buf, m->size);
126
0
    }
127
0
    return result;
128
0
}