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 ObjectList = std::set<PdfObject*, PdfObjectInequality>;
158 using iterator = ObjectList::const_iterator;
159 using reverse_iterator = ObjectList::const_reverse_iterator;
163 iterator begin()
const;
167 iterator end()
const;
169 reverse_iterator rbegin()
const;
171 reverse_iterator rend()
const;
176 PdfIndirectObjectList(PdfDocument& document);
177 PdfIndirectObjectList(PdfDocument& document,
const PdfIndirectObjectList& rhs);
179 PdfIndirectObjectList(
const PdfIndirectObjectList&) =
delete;
180 PdfIndirectObjectList& operator=(
const PdfIndirectObjectList&) =
delete;
183 void CollectGarbage(PdfObject& trailer,
bool fixInvalidReference);
191 std::unique_ptr<PdfObjectStreamProvider> CreateStream();
200 std::unique_ptr<PdfObject> RemoveObject(
const PdfReference& ref);
205 std::unique_ptr<PdfObject> RemoveObject(
const iterator& it);
214 void AttachObserver(Observer& observer);
219 void DetachObserver();
223 void BeginAppendStream(PdfObjectStream& stream);
227 void EndAppendStream(PdfObjectStream& stream);
235 void PushObject(std::unique_ptr<PdfObject> obj);
240 void AddFreeObjectSafe(
const PdfReference& reference);
244 void AddFreeObjectUnchecked(
const PdfReference& reference);
246 void AddUnavailableObject(uint32_t objNum);
251 void AddCompressedObjectStream(uint32_t objectNum);
258 void ClearCompressedObjectStreams();
262 void RemoveCompressedObjectStream(uint32_t objectNum);
265 bool IsCompressedObjectStream(uint32_t objectNum)
const;
267 inline const PdfObjectNumSet& GetCompressedObjectStreams()
const {
return m_compressedObjectStreams; }
269 std::unique_ptr<PdfObject> RemoveObject(
const PdfReference& ref,
bool markAsFree);
274 void SetStreamFactory(StreamFactory* factory);
278 void ClearFreeObjectsDelta();
282 inline const PdfObjectNumSet& GetFreeObjectsDelta()
const {
return m_freeObjectsDelta; }
285 bool TryFindFreeObject(uint32_t objNum, PdfReference& ref)
const;
293 void markObjectFree(
const PdfReference& reference,
bool doConsistencyCheck);
295 void pushObject(
const ObjectList::const_iterator& hintpos, ObjectList::node_type& node, PdfObject* obj);
297 std::unique_ptr<PdfObject> removeObject(
const iterator& it,
bool markAsFree);
299 void addNewObject(std::unique_ptr<PdfObject>&& obj);
302 PdfReference getNextFreeObject();
304 void visitObject(PdfObject& obj, std::unordered_set<PdfReference>& referencedObj,
bool fixInvalidReference);
310 void tryIncrementLastObjectNumber(uint32_t objNum);
313 PdfDocument* m_Document;
314 ObjectList m_Objects;
315 unsigned m_LastObjectNumber;
316 PdfFreeObjectList m_FreeObjects;
317 PdfObjectNumSet m_UnavailableObjects;
318 PdfObjectNumSet m_freeObjectsDelta;
319 PdfObjectNumSet m_compressedObjectStreams;
321 Observer* m_observer;
322 StreamFactory* m_StreamFactory;