PoDoFo 1.0.0-dev
Loading...
Searching...
No Matches
PdfNameTree.h
1
7#ifndef PDF_NAME_TREE_H
8#define PDF_NAME_TREE_H
9
10#include "PdfElement.h"
11
12namespace PoDoFo {
13
14class PdfDocument;
15class PdfFileSpec;
16class PdfDestination;
17
18class PODOFO_API PdfNameTreeBase : public PdfDictionaryElement
19{
20 template <typename TElement>
21 friend class PdfNameTree;
22
23private:
24 PdfNameTreeBase(PdfDocument& doc);
25 PdfNameTreeBase(PdfObject& obj);
26
27public:
28 bool HasKey(const std::string_view& key) const;
29
30protected:
31 void AddValue(const PdfString& key, std::shared_ptr<PdfElement>&& value);
32
33 PdfElement* GetValue(const std::string_view& key) const;
34
35 void ToDictionary(PdfStringMap<std::shared_ptr<PdfElement>>& dict, bool skipClear);
36
37 virtual PdfKnownNameTree GetType() const = 0;
38
39private:
40 std::unique_ptr<PdfElement> createElement(PdfObject& obj) const;
41
42private:
43 PdfStringHashMap<std::shared_ptr<PdfElement>> m_cache;
44};
45
46template <typename TElement>
47class PdfNameTree final : public PdfNameTreeBase
48{
49 friend class PdfNameTrees;
50
51private:
52 PdfNameTree(PdfDocument& doc)
53 : PdfNameTreeBase(doc) { }
54
55 PdfNameTree(PdfObject& obj)
56 : PdfNameTreeBase(obj) { }
57
58public:
59 using Map = PdfStringMap<std::shared_ptr<TElement>>;
60
61public:
62 void AddValue(const PdfString& key, std::shared_ptr<TElement> value)
63 {
64 PdfNameTreeBase::AddValue(key, std::move(reinterpret_cast<std::shared_ptr<PdfElement>&>(value)));
65 }
66
67 TElement* GetValue(const std::string_view& key)
68 {
69 return static_cast<TElement*>(PdfNameTreeBase::GetValue(key));
70 }
71
72 const TElement* GetValue(const std::string_view& key) const
73 {
74 return static_cast<const TElement*>(PdfNameTreeBase::GetValue(key));
75 }
76
77 void ToDictionary(Map& dict, bool skipClear = false)
78 {
79 PdfNameTreeBase::ToDictionary(reinterpret_cast<PdfStringMap<std::shared_ptr<PdfElement>>&>(dict), skipClear);
80 }
81
82protected:
83 PdfKnownNameTree GetType() const override
84 {
85 return getType();
86 }
87
88private:
89 static constexpr PdfKnownNameTree getType()
90 {
91 if (std::is_same_v<TElement, PdfFileSpec>)
92 return PdfKnownNameTree::EmbeddedFiles;
93 else if (std::is_same_v<TElement, PdfDestination>)
94 return PdfKnownNameTree::Dests;
95 else
96 return PdfKnownNameTree::Unknown;
97 }
98};
99
100// TODO: Add more trees
101using PdfDestinations = PdfNameTree<PdfDestination>;
102using PdfEmbeddedFiles = PdfNameTree<PdfFileSpec>;
103
104};
105
106#endif // PDF_NAME_TREE_H
SPDX-FileCopyrightText: (C) 2022 Francesco Pretto ceztko@gmail.com SPDX-License-Identifier: LGPL-2....
Definition basetypes.h:16