Commit 97198c270176f99939bf6293a7df5c5d1a121e77

Authored by m-holger
1 parent c9f5253c

Refactor `QPDFNameTreeObjectHelper` and `QPDFNumberTreeObjectHelper` constructor…

…s and `Members` structure

- Simplified `Members` implementation by inlining into `NNTree` context.
- Replaced `std::shared_ptr<Members>` with `std::make_shared` for improved clarity and usage consistency.
- Updated method calls to directly access `Members`' `impl`.
- Improved maintainability and alignment with modern C++ practices.
include/qpdf/QPDFNameTreeObjectHelper.hh
@@ -176,23 +176,7 @@ class QPDF_DLL_CLASS QPDFNameTreeObjectHelper: public QPDFObjectHelper @@ -176,23 +176,7 @@ class QPDF_DLL_CLASS QPDFNameTreeObjectHelper: public QPDFObjectHelper
176 void setSplitThreshold(int); 176 void setSplitThreshold(int);
177 177
178 private: 178 private:
179 - class QPDF_DLL_PRIVATE Members  
180 - {  
181 - friend class QPDFNameTreeObjectHelper;  
182 -  
183 - public:  
184 - ~Members() = default;  
185 -  
186 - private:  
187 - Members(  
188 - QPDFObjectHandle& oh,  
189 - QPDF&,  
190 - std::function<bool(QPDFObjectHandle const&)> value_validator,  
191 - bool auto_repair);  
192 - Members(Members const&) = delete;  
193 -  
194 - std::shared_ptr<NNTreeImpl> impl;  
195 - }; 179 + class QPDF_DLL_PRIVATE Members;
196 180
197 std::shared_ptr<Members> m; 181 std::shared_ptr<Members> m;
198 }; 182 };
include/qpdf/QPDFNumberTreeObjectHelper.hh
@@ -192,24 +192,7 @@ class QPDF_DLL_CLASS QPDFNumberTreeObjectHelper: public QPDFObjectHelper @@ -192,24 +192,7 @@ class QPDF_DLL_CLASS QPDFNumberTreeObjectHelper: public QPDFObjectHelper
192 void setSplitThreshold(int); 192 void setSplitThreshold(int);
193 193
194 private: 194 private:
195 - class QPDF_DLL_PRIVATE Members  
196 - {  
197 - friend class QPDFNumberTreeObjectHelper;  
198 - typedef QPDFNumberTreeObjectHelper::numtree_number numtree_number;  
199 -  
200 - public:  
201 - ~Members() = default;  
202 -  
203 - private:  
204 - Members(  
205 - QPDFObjectHandle& oh,  
206 - QPDF&,  
207 - std::function<bool(QPDFObjectHandle const&)> value_validator,  
208 - bool auto_repair);  
209 - Members(Members const&) = delete;  
210 -  
211 - std::shared_ptr<NNTreeImpl> impl;  
212 - }; 195 + class QPDF_DLL_PRIVATE Members;
213 196
214 std::shared_ptr<Members> m; 197 std::shared_ptr<Members> m;
215 }; 198 };
libqpdf/NNTree.cc
@@ -851,25 +851,30 @@ NNTreeImpl::validate(bool a_repair) @@ -851,25 +851,30 @@ NNTreeImpl::validate(bool a_repair)
851 return true; 851 return true;
852 } 852 }
853 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 -} 854 +class QPDFNameTreeObjectHelper::Members
  855 +{
  856 + public:
  857 + Members(
  858 + QPDFObjectHandle& oh,
  859 + QPDF& q,
  860 + std::function<bool(QPDFObjectHandle const&)> value_validator,
  861 + bool auto_repair) :
  862 + impl(q, oh, ::ot_string, value_validator, auto_repair)
  863 + {
  864 + }
  865 + Members(Members const&) = delete;
  866 + ~Members() = default;
859 867
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 + NNTreeImpl impl;
  869 +};
  870 +
  871 +// Must be explicit and not inline -- see QPDF_DLL_CLASS in README-maintainer. For this specific
  872 +// class, see github issue #745.
  873 +QPDFNameTreeObjectHelper::~QPDFNameTreeObjectHelper() = default;
868 874
869 QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper(QPDFObjectHandle oh, QPDF& q, bool auto_repair) : 875 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)) 876 + QPDFNameTreeObjectHelper(
  877 + oh, q, [](QPDFObjectHandle const& o) -> bool { return static_cast<bool>(o); }, auto_repair)
