Commit c9f5253ce2c26c7a0a9e47038b0fd67c53cfd623

Authored by m-holger
1 parent 05c9a460

Remove `QPDFNameTreeObjectHelper.cc` and `QPDFNumberTreeObjectHelper.cc`, consol…

…idate into `NNTree` implementation

- Merged `QPDFNameTreeObjectHelper` and `QPDFNumberTreeObjectHelper` into `NNTree` source for simplification.
- Adjusted `CMakeLists.txt` and headers to reflect changes.
libqpdf/CMakeLists.txt
@@ -71,8 +71,6 @@ set(libqpdf_SOURCES @@ -71,8 +71,6 @@ set(libqpdf_SOURCES
71 QPDFJob_json.cc 71 QPDFJob_json.cc
72 QPDFLogger.cc 72 QPDFLogger.cc
73 QPDFMatrix.cc 73 QPDFMatrix.cc
74 - QPDFNameTreeObjectHelper.cc  
75 - QPDFNumberTreeObjectHelper.cc  
76 QPDFObject.cc 74 QPDFObject.cc
77 QPDFObjectHandle.cc 75 QPDFObjectHandle.cc
78 QPDFObjectHelper.cc 76 QPDFObjectHelper.cc
libqpdf/NNTree.cc
@@ -2,6 +2,9 @@ @@ -2,6 +2,9 @@
2 2
3 #include <qpdf/NNTree.hh> 3 #include <qpdf/NNTree.hh>
4 4
  5 +#include <qpdf/QPDFNameTreeObjectHelper.hh>
  6 +#include <qpdf/QPDFNumberTreeObjectHelper.hh>
  7 +
5 #include <qpdf/QPDFObjectHandle_private.hh> 8 #include <qpdf/QPDFObjectHandle_private.hh>
6 #include <qpdf/QPDF_private.hh> 9 #include <qpdf/QPDF_private.hh>
7 #include <qpdf/QTC.hh> 10 #include <qpdf/QTC.hh>
@@ -847,3 +850,414 @@ NNTreeImpl::validate(bool a_repair) @@ -847,3 +850,414 @@ NNTreeImpl::validate(bool a_repair)
847 } 850 }
848 return true; 851 return true;
849 } 852 }
  853 +
  854 +QPDFNameTreeObjectHelper::~QPDFNameTreeObjectHelper() // NOLINT (modernize-use-equals-default)
  855 +{
  856 + // Must be explicit and not inline -- see QPDF_DLL_CLASS in README-maintainer. For this specific
  857 + // class, see github issue #745.
  858 +}
  859 +
  860 +QPDFNameTreeObjectHelper::Members::Members(
  861 + QPDFObjectHandle& oh,
  862 + QPDF& q,
  863 + std::function<bool(QPDFObjectHandle const&)> value_validator,
  864 + bool auto_repair) :
  865 + impl(std::make_shared<NNTreeImpl>(q, oh, ::ot_string, value_validator, auto_repair))
  866 +{
  867 +}
  868 +
  869 +QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper(QPDFObjectHandle oh, QPDF& q, bool auto_repair) :
  870 + QPDFObjectHelper(oh),
  871 + m(new Members(
  872 + oh, q, [](QPDFObjectHandle const& o) -> bool { return static_cast<bool>(o); }, auto_repair))
  873 +{
  874 +}
  875 +
  876 +QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper(
  877 + QPDFObjectHandle oh,
  878 + QPDF& q,
  879 + std::function<bool(QPDFObjectHandle const&)> value_validator,
  880 + bool auto_repair) :
  881 + QPDFObjectHelper(oh),
  882 + m(new Members(oh, q, value_validator, auto_repair))
  883 +{
  884 +}
  885 +
  886 +QPDFNameTreeObjectHelper
  887 +QPDFNameTreeObjectHelper::newEmpty(QPDF& qpdf, bool auto_repair)
  888 +{
  889 + return {qpdf.makeIndirectObject("<< /Names [] >>"_qpdf), qpdf, auto_repair};
  890 +}
  891 +
  892 +QPDFNameTreeObjectHelper::iterator::iterator(std::shared_ptr<NNTreeIterator> const& i) :
  893 + impl(i)
  894 +{
  895 +}
  896 +
  897 +bool
  898 +QPDFNameTreeObjectHelper::iterator::valid() const
  899 +{
  900 + return impl->valid();
  901 +}
  902 +
  903 +QPDFNameTreeObjectHelper::iterator&
  904 +QPDFNameTreeObjectHelper::iterator::operator++()
  905 +{
  906 + ++(*impl);
  907 + updateIValue();
  908 + return *this;
  909 +}
  910 +
  911 +QPDFNameTreeObjectHelper::iterator&
  912 +QPDFNameTreeObjectHelper::iterator::operator--()
  913 +{
  914 + --(*impl);
  915 + updateIValue();
  916 + return *this;
  917 +}
  918 +
  919 +void
  920 +QPDFNameTreeObjectHelper::iterator::updateIValue()
  921 +{
  922 + if (impl->valid()) {
  923 + auto p = *impl;
  924 + ivalue.first = p->first.getUTF8Value();
  925 + ivalue.second = p->second;
  926 + } else {
  927 + ivalue.first = "";
  928 + ivalue.second = QPDFObjectHandle();
  929 + }
  930 +}
  931 +
  932 +QPDFNameTreeObjectHelper::iterator::reference
  933 +QPDFNameTreeObjectHelper::iterator::operator*()
  934 +{
  935 + updateIValue();
  936 + return ivalue;
  937 +}
  938 +
  939 +QPDFNameTreeObjectHelper::iterator::pointer
  940 +QPDFNameTreeObjectHelper::iterator::operator->()
  941 +{
  942 + updateIValue();
  943 + return &ivalue;
  944 +}
  945 +
  946 +bool
  947 +QPDFNameTreeObjectHelper::iterator::operator==(iterator const& other) const
  948 +{
  949 + return *(impl) == *(other.impl);
  950 +}
  951 +
  952 +void
  953 +QPDFNameTreeObjectHelper::iterator::insertAfter(std::string const& key, QPDFObjectHandle value)
  954 +{
  955 + impl->insertAfter(QPDFObjectHandle::newUnicodeString(key), value);
  956 + updateIValue();
  957 +}
  958 +
  959 +void
  960 +QPDFNameTreeObjectHelper::iterator::remove()
  961 +{
  962 + impl->remove();
  963 + updateIValue();
  964 +}
  965 +
  966 +QPDFNameTreeObjectHelper::iterator
  967 +QPDFNameTreeObjectHelper::begin() const
  968 +{
  969 + return {std::make_shared<NNTreeIterator>(m->impl->begin())};
  970 +}
  971 +
  972 +QPDFNameTreeObjectHelper::iterator
  973 +QPDFNameTreeObjectHelper::end() const
  974 +{
  975 + return {std::make_shared<NNTreeIterator>(m->impl->end())};
  976 +}
  977 +
  978 +QPDFNameTreeObjectHelper::iterator
  979 +QPDFNameTreeObjectHelper::last() const
  980 +{
  981 + return {std::make_shared<NNTreeIterator>(m->impl->last())};
  982 +}
  983 +
  984 +QPDFNameTreeObjectHelper::iterator
  985 +QPDFNameTreeObjectHelper::find(std::string const& key, bool return_prev_if_not_found)
  986 +{
  987 + auto i = m->impl->find(QPDFObjectHandle::newUnicodeString(key), return_prev_if_not_found);
  988 + return {std::make_shared<NNTreeIterator>(i)};
  989 +}
  990 +
  991 +QPDFNameTreeObjectHelper::iterator
  992 +QPDFNameTreeObjectHelper::insert(std::string const& key, QPDFObjectHandle value)
  993 +{
  994 + auto i = m->impl->insert(QPDFObjectHandle::newUnicodeString(key), value);
  995 + return {std::make_shared<NNTreeIterator>(i)};
  996 +}
  997 +
  998 +bool
  999 +QPDFNameTreeObjectHelper::remove(std::string const& key, QPDFObjectHandle* value)
  1000 +{
  1001 + return m->impl->remove(QPDFObjectHandle::newUnicodeString(key), value);
  1002 +}
  1003 +
  1004 +bool
  1005 +QPDFNameTreeObjectHelper::hasName(std::string const& name)
  1006 +{
  1007 + auto i = find(name);
  1008 + return (i != end());
  1009 +}
  1010 +
  1011 +bool
  1012 +QPDFNameTreeObjectHelper::findObject(std::string const& name, QPDFObjectHandle& oh)
  1013 +{
  1014 + auto i = find(name);
  1015 + if (i == end()) {
  1016 + return false;
  1017 + }
  1018 + oh = i->second;
  1019 + return true;
  1020 +}
  1021 +
  1022 +void
  1023 +QPDFNameTreeObjectHelper::setSplitThreshold(int t)
  1024 +{
  1025 + m->impl->setSplitThreshold(t);
  1026 +}
  1027 +
  1028 +std::map<std::string, QPDFObjectHandle>
  1029 +QPDFNameTreeObjectHelper::getAsMap() const
  1030 +{
  1031 + std::map<std::string, QPDFObjectHandle> result;
  1032 + result.insert(begin(), end());
  1033 + return result;
  1034 +}
  1035 +
  1036 +bool
  1037 +QPDFNameTreeObjectHelper::validate(bool repair)
  1038 +{
  1039 + return m->impl->validate(repair);
  1040 +}
  1041 +
  1042 +QPDFNumberTreeObjectHelper::~QPDFNumberTreeObjectHelper() // NOLINT (modernize-use-equals-default)
  1043 +{
  1044 + // Must be explicit and not inline -- see QPDF_DLL_CLASS in README-maintainer. For this specific
  1045 + // class, see github issue #745.
  1046 +}
  1047 +
  1048 +QPDFNumberTreeObjectHelper::Members::Members(
  1049 + QPDFObjectHandle& oh,
  1050 + QPDF& q,
  1051 + std::function<bool(QPDFObjectHandle const&)> value_validator,
  1052 + bool auto_repair) :
  1053 + impl(std::make_shared<NNTreeImpl>(q, oh, ::ot_integer, value_validator, auto_repair))
  1054 +{
  1055 +}
  1056 +
  1057 +QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper(
  1058 + QPDFObjectHandle oh, QPDF& q, bool auto_repair) :
  1059 + QPDFObjectHelper(oh),
  1060 + m(new Members(
  1061 + oh, q, [](QPDFObjectHandle const& o) -> bool { return static_cast<bool>(o); }, auto_repair))
  1062 +{
  1063 +}
  1064 +
  1065 +QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper(
  1066 + QPDFObjectHandle oh,
  1067 + QPDF& q,
  1068 + std::function<bool(QPDFObjectHandle const&)> value_validator,
  1069 + bool auto_repair) :
  1070 + QPDFObjectHelper(oh),
  1071 + m(new Members(oh, q, value_validator, auto_repair))
  1072 +{
  1073 +}
  1074 +
  1075 +QPDFNumberTreeObjectHelper
  1076 +QPDFNumberTreeObjectHelper::newEmpty(QPDF& qpdf, bool auto_repair)
  1077 +{
  1078 + return {qpdf.makeIndirectObject("<< /Nums [] >>"_qpdf), qpdf, auto_repair};
  1079 +}
  1080 +
  1081 +QPDFNumberTreeObjectHelper::iterator::iterator(std::shared_ptr<NNTreeIterator> const& i) :
  1082 + impl(i)
  1083 +{
  1084 +}
  1085 +
  1086 +bool
  1087 +QPDFNumberTreeObjectHelper::iterator::valid() const
  1088 +{
  1089 + return impl->valid();
  1090 +}
  1091 +
  1092 +QPDFNumberTreeObjectHelper::iterator&
  1093 +QPDFNumberTreeObjectHelper::iterator::operator++()
  1094 +{
  1095 + ++(*impl);
  1096 + updateIValue();
  1097 + return *this;
  1098 +}
  1099 +
  1100 +QPDFNumberTreeObjectHelper::iterator&
  1101 +QPDFNumberTreeObjectHelper::iterator::operator--()
  1102 +{
  1103 + --(*impl);
  1104 + updateIValue();
  1105 + return *this;
  1106 +}
  1107 +
  1108 +void
  1109 +QPDFNumberTreeObjectHelper::iterator::updateIValue()
  1110 +{
  1111 + if (impl->valid()) {
  1112 + auto p = *impl;
  1113 + this->ivalue.first = p->first.getIntValue();
  1114 + this->ivalue.second = p->second;
  1115 + } else {
  1116 + this->ivalue.first = 0;
  1117 + this->ivalue.second = QPDFObjectHandle();
  1118 + }
  1119 +}
  1120 +
  1121 +QPDFNumberTreeObjectHelper::iterator::reference
  1122 +QPDFNumberTreeObjectHelper::iterator::operator*()
  1123 +{
  1124 + updateIValue();
  1125 + return this->ivalue;
  1126 +}
  1127 +
  1128 +QPDFNumberTreeObjectHelper::iterator::pointer
  1129 +QPDFNumberTreeObjectHelper::iterator::operator->()
  1130 +{
  1131 + updateIValue();
  1132 + return &this->ivalue;
  1133 +}
  1134 +
  1135 +bool
  1136 +QPDFNumberTreeObjectHelper::iterator::operator==(iterator const& other) const
  1137 +{
  1138 + return *(impl) == *(other.impl);
  1139 +}
  1140 +
  1141 +void
  1142 +QPDFNumberTreeObjectHelper::iterator::insertAfter(numtree_number key, QPDFObjectHandle value)
  1143 +{
  1144 + impl->insertAfter(QPDFObjectHandle::newInteger(key), value);
  1145 + updateIValue();
  1146 +}
  1147 +
  1148 +void
  1149 +QPDFNumberTreeObjectHelper::iterator::remove()
  1150 +{
  1151 + impl->remove();
  1152 + updateIValue();
  1153 +}
  1154 +
  1155 +QPDFNumberTreeObjectHelper::iterator
  1156 +QPDFNumberTreeObjectHelper::begin() const
  1157 +{
  1158 + return {std::make_shared<NNTreeIterator>(m->impl->begin())};
  1159 +}
  1160 +
  1161 +QPDFNumberTreeObjectHelper::iterator
  1162 +QPDFNumberTreeObjectHelper::end() const
  1163 +{
  1164 + return {std::make_shared<NNTreeIterator>(m->impl->end())};
  1165 +}
  1166 +
  1167 +QPDFNumberTreeObjectHelper::iterator
  1168 +QPDFNumberTreeObjectHelper::last() const
  1169 +{
  1170 + return {std::make_shared<NNTreeIterator>(m->impl->last())};
  1171 +}
  1172 +
  1173 +QPDFNumberTreeObjectHelper::iterator
  1174 +QPDFNumberTreeObjectHelper::find(numtree_number key, bool return_prev_if_not_found)
  1175 +{
  1176 + auto i = m->impl->find(QPDFObjectHandle::newInteger(key), return_prev_if_not_found);
  1177 + return {std::make_shared<NNTreeIterator>(i)};
  1178 +}
  1179 +
  1180 +QPDFNumberTreeObjectHelper::iterator
  1181 +QPDFNumberTreeObjectHelper::insert(numtree_number key, QPDFObjectHandle value)
  1182 +{
  1183 + auto i = m->impl->insert(QPDFObjectHandle::newInteger(key), value);
  1184 + return {std::make_shared<NNTreeIterator>(i)};
  1185 +}
  1186 +
  1187 +bool
  1188 +QPDFNumberTreeObjectHelper::remove(numtree_number key, QPDFObjectHandle* value)
  1189 +{
  1190 + return m->impl->remove(QPDFObjectHandle::newInteger(key), value);
  1191 +}
  1192 +
  1193 +QPDFNumberTreeObjectHelper::numtree_number
  1194 +QPDFNumberTreeObjectHelper::getMin()
  1195 +{
  1196 + auto i = begin();
  1197 + if (i == end()) {
  1198 + return 0;
  1199 + }
  1200 + return i->first;
  1201 +}
  1202 +
  1203 +QPDFNumberTreeObjectHelper::numtree_number
  1204 +QPDFNumberTreeObjectHelper::getMax()
  1205 +{
  1206 + auto i = last();
  1207 + if (i == end()) {
  1208 + return 0;
  1209 + }
  1210 + return i->first;
  1211 +}
  1212 +
  1213 +bool
  1214 +QPDFNumberTreeObjectHelper::hasIndex(numtree_number idx)
  1215 +{
  1216 + auto i = find(idx);
  1217 + return (i != this->end());
  1218 +}
  1219 +
  1220 +bool
  1221 +QPDFNumberTreeObjectHelper::findObject(numtree_number idx, QPDFObjectHandle& oh)
  1222 +{
  1223 + auto i = find(idx);
  1224 + if (i == end()) {
  1225 + return false;
  1226 + }
  1227 + oh = i->second;
  1228 + return true;
  1229 +}
  1230 +
  1231 +bool
  1232 +QPDFNumberTreeObjectHelper::findObjectAtOrBelow(
  1233 + numtree_number idx, QPDFObjectHandle& oh, numtree_number& offset)
  1234 +{
  1235 + auto i = find(idx, true);
  1236 + if (i == end()) {
  1237 + return false;
  1238 + }
  1239 + oh = i->second;
  1240 + QIntC::range_check_subtract(idx, i->first);
  1241 + offset = idx - i->first;
  1242 + return true;
  1243 +}
  1244 +
  1245 +void
  1246 +QPDFNumberTreeObjectHelper::setSplitThreshold(int t)
  1247 +{
  1248 + m->impl->setSplitThreshold(t);
  1249 +}
  1250 +
  1251 +std::map<QPDFNumberTreeObjectHelper::numtree_number, QPDFObjectHandle>
  1252 +QPDFNumberTreeObjectHelper::getAsMap() const
  1253 +{
  1254 + std::map<numtree_number, QPDFObjectHandle> result;
  1255 + result.insert(begin(), end());
  1256 + return result;
  1257 +}
  1258 +
  1259 +bool
  1260 +QPDFNumberTreeObjectHelper::validate(bool repair)
  1261 +{
  1262 + return m->impl->validate(repair);
  1263 +}
