31 friend class PdfObjectOutputStream;
32 friend class PdfParser;
33 friend class PdfWriter;
36 PODOFO_PRIVATE_FRIEND(
class PdfParser);
37 PODOFO_PRIVATE_FRIEND(
class PdfWriter);
86 void CollectGarbage();
91 unsigned GetSize()
const;
98 unsigned GetObjectCount()
const;
109 inline const PdfObjectNumSet& GetUnavailableObjects()
const {
return m_UnavailableObjects; }
116 class PODOFO_API Observer
120 virtual ~Observer() { }
124 virtual void BeginAppendStream(PdfObjectStream& stream) = 0;
128 virtual void EndAppendStream(PdfObjectStream& stream) = 0;
132 class PODOFO_API StreamFactory
135 virtual ~StreamFactory() { }
142 virtual std::unique_ptr<PdfObjectStreamProvider> CreateStream() = 0;
145 using ReferenceSet = std::set<PdfReference>;
146 using ObserverList = std::vector<Observer*>;
147 using ObjectList = std::set<PdfObject*, PdfObjectInequality>;
154 using iterator = ObjectList::const_iterator;
155 using reverse_iterator = ObjectList::const_reverse_iterator;
159 iterator begin()
const;
163 iterator end()
const;
165 reverse_iterator rbegin()
const;
167 reverse_iterator rend()
const;
172 PdfIndirectObjectList(PdfDocument& document);
173 PdfIndirectObjectList(PdfDocument& document,
const PdfIndirectObjectList& rhs);
175 PdfIndirectObjectList(
const PdfIndirectObjectList&) =
delete;
176 PdfIndirectObjectList& operator=(
const PdfIndirectObjectList&) =
delete;
179 void CollectGarbage(PdfObject& trailer);
187 std::unique_ptr<PdfObjectStreamProvider> CreateStream();
196 std::unique_ptr<PdfObject> RemoveObject(
const PdfReference& ref);
201 std::unique_ptr<PdfObject> RemoveObject(
const iterator& it);
215 void AttachObserver(Observer& observer);
220 void DetachObserver(Observer& observer);
224 void BeginAppendStream(PdfObjectStream& stream);
228 void EndAppendStream(PdfObjectStream& stream);
236 void PushObject(std::unique_ptr<PdfObject> obj);
241 void AddFreeObjectSafe(
const PdfReference& reference);
245 void AddFreeObjectUnchecked(
const PdfReference& reference);
247 void AddUnavailableObject(uint32_t objNum);
252 void AddCompressedObjectStream(uint32_t objectNum);
254 std::unique_ptr<PdfObject> RemoveObject(
const PdfReference& ref,
bool markAsFree);
259 void SetStreamFactory(StreamFactory* factory);
262 void ResetFreeObjectsInvalidated();
265 bool AreFreeObjectsInvalidated()
const {
return m_FreeObjectsInvalidated; }
273 void markObjectFree(
const PdfReference& reference,
bool doConsistencyCheck);
275 void pushObject(
const ObjectList::const_iterator& hintpos, ObjectList::node_type& node, PdfObject* obj);
277 std::unique_ptr<PdfObject> removeObject(
const iterator& it,
bool markAsFree);
279 void addNewObject(std::unique_ptr<PdfObject>&& obj);
282 PdfReference getNextFreeObject();
284 void visitObject(
const PdfObject& obj, std::unordered_set<PdfReference>& referencedObj);
290 void tryIncrementLastObjectNumber(uint32_t objNum);
293 PdfDocument* m_Document;
294 ObjectList m_Objects;
295 unsigned m_LastObjectNumber;
296 bool m_FreeObjectsInvalidated;
297 PdfFreeObjectList m_FreeObjects;
298 PdfObjectNumSet m_UnavailableObjects;
299 PdfObjectNumSet m_compressedObjectStreams;
301 ObserverList m_observers;
302 StreamFactory* m_StreamFactory;