digiKam
Loading...
Searching...
No Matches
metaengine_mergehelper.h
Go to the documentation of this file.
1/* ============================================================
2 *
3 * This file is a part of digiKam project
4 * https://www.digikam.org
5 *
6 * Date : 2006-09-15
7 * Description : Exiv2 library interface.
8 * Internal merge helper.
9 *
10 * SPDX-FileCopyrightText: 2006-2024 by Gilles Caulier <caulier dot gilles at gmail dot com>
11 * SPDX-FileCopyrightText: 2006-2013 by Marcel Wiesweg <marcel dot wiesweg at gmx dot de>
12 *
13 * SPDX-License-Identifier: GPL-2.0-or-later
14 *
15 * ============================================================ */
16
17#pragma once
18
19#include "metaengine_p.h"
20
21namespace Digikam
22{
23
24template <class Data, class Key, class KeyString, class KeyStringList = QList<KeyString> >
25
26class Q_DECL_HIDDEN MetaEngineMergeHelper
27{
28public:
29
30 KeyStringList keys;
31
32public:
33
34 MetaEngineMergeHelper& operator<<(const KeyString& key)
35 {
36 keys << key;
37
38 return *this;
39 }
40
45 void mergeAll(const Data& src, Data& dest)
46 {
47 for (typename Data::const_iterator it = src.begin() ; it != src.end() ; ++it)
48 {
49 typename Data::iterator destIt = dest.findKey(Key(it->key()));
50
51 if (destIt == dest.end())
52 {
53 dest.add(*it);
54 }
55 else
56 {
57 *destIt = *it;
58 }
59 }
60 }
61
67 void mergeFields(const Data& src, Data& dest)
68 {
69 for (const KeyString& keyString : EXIV2_AS_CONST(keys))
70 {
71 Key key(keyString.latin1());
72 typename Data::const_iterator it = src.findKey(key);
73
74 if (it == src.end())
75 {
76 continue;
77 }
78
79 typename Data::iterator destIt = dest.findKey(key);
80
81 if (destIt == dest.end())
82 {
83 dest.add(*it);
84 }
85 else
86 {
87 *destIt = *it;
88 }
89 }
90 }
91
99 void exclusiveMerge(const Data& src, Data& dest)
100 {
101 for (const KeyString& keyString : EXIV2_AS_CONST(keys))
102 {
103 Key key(keyString.latin1());
104 typename Data::const_iterator it = src.findKey(key);
105 typename Data::iterator destIt = dest.findKey(key);
106
107 if (destIt == dest.end())
108 {
109 if (it != src.end())
110 {
111 dest.add(*it);
112 }
113 }
114 else
115 {
116 if (it == src.end())
117 {
118 dest.erase(destIt);
119 }
120 else
121 {
122 *destIt = *it;
123 }
124 }
125 }
126 }
127};
128
129class Q_DECL_HIDDEN ExifMetaEngineMergeHelper
130 : public MetaEngineMergeHelper<Exiv2::ExifData, Exiv2::ExifKey, QLatin1String>
131{
132};
133
134class Q_DECL_HIDDEN IptcMetaEngineMergeHelper
135 : public MetaEngineMergeHelper<Exiv2::IptcData, Exiv2::IptcKey, QLatin1String>
136{
137};
138
139#ifdef _XMP_SUPPORT_
140
141class Q_DECL_HIDDEN XmpMetaEngineMergeHelper
142 : public MetaEngineMergeHelper<Exiv2::XmpData, Exiv2::XmpKey, QLatin1String>
143{
144};
145
146#endif
147
148} // namespace Digikam
Definition metaengine_mergehelper.h:131
Definition metaengine_mergehelper.h:136
Definition metaengine_mergehelper.h:27
KeyStringList keys
Definition metaengine_mergehelper.h:30
void exclusiveMerge(const Data &src, Data &dest)
Definition metaengine_mergehelper.h:99
void mergeFields(const Data &src, Data &dest)
Definition metaengine_mergehelper.h:67
MetaEngineMergeHelper & operator<<(const KeyString &key)
Definition metaengine_mergehelper.h:34
void mergeAll(const Data &src, Data &dest)
Definition metaengine_mergehelper.h:45
Definition datefolderview.cpp:34