diff --git a/src/tiffimage_int.cpp b/src/tiffimage_int.cpp index 1bce159b..5295977f 100644 --- a/src/tiffimage_int.cpp +++ b/src/tiffimage_int.cpp @@ -10,6 +10,7 @@ #include #include +#include // Shortcuts for the newTiffBinaryArray templates. #define EXV_BINARY_ARRAY(arrayCfg, arrayDef) (newTiffBinaryArray0<&(arrayCfg), std::size(arrayDef), arrayDef>) @@ -2182,7 +2183,7 @@ bool TiffHeaderBase::isImageTag(uint16_t /*tag*/, IfdId /*group*/, const Primary bool isTiffImageTag(uint16_t tag, IfdId group) { //! List of TIFF image tags - static constexpr TiffImgTagStruct tiffImageTags[] = { + static const std::unordered_set tiffImageTags({ {0x00fe, IfdId::ifd0Id}, // Exif.Image.NewSubfileType {0x00ff, IfdId::ifd0Id}, // Exif.Image.SubfileType {0x0100, IfdId::ifd0Id}, // Exif.Image.ImageWidth @@ -2249,11 +2250,12 @@ bool isTiffImageTag(uint16_t tag, IfdId group) { {0x8828, IfdId::ifd0Id}, // Exif.Image.OECF {0x9102, IfdId::ifd0Id}, // Exif.Image.CompressedBitsPerPixel {0x9217, IfdId::ifd0Id}, // Exif.Image.SensingMethod - }; + }); + const bool found = tiffImageTags.find(TiffImgTagKey(tag, group)) != tiffImageTags.end(); // If tag, group is one of the image tags listed above -> bingo! #ifdef EXIV2_DEBUG_MESSAGES - if (find(tiffImageTags, TiffImgTagStruct(tag, group))) { + if (found) { ExifKey key(tag, groupName(group)); std::cerr << "Image tag: " << key << " (3)\n"; return true; @@ -2261,7 +2263,7 @@ bool isTiffImageTag(uint16_t tag, IfdId group) { std::cerr << "Not an image tag: " << tag << " (4)\n"; return false; #endif - return find(tiffImageTags, TiffImgTagStruct(tag, group)); + return found; } TiffHeader::TiffHeader(ByteOrder byteOrder, uint32_t offset, bool hasImageTags) : diff --git a/src/tiffimage_int.hpp b/src/tiffimage_int.hpp index abeec475..4a80882f 100644 --- a/src/tiffimage_int.hpp +++ b/src/tiffimage_int.hpp @@ -133,7 +133,13 @@ class TiffHeader : public TiffHeaderBase { /*! @brief Data structure used to list image tags for TIFF and TIFF-like images. */ -using TiffImgTagStruct = std::pair; +using TiffImgTagKey = std::pair; + +struct TiffImgTagKey_hash { + std::size_t operator()(const TiffImgTagKey& pair) const { + return std::hash{}(static_cast(pair.first) << 32 | static_cast(pair.second)); + } +}; using TiffGroupKey = std::pair;