37 friend class PdfObjectOutputStream;
38 friend class PdfParser;
39 friend class PdfWriter;
42 PODOFO_PRIVATE_FRIEND(
class PdfParser);
43 PODOFO_PRIVATE_FRIEND(
class PdfWriter);
97 unsigned GetSize()
const;
104 unsigned GetObjectCount()
const;
115 inline const PdfObjectNumSet& GetUnavailableObjects()
const {
return m_UnavailableObjects; }
122 class PODOFO_API Observer
126 virtual ~Observer() { }
130 virtual void BeginAppendStream(PdfObjectStream& stream) = 0;
134 virtual void EndAppendStream(PdfObjectStream& stream) = 0;
138 class PODOFO_API StreamFactory
141 virtual ~StreamFactory() { }
148 virtual std::unique_ptr<PdfObjectStreamProvider> CreateStream() = 0;
151 using ReferenceSet = std::set<PdfReference>;
152 using ObserverList = std::vector<Observer*>;
153 using ObjectList = std::set<PdfObject*, PdfObjectInequality>;
160 using iterator = ObjectList::const_iterator;
161 using reverse_iterator = ObjectList::const_reverse_iterator;
165 iterator begin()
const;
169 iterator end()
const;
171 reverse_iterator rbegin()
const;
173 reverse_iterator rend()
const;
178 PdfIndirectObjectList(PdfDocument& document);
179 PdfIndirectObjectList(PdfDocument& document,
const PdfIndirectObjectList& rhs);
181 PdfIndirectObjectList(
const PdfIndirectObjectList&) =
delete;
182 PdfIndirectObjectList& operator=(
const PdfIndirectObjectList&) =
delete;
185 void CollectGarbage(PdfObject& trailer,
bool fixInvalidReference);
193 std::unique_ptr<PdfObjectStreamProvider> CreateStream();
202 std::unique_ptr<PdfObject> RemoveObject(
const PdfReference& ref);
207 std::unique_ptr<PdfObject> RemoveObject(
const iterator& it);
221 void AttachObserver(Observer& observer);
226 void DetachObserver(Observer& observer);
230 void BeginAppendStream(PdfObjectStream& stream);
234 void EndAppendStream(PdfObjectStream& stream);
242 void PushObject(std::unique_ptr<PdfObject> obj);
247 void AddFreeObjectSafe(
const PdfReference& reference);
251 void AddFreeObjectUnchecked(
const PdfReference& reference);
253 void AddUnavailableObject(uint32_t objNum);
258 void AddCompressedObjectStream(uint32_t objectNum);
260 std::unique_ptr<PdfObject> RemoveObject(
const PdfReference& ref,
bool markAsFree);
265 void SetStreamFactory(StreamFactory* factory);
268 void ResetFreeObjectsInvalidated();
271 bool AreFreeObjectsInvalidated()
const {
return m_FreeObjectsInvalidated; }
279 void markObjectFree(
const PdfReference& reference,
bool doConsistencyCheck);
281 void pushObject(
const ObjectList::const_iterator& hintpos, ObjectList::node_type& node, PdfObject* obj);
283 std::unique_ptr<PdfObject> removeObject(
const iterator& it,
bool markAsFree);
285 void addNewObject(std::unique_ptr<PdfObject>&& obj);
288 PdfReference getNextFreeObject();
290 void visitObject(PdfObject& obj, std::unordered_set<PdfReference>& referencedObj,
bool fixInvalidReference);
296 void tryIncrementLastObjectNumber(uint32_t objNum);
299 PdfDocument* m_Document;
300 ObjectList m_Objects;
301 unsigned m_LastObjectNumber;
302 bool m_FreeObjectsInvalidated;
303 PdfFreeObjectList m_FreeObjects;
304 PdfObjectNumSet m_UnavailableObjects;
305 PdfObjectNumSet m_compressedObjectStreams;
307 ObserverList m_observers;
308 StreamFactory* m_StreamFactory;