Commit a7aec81ff8b5741ebbfae9a0e5f7b0dcbdd13740

Authored by m-holger
1 parent 5de0cea9

Remove deprecated methods from Buffer

Also, move Buffer::Members definition to Buffer.cc
include/qpdf/Buffer.hh
@@ -46,15 +46,13 @@ class Buffer @@ -46,15 +46,13 @@ class Buffer
46 QPDF_DLL 46 QPDF_DLL
47 Buffer(std::string& content); 47 Buffer(std::string& content);
48 48
49 - [[deprecated("Move Buffer or use Buffer::copy instead")]] QPDF_DLL Buffer(Buffer const&);  
50 - [[deprecated("Move Buffer or use Buffer::copy instead")]] QPDF_DLL Buffer&  
51 - operator=(Buffer const&);  
52 -  
53 QPDF_DLL 49 QPDF_DLL
54 Buffer(Buffer&&) noexcept; 50 Buffer(Buffer&&) noexcept;
55 QPDF_DLL 51 QPDF_DLL
56 Buffer& operator=(Buffer&&) noexcept; 52 Buffer& operator=(Buffer&&) noexcept;
57 QPDF_DLL 53 QPDF_DLL
  54 + ~Buffer();
  55 + QPDF_DLL
58 size_t getSize() const; 56 size_t getSize() const;
59 QPDF_DLL 57 QPDF_DLL
60 unsigned char const* getBuffer() const; 58 unsigned char const* getBuffer() const;
@@ -65,29 +63,8 @@ class Buffer @@ -65,29 +63,8 @@ class Buffer
65 QPDF_DLL 63 QPDF_DLL
66 Buffer copy() const; 64 Buffer copy() const;
67 65
68 - // Only used during CI testing.  
69 - // ABI: remove when removing copy constructor / assignment operator  
70 - static void setTestMode() noexcept;  
71 -  
72 private: 66 private:
73 - class Members  
74 - {  
75 - friend class Buffer;  
76 -  
77 - public:  
78 - QPDF_DLL  
79 - ~Members();  
80 -  
81 - private:  
82 - Members(size_t size, unsigned char* buf, bool own_memory);  
83 - Members(std::string&& content);  
84 - Members(Members const&) = delete;  
85 -  
86 - std::string str;  
87 - bool own_memory;  
88 - size_t size;  
89 - unsigned char* buf;  
90 - }; 67 + class Members;
91 68
92 void copy(Buffer const&); 69 void copy(Buffer const&);
93 70
libqpdf/Buffer.cc
@@ -4,16 +4,23 @@ @@ -4,16 +4,23 @@
4 4
5 #include <cstring> 5 #include <cstring>
6 6
7 -bool test_mode = false;  
8 -  
9 -// During CI the Buffer copy constructor and copy assignment operator throw an assertion error to  
10 -// detect their accidental use. Call setTestMode to surpress the assertion errors for testing of  
11 -// copy construction and assignment.  
12 -void  
13 -Buffer::setTestMode() noexcept 7 +class Buffer::Members
14 { 8 {
15 - test_mode = true;  
16 -} 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 +};
17 24
18 Buffer::Members::Members(size_t size, unsigned char* buf, bool own_memory) : 25 Buffer::Members::Members(size_t size, unsigned char* buf, bool own_memory) :
19 own_memory(own_memory), 26 own_memory(own_memory),
@@ -67,20 +74,6 @@ Buffer::Buffer(std::string&amp; content) : @@ -67,20 +74,6 @@ Buffer::Buffer(std::string&amp; content) :
67 { 74 {
68 } 75 }
69 76
70 -Buffer::Buffer(Buffer const& rhs)  
71 -{  
72 - assert(test_mode);  
73 - copy(rhs);  
74 -}  
75 -  
76 -Buffer&  
77 -Buffer::operator=(Buffer const& rhs)  
78 -{  
79 - assert(test_mode);  
80 - copy(rhs);  
81 - return *this;  
82 -}  
83 -  
84 Buffer::Buffer(Buffer&& rhs) noexcept : 77 Buffer::Buffer(Buffer&& rhs) noexcept :
85 m(std::move(rhs.m)) 78 m(std::move(rhs.m))
86 { 79 {
@@ -93,6 +86,8 @@ Buffer::operator=(Buffer&amp;&amp; rhs) noexcept @@ -93,6 +86,8 @@ Buffer::operator=(Buffer&amp;&amp; rhs) noexcept
93 return *this; 86 return *this;
94 } 87 }
95 88
  89 +Buffer::~Buffer() = default;
  90 +