873 { 878 {
874 } 879 }
875 880
@@ -879,7 +884,7 @@ QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper( @@ -879,7 +884,7 @@ QPDFNameTreeObjectHelper::QPDFNameTreeObjectHelper(
879 std::function<bool(QPDFObjectHandle const&)> value_validator, 884 std::function<bool(QPDFObjectHandle const&)> value_validator,
880 bool auto_repair) : 885 bool auto_repair) :
881 QPDFObjectHelper(oh), 886 QPDFObjectHelper(oh),
882 - m(new Members(oh, q, value_validator, auto_repair)) 887 + m(std::make_shared<Members>(oh, q, value_validator, auto_repair))
883 { 888 {
884 } 889 }
885 890
@@ -966,39 +971,39 @@ QPDFNameTreeObjectHelper::iterator::remove() @@ -966,39 +971,39 @@ QPDFNameTreeObjectHelper::iterator::remove()
966 QPDFNameTreeObjectHelper::iterator 971 QPDFNameTreeObjectHelper::iterator
967 QPDFNameTreeObjectHelper::begin() const 972 QPDFNameTreeObjectHelper::begin() const
968 { 973 {
969 - return {std::make_shared<NNTreeIterator>(m->impl->begin())}; 974 + return {std::make_shared<NNTreeIterator>(m->impl.begin())};
970 } 975 }
971 976
972 QPDFNameTreeObjectHelper::iterator 977 QPDFNameTreeObjectHelper::iterator
973 QPDFNameTreeObjectHelper::end() const 978 QPDFNameTreeObjectHelper::end() const
974 { 979 {
975 - return {std::make_shared<NNTreeIterator>(m->impl->end())}; 980 + return {std::make_shared<NNTreeIterator>(m->impl.end())};
976 } 981 }
977 982
978 QPDFNameTreeObjectHelper::iterator 983 QPDFNameTreeObjectHelper::iterator
979 QPDFNameTreeObjectHelper::last() const 984 QPDFNameTreeObjectHelper::last() const
980 { 985 {
981 - return {std::make_shared<NNTreeIterator>(m->impl->last())}; 986 + return {std::make_shared<NNTreeIterator>(m->impl.last())};
982 } 987 }
983 988
984 QPDFNameTreeObjectHelper::iterator 989 QPDFNameTreeObjectHelper::iterator
985 QPDFNameTreeObjectHelper::find(std::string const& key, bool return_prev_if_not_found) 990 QPDFNameTreeObjectHelper::find(std::string const& key, bool return_prev_if_not_found)
986 { 991 {
987 - auto i = m->impl->find(QPDFObjectHandle::newUnicodeString(key), return_prev_if_not_found); 992 + auto i = m->impl.find(QPDFObjectHandle::newUnicodeString(key), return_prev_if_not_found);
988 return {std::make_shared<NNTreeIterator>(i)}; 993 return {std::make_shared<NNTreeIterator>(i)};
989 } 994 }
990 995
991 QPDFNameTreeObjectHelper::iterator 996 QPDFNameTreeObjectHelper::iterator
992 QPDFNameTreeObjectHelper::insert(std::string const& key, QPDFObjectHandle value) 997 QPDFNameTreeObjectHelper::insert(std::string const& key, QPDFObjectHandle value)
993 { 998 {
994 - auto i = m->impl->insert(QPDFObjectHandle::newUnicodeString(key), value); 999 + auto i = m->impl.insert(QPDFObjectHandle::newUnicodeString(key), value);
995 return {std::make_shared<NNTreeIterator>(i)}; 1000 return {std::make_shared<NNTreeIterator>(i)};
996 } 1001 }
997 1002
998 bool 1003 bool
999 QPDFNameTreeObjectHelper::remove(std::string const& key, QPDFObjectHandle* value) 1004 QPDFNameTreeObjectHelper::remove(std::string const& key, QPDFObjectHandle* value)
1000 { 1005 {
1001 - return m->impl->remove(QPDFObjectHandle::newUnicodeString(key), value); 1006 + return m->impl.remove(QPDFObjectHandle::newUnicodeString(key), value);
1002 } 1007 }
1003 1008
1004 bool 1009 bool
@@ -1022,7 +1027,7 @@ QPDFNameTreeObjectHelper::findObject(std::string const&amp; name, QPDFObjectHandle&amp; @@ -1022,7 +1027,7 @@ QPDFNameTreeObjectHelper::findObject(std::string const&amp; name, QPDFObjectHandle&amp;
1022 void 1027 void
1023 QPDFNameTreeObjectHelper::setSplitThreshold(int t) 1028 QPDFNameTreeObjectHelper::setSplitThreshold(int t)
1024 { 1029 {
1025 - m->impl->setSplitThreshold(t); 1030 + m->impl.setSplitThreshold(t);
1026 } 1031 }
1027 1032
1028 std::map<std::string, QPDFObjectHandle> 1033 std::map<std::string, QPDFObjectHandle>
@@ -1036,29 +1041,36 @@ QPDFNameTreeObjectHelper::getAsMap() const @@ -1036,29 +1041,36 @@ QPDFNameTreeObjectHelper::getAsMap() const
1036 bool 1041 bool
1037 QPDFNameTreeObjectHelper::validate(bool repair) 1042 QPDFNameTreeObjectHelper::validate(bool repair)
1038 { 1043 {
1039 - return m->impl->validate(repair); 1044 + return m->impl.validate(repair);
1040 } 1045 }
1041 1046
1042 -QPDFNumberTreeObjectHelper::~QPDFNumberTreeObjectHelper() // NOLINT (modernize-use-equals-default) 1047 +class QPDFNumberTreeObjectHelper::Members
1043 { 1048 {
1044 - // Must be explicit and not inline -- see QPDF_DLL_CLASS in README-maintainer. For this specific  
1045 - // class, see github issue #745.  
1046 -} 1049 + typedef QPDFNumberTreeObjectHelper::numtree_number numtree_number;
1047 1050
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 -} 1051 + public:
  1052 + Members(
  1053 + QPDFObjectHandle& oh,
  1054 + QPDF& q,
  1055 + std::function<bool(QPDFObjectHandle const&)> value_validator,
  1056 + bool auto_repair) :
  1057 + impl(q, oh, ::ot_integer, value_validator, auto_repair)
  1058 + {
  1059 + }
  1060 + Members(Members const&) = delete;
  1061 + ~Members() = default;
  1062 +
  1063 + NNTreeImpl impl;
  1064 +};
  1065 +
  1066 +// Must be explicit and not inline -- see QPDF_DLL_CLASS in README-maintainer. For this specific
  1067 +// class, see github issue #745.
  1068 +QPDFNumberTreeObjectHelper::~QPDFNumberTreeObjectHelper() = default;
1056 1069
1057 QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper( 1070 QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper(
1058 QPDFObjectHandle oh, QPDF& q, bool auto_repair) : 1071 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)) 1072 + QPDFNumberTreeObjectHelper(
  1073 + oh, q, [](QPDFObjectHandle const& o) -> bool { return static_cast<bool>(o); }, auto_repair)
