From 2e721a716e54300038cdb015eec004e23ab42e9f Mon Sep 17 00:00:00 2001 From: Rosen Penev Date: Fri, 15 Apr 2022 18:57:08 -0700 Subject: [PATCH] std::function conversions Signed-off-by: Rosen Penev --- app/actions.cpp | 4 +- app/actions.hpp | 6 +-- samples/easyaccess-test.cpp | 82 ++++++++++++++++++------------------- src/makernote_int.hpp | 7 ++-- src/tiffcomposite_int.hpp | 4 +- src/tifffwd_int.hpp | 7 ++-- src/tiffimage_int.cpp | 4 +- src/tiffimage_int.hpp | 2 +- src/tiffvisitor_int.cpp | 4 +- 9 files changed, 60 insertions(+), 60 deletions(-) diff --git a/app/actions.cpp b/app/actions.cpp index 599a9534..cea3a634 100644 --- a/app/actions.cpp +++ b/app/actions.cpp @@ -331,8 +331,8 @@ int Print::printTag(const Exiv2::ExifData& exifData, const std::string& key, con return rc; } // Print::printTag -int Print::printTag(const Exiv2::ExifData& exifData, EasyAccessFct easyAccessFct, const std::string& label, - EasyAccessFct easyAccessFctFallback) const { +int Print::printTag(const Exiv2::ExifData& exifData, const EasyAccessFct& easyAccessFct, const std::string& label, + const EasyAccessFct& easyAccessFctFallback) const { int rc = 0; if (!label.empty()) { printLabel(label); diff --git a/app/actions.hpp b/app/actions.hpp index 10751e7c..62a1c557 100644 --- a/app/actions.hpp +++ b/app/actions.hpp @@ -155,14 +155,14 @@ class Print : public Task { */ int printTag(const Exiv2::ExifData& exifData, const std::string& key, const std::string& label = "") const; //! Type for an Exiv2 Easy access function - using EasyAccessFct = Exiv2::ExifData::const_iterator (*)(const Exiv2::ExifData& ed); + using EasyAccessFct = std::function; /*! @brief Print one summary line with a label (if provided) and requested data. A line break is printed only if a label is provided. @return 1 if a line was written, 0 if the information was not found. */ - int printTag(const Exiv2::ExifData& exifData, EasyAccessFct easyAccessFct, const std::string& label = "", - EasyAccessFct easyAccessFctFallback = nullptr) const; + int printTag(const Exiv2::ExifData& exifData, const EasyAccessFct& easyAccessFct, const std::string& label = "", + const EasyAccessFct& easyAccessFctFallback = nullptr) const; private: std::string path_; diff --git a/samples/easyaccess-test.cpp b/samples/easyaccess-test.cpp index c1a6ee97..dc3d7352 100644 --- a/samples/easyaccess-test.cpp +++ b/samples/easyaccess-test.cpp @@ -5,48 +5,46 @@ #include #include -using EasyAccessFct = Exiv2::ExifData::const_iterator (*)(const Exiv2::ExifData&); +using EasyAccessFct = std::function; +using EasyAccess = std::pair; -struct EasyAccess { - const char* label_; - EasyAccessFct findFct_; +static const EasyAccess easyAccess[] = { + {"Orientation", Exiv2::orientation}, + {"ISO speed", Exiv2::isoSpeed}, + {"Date & time original", Exiv2::dateTimeOriginal}, + {"Flash bias", Exiv2::flashBias}, + {"Exposure mode", Exiv2::exposureMode}, + {"Scene mode", Exiv2::sceneMode}, + {"Macro mode", Exiv2::macroMode}, + {"Image quality", Exiv2::imageQuality}, + {"White balance", Exiv2::whiteBalance}, + {"Lens name", Exiv2::lensName}, + {"Saturation", Exiv2::saturation}, + {"Sharpness", Exiv2::sharpness}, + {"Contrast", Exiv2::contrast}, + {"Scene capture type", Exiv2::sceneCaptureType}, + {"Metering mode", Exiv2::meteringMode}, + {"Camera make", Exiv2::make}, + {"Camera model", Exiv2::model}, + {"Exposure time", Exiv2::exposureTime}, + {"FNumber", Exiv2::fNumber}, + {"Shutter speed value", Exiv2::shutterSpeedValue}, + {"Aperture value", Exiv2::apertureValue}, + {"Brightness value", Exiv2::brightnessValue}, + {"Exposure bias", Exiv2::exposureBiasValue}, + {"Max aperture value", Exiv2::maxApertureValue}, + {"Subject distance", Exiv2::subjectDistance}, + {"Light source", Exiv2::lightSource}, + {"Flash", Exiv2::flash}, + {"Camera serial number", Exiv2::serialNumber}, + {"Focal length", Exiv2::focalLength}, + {"Subject location/area", Exiv2::subjectArea}, + {"Flash energy", Exiv2::flashEnergy}, + {"Exposure index", Exiv2::exposureIndex}, + {"Sensing method", Exiv2::sensingMethod}, + {"AF point", Exiv2::afPoint}, }; -static const EasyAccess easyAccess[] = {{"Orientation", Exiv2::orientation}, - {"ISO speed", Exiv2::isoSpeed}, - {"Date & time original", Exiv2::dateTimeOriginal}, - {"Flash bias", Exiv2::flashBias}, - {"Exposure mode", Exiv2::exposureMode}, - {"Scene mode", Exiv2::sceneMode}, - {"Macro mode", Exiv2::macroMode}, - {"Image quality", Exiv2::imageQuality}, - {"White balance", Exiv2::whiteBalance}, - {"Lens name", Exiv2::lensName}, - {"Saturation", Exiv2::saturation}, - {"Sharpness", Exiv2::sharpness}, - {"Contrast", Exiv2::contrast}, - {"Scene capture type", Exiv2::sceneCaptureType}, - {"Metering mode", Exiv2::meteringMode}, - {"Camera make", Exiv2::make}, - {"Camera model", Exiv2::model}, - {"Exposure time", Exiv2::exposureTime}, - {"FNumber", Exiv2::fNumber}, - {"Shutter speed value", Exiv2::shutterSpeedValue}, - {"Aperture value", Exiv2::apertureValue}, - {"Brightness value", Exiv2::brightnessValue}, - {"Exposure bias", Exiv2::exposureBiasValue}, - {"Max aperture value", Exiv2::maxApertureValue}, - {"Subject distance", Exiv2::subjectDistance}, - {"Light source", Exiv2::lightSource}, - {"Flash", Exiv2::flash}, - {"Camera serial number", Exiv2::serialNumber}, - {"Focal length", Exiv2::focalLength}, - {"Subject location/area", Exiv2::subjectArea}, - {"Flash energy", Exiv2::flashEnergy}, - {"Exposure index", Exiv2::exposureIndex}, - {"Sensing method", Exiv2::sensingMethod}, - {"AF point", Exiv2::afPoint}}; - int main(int argc, char** argv) { try { Exiv2::XmpParser::initialize(); @@ -64,9 +62,9 @@ int main(int argc, char** argv) { image->readMetadata(); Exiv2::ExifData& ed = image->exifData(); - for (auto&& ea : easyAccess) { - auto pos = ea.findFct_(ed); - std::cout << std::setw(21) << std::left << ea.label_; + for (auto&& [label, fct] : easyAccess) { + auto pos = fct(ed); + std::cout << std::setw(21) << std::left << label; if (pos != ed.end()) { std::cout << " (" << std::setw(35) << pos->key() << ") : " << pos->print(&ed) << "\n"; } else { diff --git a/src/makernote_int.hpp b/src/makernote_int.hpp index 930ef8b7..14b60bac 100644 --- a/src/makernote_int.hpp +++ b/src/makernote_int.hpp @@ -8,6 +8,8 @@ #include "tags_int.hpp" #include "types.hpp" +#include + // namespace extensions namespace Exiv2::Internal { class IoWrapper; @@ -28,11 +30,10 @@ std::string readExiv2Config(const std::string& section, const std::string& value // class definitions //! Type for a pointer to a function creating a makernote (image) -using NewMnFct = TiffComponent* (*)(uint16_t tag, IfdId group, IfdId mnGroup, const byte* pData, size_t size, - ByteOrder byteOrder); +using NewMnFct = std::function; //! Type for a pointer to a function creating a makernote (group) -using NewMnFct2 = TiffComponent* (*)(uint16_t tag, IfdId group, IfdId mnGroup); +using NewMnFct2 = std::function; //! Makernote registry structure struct TiffMnRegistry { diff --git a/src/tiffcomposite_int.hpp b/src/tiffcomposite_int.hpp index 8f2003ef..9cad72e9 100644 --- a/src/tiffcomposite_int.hpp +++ b/src/tiffcomposite_int.hpp @@ -1240,10 +1240,10 @@ class TiffIfdMakernote : public TiffComponent { @brief Function pointer type for a function to determine which cfg + def of a corresponding array set to use. */ -using CfgSelFct = int (*)(uint16_t, const byte*, size_t, TiffComponent* const); +using CfgSelFct = int (*)(uint16_t, const byte*, size_t, TiffComponent*); //! Function pointer type for a crypt function used for binary arrays. -using CryptFct = DataBuf (*)(uint16_t, const byte*, size_t, TiffComponent* const); +using CryptFct = DataBuf (*)(uint16_t, const byte*, size_t, TiffComponent*); //! Defines one tag in a binary array struct ArrayDef { diff --git a/src/tifffwd_int.hpp b/src/tifffwd_int.hpp index 016ec1c3..0ab8a780 100644 --- a/src/tifffwd_int.hpp +++ b/src/tifffwd_int.hpp @@ -9,6 +9,7 @@ #include "types.hpp" // + standard includes +#include #include // ***************************************************************************** @@ -61,17 +62,17 @@ using EncoderFct = void (TiffEncoder::*)(TiffEntryBase*, const Exifdatum*); /*! @brief Type for a function pointer for a function to decode a TIFF component. */ -using FindDecoderFct = DecoderFct (*)(const std::string& make, uint32_t extendedTag, IfdId group); +using FindDecoderFct = std::function; /*! @brief Type for a function pointer for a function to encode a TIFF component. */ -using FindEncoderFct = EncoderFct (*)(const std::string& make, uint32_t extendedTag, IfdId group); +using FindEncoderFct = std::function; /*! @brief Type for a function pointer for a function to create a TIFF component. Use TiffComponent::UniquePtr, it is not used in this declaration only to reduce dependencies. */ -using NewTiffCompFct = std::unique_ptr (*)(uint16_t tag, IfdId group); +using NewTiffCompFct = std::function(uint16_t tag, IfdId group)>; //! Stack to hold a path from the TIFF root element to a TIFF entry using TiffPath = std::stack; diff --git a/src/tiffimage_int.cpp b/src/tiffimage_int.cpp index 6a3224d7..f0dcee48 100644 --- a/src/tiffimage_int.cpp +++ b/src/tiffimage_int.cpp @@ -1848,7 +1848,7 @@ ByteOrder TiffParserWorker::decode(ExifData& exifData, IptcData& iptcData, XmpDa auto rootDir = parse(pData, size, root, pHeader); if (rootDir) { - TiffDecoder decoder(exifData, iptcData, xmpData, rootDir.get(), findDecoderFct); + TiffDecoder decoder(exifData, iptcData, xmpData, rootDir.get(), std::move(findDecoderFct)); rootDir->accept(decoder); } return pHeader->byteOrder(); @@ -1857,7 +1857,7 @@ ByteOrder TiffParserWorker::decode(ExifData& exifData, IptcData& iptcData, XmpDa WriteMethod TiffParserWorker::encode(BasicIo& io, const byte* pData, size_t size, const ExifData& exifData, const IptcData& iptcData, const XmpData& xmpData, uint32_t root, - FindEncoderFct findEncoderFct, TiffHeaderBase* pHeader, + const FindEncoderFct& findEncoderFct, TiffHeaderBase* pHeader, OffsetWriter* pOffsetWriter) { /* 1) parse the binary image, if one is provided, and diff --git a/src/tiffimage_int.hpp b/src/tiffimage_int.hpp index 4ca1d0f5..a928ca9c 100644 --- a/src/tiffimage_int.hpp +++ b/src/tiffimage_int.hpp @@ -263,7 +263,7 @@ class TiffParserWorker { */ static WriteMethod encode(BasicIo& io, const byte* pData, size_t size, const ExifData& exifData, const IptcData& iptcData, const XmpData& xmpData, uint32_t root, - FindEncoderFct findEncoderFct, TiffHeaderBase* pHeader, OffsetWriter* pOffsetWriter); + const FindEncoderFct& findEncoderFct, TiffHeaderBase* pHeader, OffsetWriter* pOffsetWriter); private: /*! diff --git a/src/tiffvisitor_int.cpp b/src/tiffvisitor_int.cpp index 190b348e..bc89b08b 100644 --- a/src/tiffvisitor_int.cpp +++ b/src/tiffvisitor_int.cpp @@ -193,7 +193,7 @@ TiffDecoder::TiffDecoder(ExifData& exifData, IptcData& iptcData, XmpData& xmpDat iptcData_(iptcData), xmpData_(xmpData), pRoot_(pRoot), - findDecoderFct_(findDecoderFct), + findDecoderFct_(std::move(findDecoderFct)), decodedIptc_(false) { // #1402 Fujifilm RAF. Search for the make // Find camera make in existing metadata (read from the JPEG) @@ -460,7 +460,7 @@ TiffEncoder::TiffEncoder(ExifData exifData, const IptcData& iptcData, const XmpD isNewImage_(isNewImage), pPrimaryGroups_(pPrimaryGroups), pSourceTree_(nullptr), - findEncoderFct_(findEncoderFct), + findEncoderFct_(std::move(findEncoderFct)), dirty_(false), writeMethod_(wmNonIntrusive) { byteOrder_ = pHeader->byteOrder();