96 void 91 void
97 Buffer::copy(Buffer const& rhs) 92 Buffer::copy(Buffer const& rhs)
98 { 93 {
libtests/buffer.cc
@@ -18,130 +18,65 @@ uc(char const* s) @@ -18,130 +18,65 @@ uc(char const* s)
18 int 18 int
19 main() 19 main()
20 { 20 {
21 - {  
22 - // Test that buffers can be copied by value using Buffer::copy.  
23 - Buffer bc1(2);  
24 - unsigned char* bc1p = bc1.getBuffer();  
25 - bc1p[0] = 'Q';  
26 - bc1p[1] = 'W';  
27 - Buffer bc2(bc1.copy());  
28 - bc1p[0] = 'R';  
29 - unsigned char* bc2p = bc2.getBuffer();  
30 - assert(bc2p != bc1p);  
31 - assert(bc2p[0] == 'Q');  
32 - assert(bc2p[1] == 'W');  
33 - bc2 = bc1.copy();  
34 - bc2p = bc2.getBuffer();  
35 - assert(bc2p != bc1p);  
36 - assert(bc2p[0] == 'R');  
37 - assert(bc2p[1] == 'W');  
38 -  
39 - // Test Buffer(std:string&&)  
40 - Buffer bc3("QW");  
41 - unsigned char* bc3p = bc3.getBuffer();  
42 - Buffer bc4(bc3.copy());  
43 - bc3p[0] = 'R';  
44 - unsigned char* bc4p = bc4.getBuffer();  
45 - assert(bc4p != bc3p);  
46 - assert(bc4p[0] == 'Q');  
47 - assert(bc4p[1] == 'W');  
48 - bc4 = bc3.copy();  
49 - bc4p = bc4.getBuffer();  
50 - assert(bc4p != bc3p);  
51 - assert(bc4p[0] == 'R');  
52 - assert(bc4p[1] == 'W');  
53 - }  
54 -  
55 -#ifdef _MSC_VER  
56 -# pragma warning(disable : 4996)  
57 -#endif  
58 -#if (defined(__GNUC__) || defined(__clang__))  
59 -# pragma GCC diagnostic push  
60 -# pragma GCC diagnostic ignored "-Wdeprecated-declarations"  
61 -#endif  
62 - {  
63 - // Test that buffers can be copied by value using copy construction / assignment.  
64 - Buffer::setTestMode();  
65 - Buffer bc1(2);  
66 - unsigned char* bc1p = bc1.getBuffer();  
67 - bc1p[0] = 'Q';  
68 - bc1p[1] = 'W';  
69 - Buffer bc2(bc1);  
70 - bc1p[0] = 'R';  
71 - unsigned char* bc2p = bc2.getBuffer();  
72 - assert(bc2p != bc1p);  
73 - assert(bc2p[0] == 'Q');  
74 - assert(bc2p[1] == 'W');  
75 - bc2 = bc1;  
76 - bc2p = bc2.getBuffer();  
77 - assert(bc2p != bc1p);  
78 - assert(bc2p[0] == 'R');  
79 - assert(bc2p[1] == 'W');  
80 -  
81 - // Test Buffer(std:string&&)  
82 - Buffer bc3("QW");  
83 - unsigned char* bc3p = bc3.getBuffer();  
84 - Buffer bc4(bc3);  
85 - bc3p[0] = 'R';  
86 - unsigned char* bc4p = bc4.getBuffer();  
87 - assert(bc4p != bc3p);  
88 - assert(bc4p[0] == 'Q');  
89 - assert(bc4p[1] == 'W');  
90 - bc4 = bc3;  
91 - bc4p = bc4.getBuffer();  
92 - assert(bc4p != bc3p);  
93 - assert(bc2p[0] == 'R');  
94 - assert(bc2p[1] == 'W');  
95 -  
96 - // Test Buffer(std:string&)  
97 - std::string s{"QW"};  
98 - Buffer bc5(s);  
99 - unsigned char* bc5p = bc5.getBuffer();  
100 - Buffer bc6(bc5);  
101 - bc5p[0] = 'R';  
102 - unsigned char* bc6p = bc6.getBuffer();  
103 - assert(bc6p != bc5p);  
104 - assert(bc6p[0] == 'Q');  
105 - assert(bc6p[1] == 'W');  
106 - bc6 = bc5;  
107 - bc6p = bc6.getBuffer();  
108 - assert(bc6p != bc5p);  
109 - assert(bc2p[0] == 'R');  
110 - assert(bc2p[1] == 'W');  
111 - }  
112 -#if (defined(__GNUC__) || defined(__clang__))  
113 -# pragma GCC diagnostic pop  
114 -#endif  
115 -  
116 - {  
117 - // Test that buffers can be moved.  
118 - Buffer bm1(2);  
119 - unsigned char* bm1p = bm1.getBuffer();  
120 - bm1p[0] = 'Q';  
121 - bm1p[1] = 'W';  
122 - Buffer bm2(std::move(bm1));  
123 - bm1p[0] = 'R';  
124 - unsigned char* bm2p = bm2.getBuffer();  
125 - assert(bm2p == bm1p);  
126 - assert(bm2p[0] == 'R');  
127 -  
128 - Buffer bm3 = std::move(bm2);  
129 - unsigned char* bm3p = bm3.getBuffer();  
130 - assert(bm3p == bm2p);  
131 -  
132 - // Test Buffer(dtd::string&&)  
133 - Buffer bm4("QW");  
134 - unsigned char* bm4p = bm4.getBuffer();  
135 - Buffer bm5(std::move(bm4));  
136 - bm4p[0] = 'R';  
137 - unsigned char* bm5p = bm5.getBuffer();  
138 - assert(bm5p == bm4p);  
139 - assert(bm5p[0] == 'R');  
140 -  
141 - Buffer bm6 = std::move(bm5);  
142 - unsigned char* bm6p = bm6.getBuffer();  
143 - assert(bm6p == bm5p);  
144 - } 21 + // Test that buffers can be copied by value using Buffer::copy.
  22 + Buffer bc1(2);
  23 + unsigned char* bc1p = bc1.getBuffer();
  24 + bc1p[0] = 'Q';
  25 + bc1p[1] = 'W';
  26 + Buffer bc2(bc1.copy());
  27 + bc1p[0] = 'R';
  28 + unsigned char* bc2p = bc2.getBuffer();
  29 + assert(bc2p != bc1p);
  30 + assert(bc2p[0] == 'Q');
  31 + assert(bc2p[1] == 'W');
  32 + bc2 = bc1.copy();
  33 + bc2p = bc2.getBuffer();
  34 + assert(bc2p != bc1p);
  35 + assert(bc2p[0] == 'R');
  36 + assert(bc2p[1] == 'W');
  37 +
  38 + // Test Buffer(std:string&&)
  39 + Buffer bc3("QW");
  40 + unsigned char* bc3p = bc3.getBuffer();
  41 + Buffer bc4(bc3.copy());
  42 + bc3p[0] = 'R';
  43 + unsigned char* bc4p = bc4.getBuffer();
  44 + assert(bc4p != bc3p);
  45 + assert(bc4p[0] == 'Q');
  46 + assert(bc4p[1] == 'W');
  47 + bc4 = bc3.copy();
  48 + bc4p = bc4.getBuffer();
  49 + assert(bc4p != bc3p);
  50 + assert(bc4p[0] == 'R');
  51 + assert(bc4p[1] == 'W');
  52 +
  53 + // Test that buffers can be moved.
  54 + Buffer bm1(2);
  55 + unsigned char* bm1p = bm1.getBuffer();
  56 + bm1p[0] = 'Q';
  57 + bm1p[1] = 'W';
  58 + Buffer bm2(std::move(bm1));
  59 + bm1p[0] = 'R';
  60 + unsigned char* bm2p = bm2.getBuffer();
  61 + assert(bm2p == bm1p);
  62 + assert(bm2p[0] == 'R');
  63 +
  64 + Buffer bm3 = std::move(bm2);
  65 + unsigned char* bm3p = bm3.getBuffer();
  66 + assert(bm3p == bm2p);
  67 +
  68 + // Test Buffer(dtd::string&&)
  69 + Buffer bm4("QW");
  70 + unsigned char* bm4p = bm4.getBuffer();
  71 + Buffer bm5(std::move(bm4));
  72 + bm4p[0] = 'R';
  73 + unsigned char* bm5p = bm5.getBuffer();
  74 + assert(bm5p == bm4p);
  75 + assert(bm5p[0] == 'R');
  76 +
  77 + Buffer bm6 = std::move(bm5);
  78 + unsigned char* bm6p = bm6.getBuffer();
  79 + assert(bm6p == bm5p);
145 80
146 try { 81 try {
147 Pl_Discard discard; 82 Pl_Discard discard;
manual/release-notes.rst
@@ -9,18 +9,20 @@ For a detailed list of changes, please see the file @@ -9,18 +9,20 @@ For a detailed list of changes, please see the file
9 9
10 Planned changes for future 12.x (subject to change): 10 Planned changes for future 12.x (subject to change):
11 11
12 - - ``Buffer`` copy constructor and assignment operator will be  
13 - removed. ``Buffer`` copy operations are expensive as they always  
14 - involve copying the buffer content. Use ``buffer2 =  
15 - buffer1.copy();`` or ``Buffer buffer2{buffer1.copy()};`` to make  
16 - it explicit that copying is intended.  
17 -  
18 - ``QIntC.hh`` contains the type ``substract``, which will be fixed 12 - ``QIntC.hh`` contains the type ``substract``, which will be fixed
19 to ``subtract``. (Not enabled with ``FUTURE`` option.) 13 to ``subtract``. (Not enabled with ``FUTURE`` option.)
20 14
21 .. x.y.z: not yet released 15 .. x.y.z: not yet released
22 16
23 12.0.0: not yet released 17 12.0.0: not yet released
  18 + - API: breaking changes
  19 +
  20 + - ``Buffer`` copy constructor and assignment operator have been
  21 + removed. ``Buffer`` copy operations are expensive as they always
  22 + involve copying the buffer content. Use ``buffer2 = buffer1.copy();``
  23 + or ``Buffer buffer2{buffer1.copy()};`` to make it explicit that
  24 + copying is intended.
  25 +
24 - Library Enhancements 26 - Library Enhancements
25 27
26 - ``QPDFObjectHandle`` supports move construction/assignment. 28 - ``QPDFObjectHandle`` supports move construction/assignment.