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 46 QPDF_DLL
47 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 49 QPDF_DLL
54 50 Buffer(Buffer&&) noexcept;
55 51 QPDF_DLL
56 52 Buffer& operator=(Buffer&&) noexcept;
57 53 QPDF_DLL
  54 + ~Buffer();
  55 + QPDF_DLL
58 56 size_t getSize() const;
59 57 QPDF_DLL
60 58 unsigned char const* getBuffer() const;
... ... @@ -65,29 +63,8 @@ class Buffer
65 63 QPDF_DLL
66 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 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 69 void copy(Buffer const&);
93 70  
... ...
libqpdf/Buffer.cc
... ... @@ -4,16 +4,23 @@
4 4  
5 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 25 Buffer::Members::Members(size_t size, unsigned char* buf, bool own_memory) :
19 26 own_memory(own_memory),
... ... @@ -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 77 Buffer::Buffer(Buffer&& rhs) noexcept :
85 78 m(std::move(rhs.m))
86 79 {
... ... @@ -93,6 +86,8 @@ Buffer::operator=(Buffer&amp;&amp; rhs) noexcept
93 86 return *this;
94 87 }
95 88  
  89 +Buffer::~Buffer() = default;
  90 +
96 91 void
97 92 Buffer::copy(Buffer const& rhs)
98 93 {
... ...
libtests/buffer.cc
... ... @@ -18,130 +18,65 @@ uc(char const* s)
18 18 int
19 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 81 try {
147 82 Pl_Discard discard;
... ...
manual/release-notes.rst
... ... @@ -9,18 +9,20 @@ For a detailed list of changes, please see the file
9 9  
10 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 12 - ``QIntC.hh`` contains the type ``substract``, which will be fixed
19 13 to ``subtract``. (Not enabled with ``FUTURE`` option.)
20 14  
21 15 .. x.y.z: not yet released
22 16  
23 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 26 - Library Enhancements
25 27  
26 28 - ``QPDFObjectHandle`` supports move construction/assignment.
... ...