1062 { 1074 {
1063 } 1075 }
1064 1076
@@ -1068,7 +1080,7 @@ QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper( @@ -1068,7 +1080,7 @@ QPDFNumberTreeObjectHelper::QPDFNumberTreeObjectHelper(
1068 std::function<bool(QPDFObjectHandle const&)> value_validator, 1080 std::function<bool(QPDFObjectHandle const&)> value_validator,
1069 bool auto_repair) : 1081 bool auto_repair) :
1070 QPDFObjectHelper(oh), 1082 QPDFObjectHelper(oh),
1071 - m(new Members(oh, q, value_validator, auto_repair)) 1083 + m(std::make_shared<Members>(oh, q, value_validator, auto_repair))
1072 { 1084 {
1073 } 1085 }
1074 1086
@@ -1155,39 +1167,39 @@ QPDFNumberTreeObjectHelper::iterator::remove() @@ -1155,39 +1167,39 @@ QPDFNumberTreeObjectHelper::iterator::remove()
1155 QPDFNumberTreeObjectHelper::iterator 1167 QPDFNumberTreeObjectHelper::iterator
1156 QPDFNumberTreeObjectHelper::begin() const 1168 QPDFNumberTreeObjectHelper::begin() const
1157 { 1169 {
1158 - return {std::make_shared<NNTreeIterator>(m->impl->begin())}; 1170 + return {std::make_shared<NNTreeIterator>(m->impl.begin())};
1159 } 1171 }
1160 1172
1161 QPDFNumberTreeObjectHelper::iterator 1173 QPDFNumberTreeObjectHelper::iterator
1162 QPDFNumberTreeObjectHelper::end() const 1174 QPDFNumberTreeObjectHelper::end() const
1163 { 1175 {
1164 - return {std::make_shared<NNTreeIterator>(m->impl->end())}; 1176 + return {std::make_shared<NNTreeIterator>(m->impl.end())};
1165 } 1177 }
1166 1178
1167 QPDFNumberTreeObjectHelper::iterator 1179 QPDFNumberTreeObjectHelper::iterator
1168 QPDFNumberTreeObjectHelper::last() const 1180 QPDFNumberTreeObjectHelper::last() const
1169 { 1181 {
1170 - return {std::make_shared<NNTreeIterator>(m->impl->last())}; 1182 + return {std::make_shared<NNTreeIterator>(m->impl.last())};
1171 } 1183 }
1172 1184
1173 QPDFNumberTreeObjectHelper::iterator 1185 QPDFNumberTreeObjectHelper::iterator
1174 QPDFNumberTreeObjectHelper::find(numtree_number key, bool return_prev_if_not_found) 1186 QPDFNumberTreeObjectHelper::find(numtree_number key, bool return_prev_if_not_found)
1175 { 1187 {
1176 - auto i = m->impl->find(QPDFObjectHandle::newInteger(key), return_prev_if_not_found); 1188 + auto i = m->impl.find(QPDFObjectHandle::newInteger(key), return_prev_if_not_found);
1177 return {std::make_shared<NNTreeIterator>(i)}; 1189 return {std::make_shared<NNTreeIterator>(i)};
1178 } 1190 }
1179 1191
1180 QPDFNumberTreeObjectHelper::iterator 1192 QPDFNumberTreeObjectHelper::iterator
1181 QPDFNumberTreeObjectHelper::insert(numtree_number key, QPDFObjectHandle value) 1193 QPDFNumberTreeObjectHelper::insert(numtree_number key, QPDFObjectHandle value)
1182 { 1194 {
1183 - auto i = m->impl->insert(QPDFObjectHandle::newInteger(key), value); 1195 + auto i = m->impl.insert(QPDFObjectHandle::newInteger(key), value);
1184 return {std::make_shared<NNTreeIterator>(i)}; 1196 return {std::make_shared<NNTreeIterator>(i)};
1185 } 1197 }
1186 1198
1187 bool 1199 bool
1188 QPDFNumberTreeObjectHelper::remove(numtree_number key, QPDFObjectHandle* value) 1200 QPDFNumberTreeObjectHelper::remove(numtree_number key, QPDFObjectHandle* value)
1189 { 1201 {
1190 - return m->impl->remove(QPDFObjectHandle::newInteger(key), value); 1202 + return m->impl.remove(QPDFObjectHandle::newInteger(key), value);
1191 } 1203 }
1192 1204
1193 QPDFNumberTreeObjectHelper::numtree_number 1205 QPDFNumberTreeObjectHelper::numtree_number
@@ -1245,7 +1257,7 @@ QPDFNumberTreeObjectHelper::findObjectAtOrBelow( @@ -1245,7 +1257,7 @@ QPDFNumberTreeObjectHelper::findObjectAtOrBelow(
1245 void 1257 void
1246 QPDFNumberTreeObjectHelper::setSplitThreshold(int t) 1258 QPDFNumberTreeObjectHelper::setSplitThreshold(int t)
1247 { 1259 {
1248 - m->impl->setSplitThreshold(t); 1260 + m->impl.setSplitThreshold(t);
1249 } 1261 }
1250 1262
1251 std::map<QPDFNumberTreeObjectHelper::numtree_number, QPDFObjectHandle> 1263 std::map<QPDFNumberTreeObjectHelper::numtree_number, QPDFObjectHandle>
@@ -1259,5 +1271,5 @@ QPDFNumberTreeObjectHelper::getAsMap() const @@ -1259,5 +1271,5 @@ QPDFNumberTreeObjectHelper::getAsMap() const
1259 bool 1271 bool
1260 QPDFNumberTreeObjectHelper::validate(bool repair) 1272 QPDFNumberTreeObjectHelper::validate(bool repair)
1261 { 1273 {
1262 - return m->impl->validate(repair); 1274 + return m->impl.validate(repair);
1263 } 1275 }