Commit c9f5253ce2c26c7a0a9e47038b0fd67c53cfd623
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.
Showing
4 changed files
with
414 additions
and
420 deletions
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 | -} |