Patch #967 » 0002-xmp-convert-metadata-store-from-std-vector-to-std-mu.patch
| src/properties.cpp | ||
|---|---|---|
| 2300 | 2300 |
return *this; |
| 2301 | 2301 |
} |
| 2302 | 2302 | |
| 2303 |
bool XmpKey::operator<(const XmpKey& b) const |
|
| 2304 |
{
|
|
| 2305 |
if (this->groupName() != b.groupName()) {
|
|
| 2306 |
return this->groupName() < b.groupName(); |
|
| 2307 |
} |
|
| 2308 | ||
| 2309 |
return this->tagName() < b.tagName(); |
|
| 2310 |
} |
|
| 2311 | ||
| 2303 | 2312 |
XmpKey::AutoPtr XmpKey::clone() const |
| 2304 | 2313 |
{
|
| 2305 | 2314 |
return AutoPtr(clone_()); |
| src/properties.hpp | ||
|---|---|---|
| 265 | 265 |
//@{
|
| 266 | 266 |
//! Assignment operator. |
| 267 | 267 |
XmpKey& operator=(const XmpKey& rhs); |
| 268 |
//! Comparison operator. |
|
| 269 |
bool operator<(const XmpKey& b) const; |
|
| 268 | 270 |
//@} |
| 269 | 271 | |
| 270 | 272 |
//! @name Accessors |
| src/xmp.cpp | ||
|---|---|---|
| 52 | 52 |
// ***************************************************************************** |
| 53 | 53 |
// local declarations |
| 54 | 54 |
namespace {
|
| 55 |
//! Unary predicate that matches an Xmpdatum by key |
|
| 56 |
class FindXmpdatum {
|
|
| 57 |
public: |
|
| 58 |
//! Constructor, initializes the object with key |
|
| 59 |
FindXmpdatum(const Exiv2::XmpKey& key) |
|
| 60 |
: key_(key.key()) {}
|
|
| 61 |
/*! |
|
| 62 |
@brief Returns true if prefix and property of the argument |
|
| 63 |
Xmpdatum are equal to that of the object. |
|
| 64 |
*/ |
|
| 65 |
bool operator()(const Exiv2::Xmpdatum& xmpdatum) const |
|
| 66 |
{ return key_ == xmpdatum.key(); }
|
|
| 67 | ||
| 68 |
private: |
|
| 69 |
std::string key_; |
|
| 70 | ||
| 71 |
}; // class FindXmpdatum |
|
| 72 | 55 | |
| 73 | 56 |
#ifdef EXV_HAVE_XMP_TOOLKIT |
| 74 | 57 |
//! Convert XMP Toolkit struct option bit to Value::XmpStruct |
| ... | ... | |
| 181 | 164 |
delete p_; |
| 182 | 165 |
} |
| 183 | 166 | |
| 167 |
const XmpKey& Xmpdatum::xmpKey() const |
|
| 168 |
{
|
|
| 169 |
if (p_->key_.get() == 0) throw Error(8); |
|
| 170 |
return *p_->key_; |
|
| 171 |
} |
|
| 172 | ||
| 184 | 173 |
std::string Xmpdatum::key() const |
| 185 | 174 |
{
|
| 186 | 175 |
return p_->key_.get() == 0 ? "" : p_->key_->key(); |
| ... | ... | |
| 315 | 304 | |
| 316 | 305 |
Xmpdatum& XmpData::operator[](const std::string& key) |
| 317 | 306 |
{
|
| 318 |
XmpKey xmpKey(key); |
|
| 319 |
iterator pos = findKey(xmpKey); |
|
| 320 |
if (pos == end()) {
|
|
| 321 |
add(Xmpdatum(xmpKey)); |
|
| 322 |
pos = findKey(xmpKey); |
|
| 307 |
XmpKey k = XmpKey(key); |
|
| 308 |
XmpMetadata::iterator it = xmpMetadata_.find(k); |
|
| 309 |
if (it != xmpMetadata_.end()) {
|
|
| 310 |
return it->second; |
|
| 323 | 311 |
} |
| 324 |
return *pos; |
|
| 312 | ||
| 313 |
add(Xmpdatum(k)); |
|
| 314 |
return (*this)[key]; |
|
| 325 | 315 |
} |
| 326 | 316 | |
| 327 | 317 |
int XmpData::add(const XmpKey& key, const Value* value) |
| ... | ... | |
| 331 | 321 | |
| 332 | 322 |
int XmpData::add(const Xmpdatum& xmpDatum) |
| 333 | 323 |
{
|
| 334 |
xmpMetadata_.push_back(xmpDatum);
|
|
| 324 |
xmpMetadata_.insert(std::make_pair(xmpDatum.xmpKey(), xmpDatum));
|
|
| 335 | 325 |
return 0; |
| 336 | 326 |
} |
| 337 | 327 | |
| 338 | 328 |
XmpData::const_iterator XmpData::findKey(const XmpKey& key) const |
| 339 | 329 |
{
|
| 340 |
return std::find_if(xmpMetadata_.begin(), xmpMetadata_.end(), |
|
| 341 |
FindXmpdatum(key)); |
|
| 330 |
return xmpMetadata_.find(key); |
|
| 342 | 331 |
} |
| 343 | 332 | |
| 344 | 333 |
XmpData::iterator XmpData::findKey(const XmpKey& key) |
| 345 | 334 |
{
|
| 346 |
return std::find_if(xmpMetadata_.begin(), xmpMetadata_.end(), |
|
| 347 |
FindXmpdatum(key)); |
|
| 335 |
return xmpMetadata_.find(key); |
|
| 348 | 336 |
} |
| 349 | 337 | |
| 350 | 338 |
void XmpData::clear() |
| ... | ... | |
| 354 | 342 | |
| 355 | 343 |
void XmpData::sortByKey() |
| 356 | 344 |
{
|
| 357 |
std::sort(xmpMetadata_.begin(), xmpMetadata_.end(), cmpMetadataByKey);
|
|
| 345 |
return; // multimap is kept sorted by key
|
|
| 358 | 346 |
} |
| 359 | 347 | |
| 360 | 348 |
XmpData::const_iterator XmpData::begin() const |
| ... | ... | |
| 389 | 377 | |
| 390 | 378 |
XmpData::iterator XmpData::erase(XmpData::iterator pos) |
| 391 | 379 |
{
|
| 392 |
return xmpMetadata_.erase(pos); |
|
| 380 |
XmpData::iterator next = pos; |
|
| 381 |
next++; |
|
| 382 |
xmpMetadata_.erase(pos.it); |
|
| 383 |
return next; |
|
| 393 | 384 |
} |
| 394 | 385 | |
| 395 | 386 |
bool XmpParser::initialized_ = false; |
| src/xmp.hpp | ||
|---|---|---|
| 132 | 132 |
contain multiple metadata with the same key. |
| 133 | 133 |
*/ |
| 134 | 134 |
std::string key() const; |
| 135 |
const XmpKey& xmpKey() const; |
|
| 135 | 136 |
const char* familyName() const; |
| 136 | 137 |
//! Return the (preferred) schema namespace prefix. |
| 137 | 138 |
std::string groupName() const; |
| ... | ... | |
| 164 | 165 |
}; // class Xmpdatum |
| 165 | 166 | |
| 166 | 167 |
//! Container type to hold all metadata |
| 167 |
typedef std::vector<Xmpdatum> XmpMetadata;
|
|
| 168 |
typedef std::multimap<XmpKey, Xmpdatum> XmpMetadata;
|
|
| 168 | 169 | |
| 169 | 170 |
/*! |
| 170 | 171 |
@brief A container for XMP data. This is a top-level class of |
| ... | ... | |
| 179 | 180 |
class EXIV2API XmpData {
|
| 180 | 181 |
public: |
| 181 | 182 |
//! XmpMetadata iterator type |
| 182 |
typedef XmpMetadata::iterator iterator;
|
|
| 183 |
typedef map_value_iterator<XmpMetadata, XmpMetadata::iterator> iterator;
|
|
| 183 | 184 |
//! XmpMetadata const iterator type |
| 184 |
typedef XmpMetadata::const_iterator const_iterator;
|
|
| 185 |
typedef map_value_iterator<XmpMetadata, XmpMetadata::const_iterator, const typename XmpMetadata::const_iterator::value_type::second_type> const_iterator;
|
|
| 185 | 186 | |
| 186 | 187 |
//! @name Manipulators |
| 187 | 188 |
//@{
|
| ... | ... | |
| 215 | 216 |
iterator erase(iterator pos); |
| 216 | 217 |
//! Delete all Xmpdatum instances resulting in an empty container. |
| 217 | 218 |
void clear(); |
| 218 |
//! Sort metadata by key |
|
| 219 |
/*! |
|
| 220 |
@deprecated Xmp metadata is always kept sorted by key. |
|
| 221 |
This method is a no-op. |
|
| 222 |
*/ |
|
| 219 | 223 |
void sortByKey(); |
| 220 | 224 |
//! Begin of the metadata |
| 221 | 225 |
iterator begin(); |
| 222 |
- |
|