33 friend class PdfObjectOutputStream;
34 friend class PdfParser;
37 PODOFO_PRIVATE_FRIEND(
class PdfParser);
93 void CollectGarbage();
100 unsigned GetSize()
const;
122 class PODOFO_API Observer
126 virtual ~Observer() { }
131 virtual void BeginAppendStream(PdfObjectStream& stream) = 0;
136 virtual void EndAppendStream(PdfObjectStream& stream) = 0;
141 class PODOFO_API StreamFactory
144 virtual ~StreamFactory() { }
152 virtual std::unique_ptr<PdfObjectStreamProvider> CreateStream() = 0;
155 using ObjectNumSet = std::set<uint32_t>;
156 using ReferenceSet = std::set<PdfReference>;
157 using ObserverList = std::vector<Observer*>;
158 using ObjectList = std::set<PdfObject*, PdfObjectInequality>;
165 using iterator = ObjectList::const_iterator;
166 using reverse_iterator = ObjectList::const_reverse_iterator;
171 iterator begin()
const;
176 iterator end()
const;
178 reverse_iterator rbegin()
const;
180 reverse_iterator rend()
const;
185 PdfIndirectObjectList(PdfDocument& document);
186 PdfIndirectObjectList(PdfDocument& document,
const PdfIndirectObjectList& rhs);
188 PdfIndirectObjectList(
const PdfIndirectObjectList&) =
delete;
189 PdfIndirectObjectList& operator=(
const PdfIndirectObjectList&) =
delete;
192 void CollectGarbage(PdfObject& trailer);
201 std::unique_ptr<PdfObjectStreamProvider> CreateStream();
214 std::unique_ptr<PdfObject> RemoveObject(
const PdfReference& ref);
220 std::unique_ptr<PdfObject> RemoveObject(
const iterator& it);
236 void AttachObserver(Observer& observer);
242 void DetachObserver(Observer& observer);
247 void BeginAppendStream(PdfObjectStream& stream);
252 void EndAppendStream(PdfObjectStream& stream);
261 void PushObject(PdfObject* obj);
272 bool TryAddFreeObject(
const PdfReference& reference);
284 int32_t SafeAddFreeObject(
const PdfReference& reference);
291 void AddFreeObject(
const PdfReference& reference);
297 void AddCompressedObjectStream(uint32_t objectNum);
299 std::unique_ptr<PdfObject> RemoveObject(
const PdfReference& ref,
bool markAsFree);
305 void SetStreamFactory(StreamFactory* factory);
308 void pushObject(
const ObjectList::const_iterator& hintpos, ObjectList::node_type& node, PdfObject* obj);
310 std::unique_ptr<PdfObject> removeObject(
const iterator& it,
bool markAsFree);
312 void addNewObject(PdfObject* obj);
317 PdfReference getNextFreeObject();
319 int32_t tryAddFreeObject(uint32_t objnum, uint32_t gennum);
321 void visitObject(
const PdfObject& obj, std::unordered_set<PdfReference>& referencedObj);
329 void tryIncrementObjectCount(
const PdfReference& ref);
332 PdfDocument* m_Document;
333 ObjectList m_Objects;
334 unsigned m_ObjectCount;
335 PdfFreeObjectList m_FreeObjects;
336 ObjectNumSet m_unavailableObjects;
337 ObjectNumSet m_compressedObjectStreams;
339 ObserverList m_observers;
340 StreamFactory* m_StreamFactory;