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 71 QPDFJob_json.cc
72 72 QPDFLogger.cc
73 73 QPDFMatrix.cc
74   - QPDFNameTreeObjectHelper.cc
75   - QPDFNumberTreeObjectHelper.cc
76 74 QPDFObject.cc
77 75 QPDFObjectHandle.cc
78 76 QPDFObjectHelper.cc
... ...
libqpdf/NNTree.cc
... ... @@ -2,6 +2,9 @@
2 2  
3 3 #include <qpdf/NNTree.hh>
4 4  
  5 +#include <qpdf/QPDFNameTreeObjectHelper.hh>
  6 +#include <qpdf/QPDFNumberTreeObjectHelper.hh>
  7 +
5 8 #include <qpdf/QPDFObjectHandle_private.hh>
6 9 #include <qpdf/QPDF_private.hh>
7 10 #include <qpdf/QTC.hh>
... ... @@ -847,3 +850,414 @@ NNTreeImpl::validate(bool a_repair)
847 850 }
848 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   -}