Commit dff43b8f8f48097507a417a9752faa929c005212
1 parent
44bd9db1
Add `BaseHandle::find` method to retrieve values by key from dictionaries.
Showing
2 changed files
with
39 additions
and
0 deletions
include/qpdf/ObjectHandle.hh
| @@ -85,6 +85,7 @@ namespace qpdf | @@ -85,6 +85,7 @@ namespace qpdf | ||
| 85 | 85 | ||
| 86 | bool contains(std::string const& key) const; | 86 | bool contains(std::string const& key) const; |
| 87 | size_t erase(std::string const& key); | 87 | size_t erase(std::string const& key); |
| 88 | + QPDFObjectHandle& find(std::string const& key) const; | ||
| 88 | bool replace(std::string const& key, QPDFObjectHandle value); | 89 | bool replace(std::string const& key, QPDFObjectHandle value); |
| 89 | QPDFObjectHandle const& operator[](std::string const& key) const; | 90 | QPDFObjectHandle const& operator[](std::string const& key) const; |
| 90 | 91 |
libqpdf/QPDF_Dictionary.cc
| @@ -2,6 +2,7 @@ | @@ -2,6 +2,7 @@ | ||
| 2 | 2 | ||
| 3 | #include <qpdf/QPDFObject_private.hh> | 3 | #include <qpdf/QPDFObject_private.hh> |
| 4 | #include <qpdf/QTC.hh> | 4 | #include <qpdf/QTC.hh> |
| 5 | +#include <qpdf/Util.hh> | ||
| 5 | 6 | ||
| 6 | using namespace std::literals; | 7 | using namespace std::literals; |
| 7 | using namespace qpdf; | 8 | using namespace qpdf; |
| @@ -29,12 +30,49 @@ BaseHandle::operator[](std::string const& key) const | @@ -29,12 +30,49 @@ BaseHandle::operator[](std::string const& key) const | ||
| 29 | return null_obj; | 30 | return null_obj; |
| 30 | } | 31 | } |
| 31 | 32 | ||
| 33 | +/// @brief Checks if the specified key exists in the object. | ||
| 34 | +/// | ||
| 35 | +/// This method determines whether the given key is present in the object by verifying if the | ||
| 36 | +/// associated value is non-null. | ||
| 37 | +/// | ||
| 38 | +/// @param key The key to look for in the object. | ||
| 39 | +/// @return True if the key exists and its associated value is non-null. Otherwise, returns false. | ||
| 32 | bool | 40 | bool |
| 33 | BaseHandle::contains(std::string const& key) const | 41 | BaseHandle::contains(std::string const& key) const |
| 34 | { | 42 | { |
| 35 | return !(*this)[key].null(); | 43 | return !(*this)[key].null(); |
| 36 | } | 44 | } |
| 37 | 45 | ||
| 46 | +/// @brief Retrieves the value associated with the given key from dictionary. | ||
| 47 | +/// | ||
| 48 | +/// This method attempts to find the value corresponding to the specified key for objects that can | ||
| 49 | +/// be interpreted as dictionaries. | ||
| 50 | +/// | ||
| 51 | +/// - If the object is a dictionary and the specified key exists, it returns a reference | ||
| 52 | +/// to the associated value. | ||
| 53 | +/// - If the object is not a dictionary or the specified key does not exist, it returns | ||
| 54 | +/// a reference to a static uninitialized object handle. | ||
| 55 | +/// | ||
| 56 | +/// @note Modifying the uninitialized object returned when the key is not found is strictly | ||
| 57 | +/// prohibited. | ||
| 58 | +/// | ||
| 59 | +/// @param key The key whose associated value should be retrieved. | ||
| 60 | +/// @return A reference to the associated value if the key is found or a reference to a static | ||
| 61 | +/// uninitialized object if the key is not found. | ||
| 62 | +QPDFObjectHandle& | ||
| 63 | +BaseHandle::find(std::string const& key) const | ||
| 64 | +{ | ||
| 65 | + static const QPDFObjectHandle null_obj; | ||
| 66 | + qpdf_invariant(!null_obj); | ||
| 67 | + if (auto d = as<QPDF_Dictionary>()) { | ||
| 68 | + auto it = d->items.find(key); | ||
| 69 | + if (it != d->items.end()) { | ||
| 70 | + return it->second; | ||
| 71 | + } | ||
| 72 | + } | ||
| 73 | + return const_cast<QPDFObjectHandle&>(null_obj); | ||
| 74 | +} | ||
| 75 | + | ||
| 38 | std::set<std::string> | 76 | std::set<std::string> |
| 39 | BaseDictionary::getKeys() | 77 | BaseDictionary::getKeys() |
| 40 | { | 78 | { |