Commit fa15042ce9f95b69dcd1dc89449ff3b295b9eff3
1 parent
a59e7ac7
Document decision not to remove raw QPDF pointers from the API
Showing
1 changed file
with
29 additions
and
10 deletions
TODO
| @@ -23,16 +23,6 @@ Pending changes: | @@ -23,16 +23,6 @@ Pending changes: | ||
| 23 | 23 | ||
| 24 | Soon: Break ground on "Document-level work" | 24 | Soon: Break ground on "Document-level work" |
| 25 | 25 | ||
| 26 | -Remove raw pointers from the API | ||
| 27 | -================================ | ||
| 28 | - | ||
| 29 | -(For qpdf >= 12) | ||
| 30 | - | ||
| 31 | -See if we can remove raw pointers from the QPDF API. There's a | ||
| 32 | -discussion in https://github.com/qpdf/qpdf/pull/747. Possibly | ||
| 33 | -deprecate creation of QPDF objects by any means other than | ||
| 34 | -QPDF::create(), which returns a std::shared_ptr<QPDF>. | ||
| 35 | - | ||
| 36 | Fix Multiple Direct Object Owner Issue | 26 | Fix Multiple Direct Object Owner Issue |
| 37 | ====================================== | 27 | ====================================== |
| 38 | 28 | ||
| @@ -774,3 +764,32 @@ Rejected Ideas | @@ -774,3 +764,32 @@ Rejected Ideas | ||
| 774 | stream filter, as well as modification of a stream's dictionary to | 764 | stream filter, as well as modification of a stream's dictionary to |
| 775 | include creation of a new stream that is referenced from | 765 | include creation of a new stream that is referenced from |
| 776 | /DecodeParms. | 766 | /DecodeParms. |
| 767 | + | ||
| 768 | +* Removal of raw QPDF* from the API. Discussions in #747 and #754. | ||
| 769 | + This is a summary of the arguments I put forth in #754. The idea was | ||
| 770 | + to make QPDF::QPDF() private and require all QPDF objects to be | ||
| 771 | + shared pointers created with QPDF::create(). This would enable us to | ||
| 772 | + have QPDFObjectHandle::getOwningQPDF() return a std::weak_ptr<QPDF>. | ||
| 773 | + Prior to #726 (QPDFObject/QPDFValue split, released in qpdf 11.0.0), | ||
| 774 | + getOwningQPDF() could return an invalid pointer if the owning QPDF | ||
| 775 | + disappeared, but this is no longer the case, which removes the main | ||
| 776 | + motivation. QPDF 11 added QPDF::create() anyway though. | ||
| 777 | + | ||
| 778 | + Removing raw QPDF* would look something like this. Note that you | ||
| 779 | + can't use std::make_shared<T> unless T has a public constructor. | ||
| 780 | + | ||
| 781 | + QPDF_POINTER_TRANSITION = 0 -- no warnings around calling the QPDF constructor | ||
| 782 | + QPDF_POINTER_TRANSITION = 1 -- calls to QPDF() are deprecated, but QPDF is still available so code can be backward compatible and use std::make_shared<QPDF> | ||
| 783 | + QPDF_POINTER_TRANSITION = 2 -- the QPDF constructor is private; all calls to std::make_shared<QPDF> have to be replaced with QPDF::create | ||
| 784 | + | ||
| 785 | + If we were to do this, we'd have to look at each use of QPDF* in the | ||
| 786 | + interface and decide whether to use a std::shared_ptr or a | ||
| 787 | + std::weak_ptr. The answer would almost always be to use a | ||
| 788 | + std::weak_ptr, which means we'd have to take the extra step of | ||
| 789 | + calling lock(), and it means there would be lots of code changes | ||
| 790 | + cause people would have to pass weak pointers instead of raw | ||
| 791 | + pointers around, and those have to be constructed and locked. | ||
| 792 | + Passing std::shared_ptr around leaves the possibility of creating | ||
| 793 | + circular references. It seems to be too much trouble in the library | ||
| 794 | + and too much toil for library users to be worth the small benefit of | ||
| 795 | + not having to call resetObjGen in QPDF's destructor. |