34 friend class PdfObjectOutputStream;
35 friend class PdfParser;
36 friend class PdfWriter;
39 PODOFO_PRIVATE_FRIEND(
class PdfParser);
40 PODOFO_PRIVATE_FRIEND(
class PdfWriter);
95 void CollectGarbage();
102 unsigned GetSize()
const;
111 unsigned GetObjectCount()
const;
125 inline const PdfObjectNumSet& GetUnavailableObjects()
const {
return m_UnavailableObjects; }
134 class PODOFO_API Observer
138 virtual ~Observer() { }
143 virtual void BeginAppendStream(PdfObjectStream& stream) = 0;
148 virtual void EndAppendStream(PdfObjectStream& stream) = 0;
153 class PODOFO_API StreamFactory
156 virtual ~StreamFactory() { }
164 virtual std::unique_ptr<PdfObjectStreamProvider> CreateStream() = 0;
167 using ReferenceSet = std::set<PdfReference>;
168 using ObserverList = std::vector<Observer*>;
169 using ObjectList = std::set<PdfObject*, PdfObjectInequality>;
176 using iterator = ObjectList::const_iterator;
177 using reverse_iterator = ObjectList::const_reverse_iterator;
182 iterator begin()
const;
187 iterator end()
const;
189 reverse_iterator rbegin()
const;
191 reverse_iterator rend()
const;
196 PdfIndirectObjectList(PdfDocument& document);
197 PdfIndirectObjectList(PdfDocument& document,
const PdfIndirectObjectList& rhs);
199 PdfIndirectObjectList(
const PdfIndirectObjectList&) =
delete;
200 PdfIndirectObjectList& operator=(
const PdfIndirectObjectList&) =
delete;
203 void CollectGarbage(PdfObject& trailer);
212 std::unique_ptr<PdfObjectStreamProvider> CreateStream();
225 std::unique_ptr<PdfObject> RemoveObject(
const PdfReference& ref);
231 std::unique_ptr<PdfObject> RemoveObject(
const iterator& it);
247 void AttachObserver(Observer& observer);
253 void DetachObserver(Observer& observer);
258 void BeginAppendStream(PdfObjectStream& stream);
263 void EndAppendStream(PdfObjectStream& stream);
272 void PushObject(PdfObject* obj);
278 void AddFreeObjectSafe(
const PdfReference& reference);
283 void AddFreeObjectUnchecked(
const PdfReference& reference);
285 void AddUnavailableObject(uint32_t objNum);
291 void AddCompressedObjectStream(uint32_t objectNum);
293 std::unique_ptr<PdfObject> RemoveObject(
const PdfReference& ref,
bool markAsFree);
299 void SetStreamFactory(StreamFactory* factory);
303 void ResetFreeObjectsInvalidated();
307 bool AreFreeObjectsInvalidated()
const {
return m_FreeObjectsInvalidated; }
315 void markObjectFree(
const PdfReference& reference);
317 void pushObject(
const ObjectList::const_iterator& hintpos, ObjectList::node_type& node, PdfObject* obj);
319 std::unique_ptr<PdfObject> removeObject(
const iterator& it,
bool markAsFree);
321 void addNewObject(PdfObject* obj);
326 PdfReference getNextFreeObject();
328 void addFreeObject(uint32_t objnum, uint16_t gennum);
330 void visitObject(
const PdfObject& obj, std::unordered_set<PdfReference>& referencedObj);
338 void tryIncrementLastObjectNumber(uint32_t objNum);
341 PdfDocument* m_Document;
342 ObjectList m_Objects;
343 unsigned m_LastObjectNumber;
344 bool m_FreeObjectsInvalidated;
345 PdfFreeObjectList m_FreeObjects;
346 PdfObjectNumSet m_UnavailableObjects;
347 PdfObjectNumSet m_compressedObjectStreams;
349 ObserverList m_observers;
350 StreamFactory* m_StreamFactory;