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