Skip to content

Commit 2e721a7

Browse files
committed
std::function conversions
Signed-off-by: Rosen Penev <[email protected]>
1 parent d466c1e commit 2e721a7

File tree

9 files changed

+60
-60
lines changed

9 files changed

+60
-60
lines changed

app/actions.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,8 @@ int Print::printTag(const Exiv2::ExifData& exifData, const std::string& key, con
331331
return rc;
332332
} // Print::printTag
333333

334-
int Print::printTag(const Exiv2::ExifData& exifData, EasyAccessFct easyAccessFct, const std::string& label,
335-
EasyAccessFct easyAccessFctFallback) const {
334+
int Print::printTag(const Exiv2::ExifData& exifData, const EasyAccessFct& easyAccessFct, const std::string& label,
335+
const EasyAccessFct& easyAccessFctFallback) const {
336336
int rc = 0;
337337
if (!label.empty()) {
338338
printLabel(label);

app/actions.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -155,14 +155,14 @@ class Print : public Task {
155155
*/
156156
int printTag(const Exiv2::ExifData& exifData, const std::string& key, const std::string& label = "") const;
157157
//! Type for an Exiv2 Easy access function
158-
using EasyAccessFct = Exiv2::ExifData::const_iterator (*)(const Exiv2::ExifData& ed);
158+
using EasyAccessFct = std::function<Exiv2::ExifData::const_iterator(const Exiv2::ExifData& ed)>;
159159
/*!
160160
@brief Print one summary line with a label (if provided) and requested
161161
data. A line break is printed only if a label is provided.
162162
@return 1 if a line was written, 0 if the information was not found.
163163
*/
164-
int printTag(const Exiv2::ExifData& exifData, EasyAccessFct easyAccessFct, const std::string& label = "",
165-
EasyAccessFct easyAccessFctFallback = nullptr) const;
164+
int printTag(const Exiv2::ExifData& exifData, const EasyAccessFct& easyAccessFct, const std::string& label = "",
165+
const EasyAccessFct& easyAccessFctFallback = nullptr) const;
166166

167167
private:
168168
std::string path_;

samples/easyaccess-test.cpp

Lines changed: 40 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -5,48 +5,46 @@
55
#include <iomanip>
66
#include <iostream>
77

8-
using EasyAccessFct = Exiv2::ExifData::const_iterator (*)(const Exiv2::ExifData&);
8+
using EasyAccessFct = std::function<Exiv2::ExifData::const_iterator(const Exiv2::ExifData&)>;
9+
using EasyAccess = std::pair<const char*, EasyAccessFct>;
910

10-
struct EasyAccess {
11-
const char* label_;
12-
EasyAccessFct findFct_;
11+
static const EasyAccess easyAccess[] = {
12+
{"Orientation", Exiv2::orientation},
13+
{"ISO speed", Exiv2::isoSpeed},
14+
{"Date & time original", Exiv2::dateTimeOriginal},
15+
{"Flash bias", Exiv2::flashBias},
16+
{"Exposure mode", Exiv2::exposureMode},
17+
{"Scene mode", Exiv2::sceneMode},
18+
{"Macro mode", Exiv2::macroMode},
19+
{"Image quality", Exiv2::imageQuality},
20+
{"White balance", Exiv2::whiteBalance},
21+
{"Lens name", Exiv2::lensName},
22+
{"Saturation", Exiv2::saturation},
23+
{"Sharpness", Exiv2::sharpness},
24+
{"Contrast", Exiv2::contrast},
25+
{"Scene capture type", Exiv2::sceneCaptureType},
26+
{"Metering mode", Exiv2::meteringMode},
27+
{"Camera make", Exiv2::make},
28+
{"Camera model", Exiv2::model},
29+
{"Exposure time", Exiv2::exposureTime},
30+
{"FNumber", Exiv2::fNumber},
31+
{"Shutter speed value", Exiv2::shutterSpeedValue},
32+
{"Aperture value", Exiv2::apertureValue},
33+
{"Brightness value", Exiv2::brightnessValue},
34+
{"Exposure bias", Exiv2::exposureBiasValue},
35+
{"Max aperture value", Exiv2::maxApertureValue},
36+
{"Subject distance", Exiv2::subjectDistance},
37+
{"Light source", Exiv2::lightSource},
38+
{"Flash", Exiv2::flash},
39+
{"Camera serial number", Exiv2::serialNumber},
40+
{"Focal length", Exiv2::focalLength},
41+
{"Subject location/area", Exiv2::subjectArea},
42+
{"Flash energy", Exiv2::flashEnergy},
43+
{"Exposure index", Exiv2::exposureIndex},
44+
{"Sensing method", Exiv2::sensingMethod},
45+
{"AF point", Exiv2::afPoint},
1346
};
1447

15-
static const EasyAccess easyAccess[] = {{"Orientation", Exiv2::orientation},
16-
{"ISO speed", Exiv2::isoSpeed},
17-
{"Date & time original", Exiv2::dateTimeOriginal},
18-
{"Flash bias", Exiv2::flashBias},
19-
{"Exposure mode", Exiv2::exposureMode},
20-
{"Scene mode", Exiv2::sceneMode},
21-
{"Macro mode", Exiv2::macroMode},
22-
{"Image quality", Exiv2::imageQuality},
23-
{"White balance", Exiv2::whiteBalance},
24-
{"Lens name", Exiv2::lensName},
25-
{"Saturation", Exiv2::saturation},
26-
{"Sharpness", Exiv2::sharpness},
27-
{"Contrast", Exiv2::contrast},
28-
{"Scene capture type", Exiv2::sceneCaptureType},
29-
{"Metering mode", Exiv2::meteringMode},
30-
{"Camera make", Exiv2::make},
31-
{"Camera model", Exiv2::model},
32-
{"Exposure time", Exiv2::exposureTime},
33-
{"FNumber", Exiv2::fNumber},
34-
{"Shutter speed value", Exiv2::shutterSpeedValue},
35-
{"Aperture value", Exiv2::apertureValue},
36-
{"Brightness value", Exiv2::brightnessValue},
37-
{"Exposure bias", Exiv2::exposureBiasValue},
38-
{"Max aperture value", Exiv2::maxApertureValue},
39-
{"Subject distance", Exiv2::subjectDistance},
40-
{"Light source", Exiv2::lightSource},
41-
{"Flash", Exiv2::flash},
42-
{"Camera serial number", Exiv2::serialNumber},
43-
{"Focal length", Exiv2::focalLength},
44-
{"Subject location/area", Exiv2::subjectArea},
45-
{"Flash energy", Exiv2::flashEnergy},
46-
{"Exposure index", Exiv2::exposureIndex},
47-
{"Sensing method", Exiv2::sensingMethod},
48-
{"AF point", Exiv2::afPoint}};
49-
5048
int main(int argc, char** argv) {
5149
try {
5250
Exiv2::XmpParser::initialize();
@@ -64,9 +62,9 @@ int main(int argc, char** argv) {
6462
image->readMetadata();
6563
Exiv2::ExifData& ed = image->exifData();
6664

67-
for (auto&& ea : easyAccess) {
68-
auto pos = ea.findFct_(ed);
69-
std::cout << std::setw(21) << std::left << ea.label_;
65+
for (auto&& [label, fct] : easyAccess) {
66+
auto pos = fct(ed);
67+
std::cout << std::setw(21) << std::left << label;
7068
if (pos != ed.end()) {
7169
std::cout << " (" << std::setw(35) << pos->key() << ") : " << pos->print(&ed) << "\n";
7270
} else {

src/makernote_int.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#include "tags_int.hpp"
99
#include "types.hpp"
1010

11+
#include <functional>
12+
1113
// namespace extensions
1214
namespace Exiv2::Internal {
1315
class IoWrapper;
@@ -28,11 +30,10 @@ std::string readExiv2Config(const std::string& section, const std::string& value
2830
// class definitions
2931

3032
//! Type for a pointer to a function creating a makernote (image)
31-
using NewMnFct = TiffComponent* (*)(uint16_t tag, IfdId group, IfdId mnGroup, const byte* pData, size_t size,
32-
ByteOrder byteOrder);
33+
using NewMnFct = std::function<TiffComponent*(uint16_t, IfdId, IfdId, const byte*, size_t, ByteOrder)>;
3334

3435
//! Type for a pointer to a function creating a makernote (group)
35-
using NewMnFct2 = TiffComponent* (*)(uint16_t tag, IfdId group, IfdId mnGroup);
36+
using NewMnFct2 = std::function<TiffComponent*(uint16_t tag, IfdId group, IfdId mnGroup)>;
3637

3738
//! Makernote registry structure
3839
struct TiffMnRegistry {

src/tiffcomposite_int.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1240,10 +1240,10 @@ class TiffIfdMakernote : public TiffComponent {
12401240
@brief Function pointer type for a function to determine which cfg + def
12411241
of a corresponding array set to use.
12421242
*/
1243-
using CfgSelFct = int (*)(uint16_t, const byte*, size_t, TiffComponent* const);
1243+
using CfgSelFct = int (*)(uint16_t, const byte*, size_t, TiffComponent*);
12441244

12451245
//! Function pointer type for a crypt function used for binary arrays.
1246-
using CryptFct = DataBuf (*)(uint16_t, const byte*, size_t, TiffComponent* const);
1246+
using CryptFct = DataBuf (*)(uint16_t, const byte*, size_t, TiffComponent*);
12471247

12481248
//! Defines one tag in a binary array
12491249
struct ArrayDef {

src/tifffwd_int.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "types.hpp"
1010

1111
// + standard includes
12+
#include <functional>
1213
#include <stack>
1314

1415
// *****************************************************************************
@@ -61,17 +62,17 @@ using EncoderFct = void (TiffEncoder::*)(TiffEntryBase*, const Exifdatum*);
6162
/*!
6263
@brief Type for a function pointer for a function to decode a TIFF component.
6364
*/
64-
using FindDecoderFct = DecoderFct (*)(const std::string& make, uint32_t extendedTag, IfdId group);
65+
using FindDecoderFct = std::function<DecoderFct(const std::string& make, uint32_t extendedTag, IfdId group)>;
6566
/*!
6667
@brief Type for a function pointer for a function to encode a TIFF component.
6768
*/
68-
using FindEncoderFct = EncoderFct (*)(const std::string& make, uint32_t extendedTag, IfdId group);
69+
using FindEncoderFct = std::function<EncoderFct(const std::string& make, uint32_t extendedTag, IfdId group)>;
6970
/*!
7071
@brief Type for a function pointer for a function to create a TIFF component.
7172
Use TiffComponent::UniquePtr, it is not used in this declaration only
7273
to reduce dependencies.
7374
*/
74-
using NewTiffCompFct = std::unique_ptr<TiffComponent> (*)(uint16_t tag, IfdId group);
75+
using NewTiffCompFct = std::function<std::unique_ptr<TiffComponent>(uint16_t tag, IfdId group)>;
7576

7677
//! Stack to hold a path from the TIFF root element to a TIFF entry
7778
using TiffPath = std::stack<TiffPathItem>;

src/tiffimage_int.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1848,7 +1848,7 @@ ByteOrder TiffParserWorker::decode(ExifData& exifData, IptcData& iptcData, XmpDa
18481848

18491849
auto rootDir = parse(pData, size, root, pHeader);
18501850
if (rootDir) {
1851-
TiffDecoder decoder(exifData, iptcData, xmpData, rootDir.get(), findDecoderFct);
1851+
TiffDecoder decoder(exifData, iptcData, xmpData, rootDir.get(), std::move(findDecoderFct));
18521852
rootDir->accept(decoder);
18531853
}
18541854
return pHeader->byteOrder();
@@ -1857,7 +1857,7 @@ ByteOrder TiffParserWorker::decode(ExifData& exifData, IptcData& iptcData, XmpDa
18571857

18581858
WriteMethod TiffParserWorker::encode(BasicIo& io, const byte* pData, size_t size, const ExifData& exifData,
18591859
const IptcData& iptcData, const XmpData& xmpData, uint32_t root,
1860-
FindEncoderFct findEncoderFct, TiffHeaderBase* pHeader,
1860+
const FindEncoderFct& findEncoderFct, TiffHeaderBase* pHeader,
18611861
OffsetWriter* pOffsetWriter) {
18621862
/*
18631863
1) parse the binary image, if one is provided, and

src/tiffimage_int.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ class TiffParserWorker {
263263
*/
264264
static WriteMethod encode(BasicIo& io, const byte* pData, size_t size, const ExifData& exifData,
265265
const IptcData& iptcData, const XmpData& xmpData, uint32_t root,
266-
FindEncoderFct findEncoderFct, TiffHeaderBase* pHeader, OffsetWriter* pOffsetWriter);
266+
const FindEncoderFct& findEncoderFct, TiffHeaderBase* pHeader, OffsetWriter* pOffsetWriter);
267267

268268
private:
269269
/*!

src/tiffvisitor_int.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ TiffDecoder::TiffDecoder(ExifData& exifData, IptcData& iptcData, XmpData& xmpDat
193193
iptcData_(iptcData),
194194
xmpData_(xmpData),
195195
pRoot_(pRoot),
196-
findDecoderFct_(findDecoderFct),
196+
findDecoderFct_(std::move(findDecoderFct)),
197197
decodedIptc_(false) {
198198
// #1402 Fujifilm RAF. Search for the make
199199
// Find camera make in existing metadata (read from the JPEG)
@@ -460,7 +460,7 @@ TiffEncoder::TiffEncoder(ExifData exifData, const IptcData& iptcData, const XmpD
460460
isNewImage_(isNewImage),
461461
pPrimaryGroups_(pPrimaryGroups),
462462
pSourceTree_(nullptr),
463-
findEncoderFct_(findEncoderFct),
463+
findEncoderFct_(std::move(findEncoderFct)),
464464
dirty_(false),
465465
writeMethod_(wmNonIntrusive) {
466466
byteOrder_ = pHeader->byteOrder();

0 commit comments

Comments
 (0)