libqpdf/QPDFNameTreeObjectHelper.cc
1 -#include <qpdf/QPDFNameTreeObjectHelper.hh>  
2 -  
3 -#include <qpdf/NNTree.hh>  
4 -  
5 -QPDFNameTreeObjectHelper::~QPDFNameTreeObjectHelper() // NOLINT (modernize-use-equals-default)  
6 -{  
7 - // Must be explicit and not inline -- see QPDF_DLL_CLASS in README-maintainer. For this specific  
8 - // class, see github issue #745.  
9 -}  
10 -  
11 -QPDFNameTreeObjectHelper::Members::Members(  
12 - QPDFObjectHandle& oh,  
13 - QPDF& q,  
14 - std::function<bool(QPDFObjectHandle const&)> value_validator,  
15 - bool auto_repair) :  
16 - impl(std::make_shared<NNTreeImpl>(q, oh, ::ot_string, value_validator, auto_repair))  
17 -{  
18 -}  
19 -  
20 -QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper(QPDFObjectHandle oh, QPDF& q, bool auto_repair) :  
21 - QPDFObjectHelper(oh),  
22 - m(new Members(  
23 - oh, q, [](QPDFObjectHandle const& o) -> bool { return static_cast<bool>(o); }, auto_repair))  
24 -{  
25 -}  
26 -  
27 -QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper(  
28 - QPDFObjectHandle oh,  
29 - QPDF& q,  
30 - std::function<bool(QPDFObjectHandle const&)> value_validator,  
31 - bool auto_repair) :  
32 - QPDFObjectHelper(oh),  
33 - m(new Members(oh, q, value_validator, auto_repair))  
34 -{  
35 -}  
36 -  
37 -QPDFNameTreeObjectHelper  
38 -QPDFNameTreeObjectHelper::newEmpty(QPDF& qpdf, bool auto_repair)  
39 -{  
40 - return {qpdf.makeIndirectObject("<< /Names [] >>"_qpdf), qpdf, auto_repair};  
41 -}  
42 -  
43 -QPDFNameTreeObjectHelper::iterator::iterator(std::shared_ptr<NNTreeIterator> const& i) :  
44 - impl(i)  
45 -{  
46 -}  
47 -  
48 -bool  
49 -QPDFNameTreeObjectHelper::iterator::valid() const  
50 -{  
51 - return impl->valid();  
52 -}  
53 -  
54 -QPDFNameTreeObjectHelper::iterator&  
55 -QPDFNameTreeObjectHelper::iterator::operator++()  
56 -{  
57 - ++(*impl);  
58 - updateIValue();  
59 - return *this;  
60 -}  
61 -  
62 -QPDFNameTreeObjectHelper::iterator&  
63 -QPDFNameTreeObjectHelper::iterator::operator--()  
64 -{  
65 - --(*impl);  
66 - updateIValue();  
67 - return *this;  
68 -}  
69 -  
70 -void  
71 -QPDFNameTreeObjectHelper::iterator::updateIValue()  
72 -{  
73 - if (impl->valid()) {  
74 - auto p = *impl;  
75 - ivalue.first = p->first.getUTF8Value();  
76 - ivalue.second = p->second;  
77 - } else {  
78 - ivalue.first = "";  
79 - ivalue.second = QPDFObjectHandle();  
80 - }  
81 -}  
82 -  
83 -QPDFNameTreeObjectHelper::iterator::reference  
84 -QPDFNameTreeObjectHelper::iterator::operator*()  
85 -{  
86 - updateIValue();  
87 - return ivalue;  
88 -}  
89 -  
90 -QPDFNameTreeObjectHelper::iterator::pointer  
91 -QPDFNameTreeObjectHelper::iterator::operator->()  
92 -{  
93 - updateIValue();  
94 - return &ivalue;  
95 -}  
96 -  
97 -bool  
98 -QPDFNameTreeObjectHelper::iterator::operator==(iterator const& other) const  
99 -{  
100 - return *(impl) == *(other.impl);  
101 -}  
102 -  
103 -void  
104 -QPDFNameTreeObjectHelper::iterator::insertAfter(std::string const& key, QPDFObjectHandle value)  
105 -{  
106 - impl->insertAfter(QPDFObjectHandle::newUnicodeString(key), value);  
107 - updateIValue();  
108 -}  
109 -  
110 -void  
111 -QPDFNameTreeObjectHelper::iterator::remove()  
112 -{  
113 - impl->remove();  
114 - updateIValue();  
115 -}  
116 -  
117 -QPDFNameTreeObjectHelper::iterator  
118 -QPDFNameTreeObjectHelper::begin() const  
119 -{  
120 - return {std::make_shared<NNTreeIterator>(m->impl->begin())};  
121 -}  
122 -  
123 -QPDFNameTreeObjectHelper::iterator  
124 -QPDFNameTreeObjectHelper::end() const  
125 -{  
126 - return {std::make_shared<NNTreeIterator>(m->impl->end())};  
127 -}  
128 -  
129 -QPDFNameTreeObjectHelper::iterator  
130 -QPDFNameTreeObjectHelper::last() const  
131 -{  
132 - return {std::make_shared<NNTreeIterator>(m->impl->last())};  
133 -}  
134 -  
135 -QPDFNameTreeObjectHelper::iterator  
136 -QPDFNameTreeObjectHelper::find(std::string const& key, bool return_prev_if_not_found)  
137 -{  
138 - auto i = m->impl->find(QPDFObjectHandle::newUnicodeString(key), return_prev_if_not_found);  
139 - return {std::make_shared<NNTreeIterator>(i)};  
140 -}  
141 -  
142 -QPDFNameTreeObjectHelper::iterator  
143 -QPDFNameTreeObjectHelper::insert(std::string const& key, QPDFObjectHandle value)  
144 -{  
145 - auto i = m->impl->insert(QPDFObjectHandle::newUnicodeString(key), value);  
146 - return {std::make_shared<NNTreeIterator>(i)};  
147 -}  
148 -  
149 -bool  
150 -QPDFNameTreeObjectHelper::remove(std::string const& key, QPDFObjectHandle* value)  
151 -{  
152 - return m->impl->remove(QPDFObjectHandle::newUnicodeString(key), value);  
153 -}  
154 -  
155 -bool  
156 -QPDFNameTreeObjectHelper::hasName(std::string const& name)  
157 -{  
158 - auto i = find(name);  
159 - return (i != end());  
160 -}  
161 -  
162 -bool  
163 -QPDFNameTreeObjectHelper::findObject(std::string const& name, QPDFObjectHandle& oh)  
164 -{  
165 - auto i = find(name);  
166 - if (i == end()) {  
167 - return false;  
168 - }  
169 - oh = i->second;  
170 - return true;  
171 -}  
172 -  
173 -void  
174 -QPDFNameTreeObjectHelper::setSplitThreshold(int t)  
175 -{  
176 - m->impl->setSplitThreshold(t);  
177 -}  
178 -  
179 -std::map<std::string, QPDFObjectHandle>  
180 -QPDFNameTreeObjectHelper::getAsMap() const  
181 -{  
182 - std::map<std::string, QPDFObjectHandle> result;  
183 - result.insert(begin(), end());  
184 - return result;  
185 -}  
186 -  
187 -bool  
188 -QPDFNameTreeObjectHelper::validate(bool repair)  
189 -{  
190 - return m->impl->validate(repair);  
191 -}  
libqpdf/QPDFNumberTreeObjectHelper.cc
1 -#include <qpdf/QPDFNumberTreeObjectHelper.hh>  
2 -  
3 -#include <qpdf/NNTree.hh>  
4 -#include <qpdf/QIntC.hh>  
5 -  
6 -QPDFNumberTreeObjectHelper::~QPDFNumberTreeObjectHelper() // NOLINT (modernize-use-equals-default)  
7 -{  
8 - // Must be explicit and not inline -- see QPDF_DLL_CLASS in README-maintainer. For this specific  
9 - // class, see github issue #745.  
10 -}  
11 -  
12 -QPDFNumberTreeObjectHelper::Members::Members(  
13 - QPDFObjectHandle& oh,  
14 - QPDF& q,  
15 - std::function<bool(QPDFObjectHandle const&)> value_validator,  
16 - bool auto_repair) :  
17 - impl(std::make_shared<NNTreeImpl>(q, oh, ::ot_integer, value_validator, auto_repair))  
18 -{  
19 -}  
20 -  
21 -QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper(  
22 - QPDFObjectHandle oh, QPDF& q, bool auto_repair) :  
23 - QPDFObjectHelper(oh),  
24 - m(new Members(  
25 - oh, q, [](QPDFObjectHandle const& o) -> bool { return static_cast<bool>(o); }, auto_repair))  
26 -{  
27 -}  
28 -  
29 -QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper(  
30 - QPDFObjectHandle oh,  
31 - QPDF& q,  
32 - std::function<bool(QPDFObjectHandle const&)> value_validator,  
33 - bool auto_repair) :  
34 - QPDFObjectHelper(oh),  
35 - m(new Members(oh, q, value_validator, auto_repair))  
36 -{  
37 -}  
38 -  
39 -QPDFNumberTreeObjectHelper  
40 -QPDFNumberTreeObjectHelper::newEmpty(QPDF& qpdf, bool auto_repair)  
41 -{  
42 - return {qpdf.makeIndirectObject("<< /Nums [] >>"_qpdf), qpdf, auto_repair};  
43 -}  
44 -  
45 -QPDFNumberTreeObjectHelper::iterator::iterator(std::shared_ptr<NNTreeIterator> const& i) :  
46 - impl(i)  
47 -{  
48 -}  
49 -  
50 -bool  
51 -QPDFNumberTreeObjectHelper::iterator::valid() const  
52 -{  
53 - return impl->valid();  
54 -}  
55 -  
56 -QPDFNumberTreeObjectHelper::iterator&  
57 -QPDFNumberTreeObjectHelper::iterator::operator++()  
58 -{  
59 - ++(*impl);  
60 - updateIValue();  
61 - return *this;  
62 -}  
63 -  
64 -QPDFNumberTreeObjectHelper::iterator&  
65 -QPDFNumberTreeObjectHelper::iterator::operator--()  
66 -{  
67 - --(*impl);  
68 - updateIValue();  
69 - return *this;  
70 -}  
71 -  
72 -void  
73 -QPDFNumberTreeObjectHelper::iterator::updateIValue()  
74 -{  
75 - if (impl->valid()) {  
76 - auto p = *impl;  
77 - this->ivalue.first = p->first.getIntValue();  
78 - this->ivalue.second = p->second;  
79 - } else {  
80 - this->ivalue.first = 0;  
81 - this->ivalue.second = QPDFObjectHandle();  
82 - }  
83 -}  
84 -  
85 -QPDFNumberTreeObjectHelper::iterator::reference  
86 -QPDFNumberTreeObjectHelper::iterator::operator*()  
87 -{  
88 - updateIValue();  
89 - return this->ivalue;  
90 -}  
91 -  
92 -QPDFNumberTreeObjectHelper::iterator::pointer  
93 -QPDFNumberTreeObjectHelper::iterator::operator->()  
94 -{  
95 - updateIValue();  
96 - return &this->ivalue;  
97 -}  
98 -  
99 -bool  
100 -QPDFNumberTreeObjectHelper::iterator::operator==(iterator const& other) const  
101 -{  
102 - return *(impl) == *(other.impl);  
103 -}  
104 -  
105 -void  
106 -QPDFNumberTreeObjectHelper::iterator::insertAfter(numtree_number key, QPDFObjectHandle value)  
107 -{  
108 - impl->insertAfter(QPDFObjectHandle::newInteger(key), value);  
109 - updateIValue();  
110 -}  
111 -  
112 -void  
113 -QPDFNumberTreeObjectHelper::iterator::remove()  
114 -{  
115 - impl->remove();  
116 - updateIValue();  
117 -}  
118 -  
119 -QPDFNumberTreeObjectHelper::iterator  
120 -QPDFNumberTreeObjectHelper::begin() const  
121 -{  
122 - return {std::make_shared<NNTreeIterator>(m->impl->begin())};  
123 -}  
124 -  
125 -QPDFNumberTreeObjectHelper::iterator  
126 -QPDFNumberTreeObjectHelper::end() const  
127 -{  
128 - return {std::make_shared<NNTreeIterator>(m->impl->end())};  
129 -}  
130 -  
131 -QPDFNumberTreeObjectHelper::iterator  
132 -QPDFNumberTreeObjectHelper::last() const  
133 -{  
134 - return {std::make_shared<NNTreeIterator>(m->impl->last())};  
135 -}  
136 -  
137 -QPDFNumberTreeObjectHelper::iterator  
138 -QPDFNumberTreeObjectHelper::find(numtree_number key, bool return_prev_if_not_found)  
139 -{  
140 - auto i = m->impl->find(QPDFObjectHandle::newInteger(key), return_prev_if_not_found);  
141 - return {std::make_shared<NNTreeIterator>(i)};  
142 -}  
143 -  
144 -QPDFNumberTreeObjectHelper::iterator  
145 -QPDFNumberTreeObjectHelper::insert(numtree_number key, QPDFObjectHandle value)  
146 -{  
147 - auto i = m->impl->insert(QPDFObjectHandle::newInteger(key), value);  
148 - return {std::make_shared<NNTreeIterator>(i)};  
149 -}  
150 -  
151 -bool  
152 -QPDFNumberTreeObjectHelper::remove(numtree_number key, QPDFObjectHandle* value)  
153 -{  
154 - return m->impl->remove(QPDFObjectHandle::newInteger(key), value);  
155 -}  
156 -  
157 -QPDFNumberTreeObjectHelper::numtree_number  
158 -QPDFNumberTreeObjectHelper::getMin()  
159 -{  
160 - auto i = begin();  
161 - if (i == end()) {  
162 - return 0;  
163 - }  
164 - return i->first;  
165 -}  
166 -  
167 -QPDFNumberTreeObjectHelper::numtree_number  
168 -QPDFNumberTreeObjectHelper::getMax()  
169 -{  
170 - auto i = last();  
171 - if (i == end()) {  
172 - return 0;  
173 - }  
174 - return i->first;  
175 -}  
176 -  
177 -bool  
178 -QPDFNumberTreeObjectHelper::hasIndex(numtree_number idx)  
179 -{  
180 - auto i = find(idx);  
181 - return (i != this->end());  
182 -}  
183 -  
184 -bool  
185 -QPDFNumberTreeObjectHelper::findObject(numtree_number idx, QPDFObjectHandle& oh)  
186 -{  
187 - auto i = find(idx);  
188 - if (i == end()) {  
189 - return false;  
190 - }  
191 - oh = i->second;  
192 - return true;  
193 -}  
194 -  
195 -bool  
196 -QPDFNumberTreeObjectHelper::findObjectAtOrBelow(  
197 - numtree_number idx, QPDFObjectHandle& oh, numtree_number& offset)  
198 -{  
199 - auto i = find(idx, true);  
200 - if (i == end()) {  
201 - return false;  
202 - }  
203 - oh = i->second;  
204 - QIntC::range_check_subtract(idx, i->first);  
205 - offset = idx - i->first;  
206 - return true;  
207 -}  
208 -  
209 -void  
210 -QPDFNumberTreeObjectHelper::setSplitThreshold(int t)  
211 -{  
212 - m->impl->setSplitThreshold(t);  
213 -}  
214 -  
215 -std::map<QPDFNumberTreeObjectHelper::numtree_number, QPDFObjectHandle>  
216 -QPDFNumberTreeObjectHelper::getAsMap() const  
217 -{  
218 - std::map<numtree_number, QPDFObjectHandle> result;  
219 - result.insert(begin(), end());  
220 - return result;  
221 -}  
222 -  
223 -bool  
224 -QPDFNumberTreeObjectHelper::validate(bool repair)  
225 -{  
226 - return m->impl->validate(repair);  
227 -}