38 friend class PdfObjectOutputStream;
41 PODOFO_PRIVATE_FRIEND(
class PdfParser);
96 unsigned GetSize()
const;
103 unsigned GetObjectCount()
const;
114 inline const PdfObjectNumSet& GetUnavailableObjects()
const {
return m_UnavailableObjects; }
121 class PODOFO_API Observer
125 virtual ~Observer() { }
129 virtual void BeginAppendStream(PdfObjectStream& stream) = 0;
133 virtual void EndAppendStream(PdfObjectStream& stream) = 0;
137 class PODOFO_API StreamFactory
140 virtual ~StreamFactory() { }
147 virtual std::unique_ptr<PdfObjectStreamProvider> CreateStream() = 0;
150 using ReferenceSet = std::set<PdfReference>;
151 using ObserverList = std::vector<Observer*>;
152 using ObjectList = std::set<PdfObject*, PdfObjectInequality>;
159 using iterator = ObjectList::const_iterator;
160 using reverse_iterator = ObjectList::const_reverse_iterator;
164 iterator begin()
const;
168 iterator end()
const;
170 reverse_iterator rbegin()
const;
172 reverse_iterator rend()
const;
177 PdfIndirectObjectList(PdfDocument& document);
178 PdfIndirectObjectList(PdfDocument& document,
const PdfIndirectObjectList& rhs);
180 PdfIndirectObjectList(
const PdfIndirectObjectList&) =
delete;
181 PdfIndirectObjectList& operator=(
const PdfIndirectObjectList&) =
delete;
184 void CollectGarbage(PdfObject& trailer,
bool fixInvalidReference);
192 std::unique_ptr<PdfObjectStreamProvider> CreateStream();
201 std::unique_ptr<PdfObject> RemoveObject(
const PdfReference& ref);
206 std::unique_ptr<PdfObject> RemoveObject(
const iterator& it);
220 void AttachObserver(Observer& observer);
225 void DetachObserver(Observer& observer);
229 void BeginAppendStream(PdfObjectStream& stream);
233 void EndAppendStream(PdfObjectStream& stream);
241 void PushObject(std::unique_ptr<PdfObject> obj);
246 void AddFreeObjectSafe(
const PdfReference& reference);
250 void AddFreeObjectUnchecked(
const PdfReference& reference);
252 void AddUnavailableObject(uint32_t objNum);
257 void AddCompressedObjectStream(uint32_t objectNum);
264 void ClearCompressedObjectStreams();
268 void RemoveCompressedObjectStream(uint32_t objectNum);
271 bool IsCompressedObjectStream(uint32_t objectNum)
const;
273 inline const PdfObjectNumSet& GetCompressedObjectStreams()
const {
return m_compressedObjectStreams; }
275 std::unique_ptr<PdfObject> RemoveObject(
const PdfReference& ref,
bool markAsFree);
280 void SetStreamFactory(StreamFactory* factory);
283 void ResetFreeObjectsInvalidated();
286 bool AreFreeObjectsInvalidated()
const {
return m_FreeObjectsInvalidated; }
294 void markObjectFree(
const PdfReference& reference,
bool doConsistencyCheck);
296 void pushObject(
const ObjectList::const_iterator& hintpos, ObjectList::node_type& node, PdfObject* obj);
298 std::unique_ptr<PdfObject> removeObject(
const iterator& it,
bool markAsFree);
300 void addNewObject(std::unique_ptr<PdfObject>&& obj);
303 PdfReference getNextFreeObject();
305 void visitObject(PdfObject& obj, std::unordered_set<PdfReference>& referencedObj,
bool fixInvalidReference);
311 void tryIncrementLastObjectNumber(uint32_t objNum);
314 PdfDocument* m_Document;
315 ObjectList m_Objects;
316 unsigned m_LastObjectNumber;
317 bool m_FreeObjectsInvalidated;
318 PdfFreeObjectList m_FreeObjects;
319 PdfObjectNumSet m_UnavailableObjects;
320 PdfObjectNumSet m_compressedObjectStreams;
322 ObserverList m_observers;
323 StreamFactory* m_StreamFactory;