Structure tree parsing

This commit is contained in:
Jakub Melka
2020-07-18 19:46:42 +02:00
parent a21f185e89
commit 0a62ad618d
7 changed files with 399 additions and 17 deletions

View File

@ -43,6 +43,54 @@ private:
PDFObjectUtils() = delete;
};
/// Storage, which can mark objects (for example, when we want to mark already visited objects
/// during parsing some complex structure, such as tree)
class PDFMarkedObjectsContext
{
public:
inline explicit PDFMarkedObjectsContext() = default;
inline bool isMarked(PDFObjectReference reference) const { return m_markedReferences.count(reference); }
inline void mark(PDFObjectReference reference) { m_markedReferences.insert(reference); }
inline void unmark(PDFObjectReference reference) { m_markedReferences.erase(reference); }
private:
std::set<PDFObjectReference> m_markedReferences;
};
/// Class for marking/unmarking objects functioning as guard. If not already marked, then
/// during existence of this guard, object is marked and then it is unmarked. If it is
/// already marked, then nothing happens and locked flag is set to false.
class PDFMarkedObjectsLock
{
public:
explicit inline PDFMarkedObjectsLock(PDFMarkedObjectsContext* context, PDFObjectReference reference) :
m_context(context),
m_reference(reference),
m_locked(!context->isMarked(reference))
{
if (m_locked)
{
context->mark(reference);
}
}
inline ~PDFMarkedObjectsLock()
{
if (m_locked)
{
m_context->unmark(m_reference);
}
}
explicit operator bool() const { return m_locked; }
private:
PDFMarkedObjectsContext* m_context;
PDFObjectReference m_reference;
bool m_locked;
};
} // namespace pdf
#endif // PDFOBJECTUTILS_H