Coverage Report

Created: 2025-07-14 06:16

/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
600k
    own_memory(own_memory),
27
600k
    size(size),
28
600k
    buf(nullptr)
29
600k
{
30
600k
    if (own_memory) {
31
533k
        this->buf = (size ? new unsigned char[size] : nullptr);
32
533k
    } else {
33
67.0k
        this->buf = buf;
34
67.0k
    }
35
600k
}
36
37
Buffer::Members::Members(std::string&& content) :
38
5.78k
    str(std::move(content)),
39
5.78k
    own_memory(false),
40
5.78k
    size(str.size()),
41
5.78k
    buf(reinterpret_cast<unsigned char*>(str.data()))
42
5.78k
{
43
5.78k
}
44
45
Buffer::Members::~Members()
46
606k
{
47
606k
    if (this->own_memory) {
48
533k
        delete[] this->buf;
49
533k
    }
50
606k
}
51
52
Buffer::Buffer() :
53
0
    m(new Members(0, nullptr, true))
54
0
{
55
0
}
56
57
Buffer::Buffer(size_t size) :
58
533k
    m(new Members(size, nullptr, true))
59
533k
{
60
533k
}
61
62
Buffer::Buffer(std::string&& content) :
63
5.78k
    m(new Members(std::move(content)))
64
5.78k
{
65
5.78k
}
66
67
Buffer::Buffer(unsigned char* buf, size_t size) :
68
56.1k
    m(new Members(size, buf, false))
69
56.1k
{
70
56.1k
}
71
72
Buffer::Buffer(std::string& content) :
73
10.9k
    m(new Members(content.size(), reinterpret_cast<unsigned char*>(content.data()), false))
74
10.9k
{
75
10.9k
}
76
77
Buffer::Buffer(Buffer&& rhs) noexcept :
78
975k
    m(std::move(rhs.m))
79
975k
{
80
975k
}
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
1.58M
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
84.6k
{
105
84.6k
    return m->size;
106
84.6k
}
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
5.20M
{
117
5.20M
    return m->buf;
118
5.20M
}
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
}