19#include <QtCore/QDate>
39 std::map<std::string,uint64_t> m_intValues;
40 std::map<std::string,std::string> m_stringValues;
41 std::map<std::string,QDate> m_dateValues;
42 std::map<std::string,std::pair<QDate,QDate> > m_dateIntervalValues;
44 std::map<std::string,std::vector<std::string> > m_multipleStringValues;
45 std::map<std::string,std::vector<std::pair<std::string,float> > > m_multipleWeightedPropValues;
47 QDate readDate(std::istream& file);
48 void writeDate(std::ostream& file,
const QDate& d)
const;
49 std::vector<std::string> m_noStringVal;
50 std::vector<std::pair<std::string,float> > m_noWeightedPropVal;
53GenericDocumentPropertiesPrivate::GenericDocumentPropertiesPrivate(){
56GenericDocumentPropertiesPrivate::GenericDocumentPropertiesPrivate(
const GenericDocumentPropertiesPrivate& p):
57m_intValues(p.m_intValues),
58m_stringValues(p.m_stringValues),
59m_dateValues(p.m_dateValues),
60m_dateIntervalValues(p.m_dateIntervalValues),
61m_multipleStringValues(p.m_multipleStringValues),
62m_multipleWeightedPropValues(p.m_multipleWeightedPropValues)
69GenericDocumentPropertiesPrivate::~GenericDocumentPropertiesPrivate() {
99 m_d->m_intValues=p.
m_d->m_intValues;
100 m_d->m_stringValues=p.
m_d->m_stringValues;
101 m_d->m_dateValues=p.
m_d->m_dateValues;
102 m_d->m_dateIntervalValues=p.
m_d->m_dateIntervalValues;
103 m_d->m_multipleStringValues=p.
m_d->m_multipleStringValues;
104 m_d->m_multipleWeightedPropValues=p.
m_d->m_multipleWeightedPropValues;
110 const std::string& str)
112 m_d->m_stringValues[propName]=str;
118 m_d->m_intValues[propName]=val;
124 m_d->m_dateValues[propName]=val;
128 const std::pair<QDate,QDate>& val)
130 m_d->m_dateIntervalValues[propName]=val;
135 const std::vector<std::string>& val)
137 m_d->m_multipleStringValues[propName]=val;
140 const std::vector<std::pair<std::string,float> >& val)
142 m_d->m_multipleWeightedPropValues[propName]=val;
148 auto pos =
m_d->m_intValues.find(propName);
149 if( pos ==
m_d->m_intValues.end() )
151 return( std::pair<uint64_t, bool>(0,
false) );
155 return( std::pair<uint64_t, bool>((*pos).second,
true) );
161 auto pos =
m_d->m_stringValues.find(propName);
162 if( pos ==
m_d->m_stringValues.end() )
164 return( std::pair<std::string, bool>(
"",
false) );
168 return( std::pair<std::string, bool>((*pos).second,
true) );
174 auto pos =
m_d->m_dateValues.find(propName);
175 if( pos ==
m_d->m_dateValues.end() )
177 return( std::pair<QDate, bool>(QDate(),
false) );
181 return( std::pair<QDate, bool>((*pos).second,
true) );
187 auto pos =
m_d->m_dateIntervalValues.find(propName);
188 if( pos ==
m_d->m_dateIntervalValues.end() )
190 std::pair<QDate,QDate> defaultInterval;
192 return( std::pair<std::pair<QDate,QDate>,
bool>(defaultInterval,
false) );
196 return( std::pair<std::pair<QDate,QDate>,
bool>((*pos).second,
true) );
201 std::string propName)
const
203 auto pos =
m_d->m_multipleStringValues.find(propName);
204 if( pos ==
m_d->m_multipleStringValues.end() )
206 return std::pair<StringPropMultIter, StringPropMultIter>(
m_d->m_noStringVal.begin(),
m_d->m_noStringVal.end());
210 const auto& val = (*pos).second;
211 return std::pair<StringPropMultIter, StringPropMultIter>(val.begin(),val.end());
216 std::string propName)
const
218 auto pos =
m_d->m_multipleWeightedPropValues.find(propName);
219 if( pos ==
m_d->m_multipleWeightedPropValues.end() )
221 return std::pair<WeightedPropMultIter, WeightedPropMultIter>(
m_d->m_noWeightedPropVal.begin(),
m_d->m_noWeightedPropVal.end());
225 const std::vector<std::pair<std::string,float> >& val = (*pos).second;
226 return std::pair<WeightedPropMultIter, WeightedPropMultIter>(val.begin(),val.end());
233 if (intProperties.first != intProperties.second)
return false;
236 if (stringProperties.first != stringProperties.second)
return false;
239 if (dateProperties.first != dateProperties.second)
return false;
242 if (dateIntervalProperties.first != dateIntervalProperties.second)
return false;
245 if (stringPropertyNames.first != stringPropertyNames.second)
return false;
248 if (weightedPropPropertyNames.first != weightedPropPropertyNames.second)
return false;
256 return std::make_pair(
m_d->m_intValues.begin(),
m_d->m_intValues.end());
262 return std::make_pair(
m_d->m_stringValues.begin(),
m_d->m_stringValues.end());
266 return std::make_pair(
m_d->m_dateValues.begin(),
m_d->m_dateValues.end());
270 return std::make_pair(
m_d->m_dateIntervalValues.begin(),
m_d->m_dateIntervalValues.end());
275 return std::make_pair(
280 std::pair<MultiValuedPropertyIterator<std::pair<std::string,float> >,
282 return std::make_pair(
288 const std::string& val)
290 std::map<std::string,std::vector<std::string> >::iterator pos =
m_d->m_multipleStringValues.find(propName);
291 if( pos ==
m_d->m_multipleStringValues.end() ) {
292 std::vector<std::string> values;
293 values.push_back(val);
294 m_d->m_multipleStringValues.insert(std::pair<std::string,std::vector<std::string> >(propName,values) );
297 std::vector<std::string>& values = (*pos).second;
298 auto iter = std::find(values.begin(), values.end(), val);
299 if (iter == values.end()){
300 values.push_back(val);
307bool mypredicate(
const std::pair<std::string,float>& a,
const std::pair<std::string,float>& b){
308 return a.first == b.first;
312 const std::pair<std::string,float>& val)
314 std::map<std::string,std::vector<std::pair<std::string,float> > >::iterator pos =
m_d->m_multipleWeightedPropValues.find(propName);
315 if( pos ==
m_d->m_multipleWeightedPropValues.end() ) {
316 std::vector<std::pair<std::string,float> > values;
317 values.push_back(val);
318 m_d->m_multipleWeightedPropValues.insert(std::pair<std::string,std::vector<std::pair<std::string,float> > >(propName,values) );
321 std::vector<std::pair<std::string,float> >& values = (*pos).second;
323 const std::pair<std::string,float> needle [1] = { val };
324 auto iter = std::search(values.begin(), values.end(), needle, needle+1,
mypredicate);
325 if (iter == values.end()){
326 values.push_back(val);
330 iter->second = val.second;
341 m_d->m_intValues.clear();
342 m_d->m_stringValues.clear();
343 m_d->m_dateValues.clear();
344 m_d->m_dateIntervalValues.clear();
345 m_d->m_multipleStringValues.clear();
346 m_d->m_multipleWeightedPropValues.clear();
353QDate GenericDocumentPropertiesPrivate::readDate(std::istream& file) {
356 file.read((
char*) &isADate,
sizeof(
bool));
358 unsigned short day(0);
359 unsigned short month(0);
360 unsigned short year(0);
361 file.read((
char*) &day,
sizeof(
unsigned short));
362 file.read((
char*) &month,
sizeof(
unsigned short));
363 file.read((
char*) &year,
sizeof(
unsigned short));
364 return QDate(year,month,day);
371void GenericDocumentPropertiesPrivate::writeDate(std::ostream& file,
372 const QDate& d)
const {
376 file.write((
char*) &isADate,
sizeof(
bool));
380 file.write((
char*) &isADate,
sizeof(
bool));
381 unsigned short day=d.day();
382 unsigned short month=d.month();
383 unsigned short year=d.year();
384 file.write((
char*) &day,
sizeof(
unsigned short));
385 file.write((
char*) &month,
sizeof(
unsigned short));
386 file.write((
char*) &year,
sizeof(
unsigned short));
394 m_d->m_intValues.clear();
395 m_d->m_stringValues.clear();
396 m_d->m_dateValues.clear();
397 m_d->m_dateIntervalValues.clear();
398 m_d->m_multipleStringValues.clear();
399 m_d->m_multipleWeightedPropValues.clear();
403 LDEBUG <<
"GenericDocumentProperties::read()";
406 file.read((
char*) &size,
sizeof(uint32_t));
408 LDEBUG <<
"read" << size <<
"int properties";
410 for (uint32_t i(0); i<size; i++) {
414 file.read((
char*) &val,
sizeof(uint64_t));
416 LDEBUG <<
"read int '" << val <<
"' as value of " << name.c_str();
418 m_d->m_intValues.insert(std::pair<std::string,uint64_t>(name,val));
422 file.read((
char*) &size,
sizeof(uint32_t));
424 LDEBUG <<
"read" << size <<
"string properties";
426 for (uint32_t i(0); i<size; i++) {
432 LDEBUG <<
"read string '" << str.c_str() <<
"' as value of " << name.c_str();
434 m_d->m_stringValues.insert(std::pair<std::string,std::string>(name,str) );
438 file.read((
char*) &size,
sizeof(uint32_t));
440 LDEBUG <<
"read" << size <<
"date properties";
442 for (uint32_t i(0); i<size; i++) {
445 QDate d=
m_d->readDate(file);
446 string strDate=d.toString().toUtf8().data();
448 LDEBUG <<
"read date '" << strDate.c_str() <<
"' as value of " << name.c_str();
450 m_d->m_dateValues.insert(std::pair<std::string,QDate>(name,d));
454 file.read((
char*) &size,
sizeof(uint32_t));
456 LDEBUG <<
"read" << size <<
"date-interval properties";
458 for (uint32_t i(0); i<size; i++) {
461 QDate startD=
m_d->readDate(file);
462 QDate endD=
m_d->readDate(file);
463 string strStartDate=startD.toString().toUtf8().data();
464 string strEndDate=endD.toString().toUtf8().data();
466 LDEBUG <<
"read date-interval [" << strStartDate.c_str() <<
"," << strEndDate.c_str() <<
"] as value of " << name.c_str();
468 std::pair<QDate,QDate> interval(startD,endD);
469 m_d->m_dateIntervalValues.insert(std::pair<std::string,std::pair<QDate,QDate> >(name,interval));
473 file.read((
char*) &size,
sizeof(uint32_t));
475 LDEBUG <<
"read" << size <<
"multi-valued properties";
477 for (uint32_t i(0); i<size; i++) {
480 uint32_t sizeMultipleValues(0);
481 file.read((
char*) &sizeMultipleValues,
sizeof(uint32_t));
483 for (uint32_t j(0); j<sizeMultipleValues; j++) {
487 LDEBUG <<
"read string '" << str.c_str() <<
"' as "<<j<<
"/"<<sizeMultipleValues<<
" value of" << name.c_str();
491 m_d->m_multipleStringValues.insert(std::pair<std::string,std::vector<std::string> >(name,val) );
495 file.read((
char*) &size,
sizeof(uint32_t));
497 for (uint32_t i(0); i<size; i++) {
500 uint32_t sizeMultipleValues(0);
501 file.read((
char*) &sizeMultipleValues,
sizeof(uint32_t));
502 vector<std::pair<std::string,float> > val;
503 for (uint32_t j(0); j<sizeMultipleValues; j++) {
507 file.read((
char*) &weight,
sizeof(
float));
508 val.push_back(std::pair<std::string,float>(str,weight) );
510 LDEBUG <<
"read weighted-string '" << str.c_str() <<
":"<<weight<<
"' as "<<j<<
"/"<<sizeMultipleValues<<
" value of" << name.c_str();
513 m_d->m_multipleWeightedPropValues.insert(std::pair<std::string,vector<std::pair<std::string,float> > > (name,val) );
517 LDEBUG <<
"end of properties";
522 std::map <std::string, uint64_t >::size_type size(0);
526 LDEBUG <<
"GenericDocumentProperties::write()";
530 size=
m_d->m_intValues.size();
532 LDEBUG <<
"write" << size <<
"int properties";
534 file.write((
char*) &size,
sizeof(uint32_t));
535 for (std::map<std::string,uint64_t>::const_iterator it =
m_d->m_intValues.begin() ;
536 it !=
m_d->m_intValues.end() ; it++) {
539 LDEBUG <<
"write int name" << (*it).first.c_str() <<
"value" << (*it).second;
541 file.write((
char*) &((*it).second),
sizeof(uint64_t));
546 size=
m_d->m_stringValues.size();
548 LDEBUG <<
"write" << size <<
"string properties";
550 file.write((
char*) &size,
sizeof(uint32_t));
551 for (std::map<std::string,std::string>::const_iterator it =
m_d->m_stringValues.begin() ;
552 it !=
m_d->m_stringValues.end() ; it++) {
555 LDEBUG <<
"write string name" << (*it).first.c_str() <<
"value" << (*it).second;
562 size=
m_d->m_dateValues.size();
564 LDEBUG <<
"write" << size <<
"date properties";
566 file.write((
char*) &size,
sizeof(uint32_t));
567 for (std::map<std::string,QDate>::const_iterator it =
m_d->m_dateValues.begin() ;
568 it !=
m_d->m_dateValues.end() ; it++) {
572 LDEBUG <<
"write date name" << (*it).first.c_str() <<
"value" << (*it).second;
574 m_d->writeDate(file,(*it).second);
579 size=
m_d->m_dateIntervalValues.size();
581 LDEBUG <<
"write" << size <<
"date-interval properties";
583 file.write((
char*) &size,
sizeof(uint32_t));
584 for (std::map<std::string,std::pair<QDate,QDate> >::const_iterator it
585 =
m_d->m_dateIntervalValues.begin() ; it !=
m_d->m_dateIntervalValues.end() ; it++) {
586 const std::pair<std::string,std::pair<QDate,QDate> >&val=*it;
591 LDEBUG <<
"write date-interval name [" << (val.second).first <<
"," << (val.second).second <<
"]";
593 m_d->writeDate(file,(val.second).first);
594 m_d->writeDate(file,(val.second).second);
598 size=
m_d->m_multipleStringValues.size();
600 LDEBUG <<
"write" << size <<
"multi-valued properties";
602 file.write((
char*) &size,
sizeof(uint32_t));
603 for (std::map<std::string,std::vector<std::string> >::const_iterator it =
m_d->m_multipleStringValues.begin() ;
604 it !=
m_d->m_multipleStringValues.end() ; it++) {
606 LDEBUG <<
"write multi-valued name" << (*it).first.c_str();;
609 const std::vector<std::string>& vval = (*it).second;
610 std::vector<std::string >::size_type sizeMultipleValues=vval.size();
611 file.write((
char*) &sizeMultipleValues,
sizeof(uint32_t));
612 for( std::vector<std::string>::const_iterator vit = vval.begin() ;
613 vit != vval.end() ; vit++ ) {
620 size=
m_d->m_multipleWeightedPropValues.size();
622 LDEBUG <<
"write" << size <<
"weighted multi-valued properties";
624 file.write((
char*) &size,
sizeof(uint32_t));
625 for (std::map<std::string,std::vector<std::pair<std::string,float> > >::const_iterator it =
626 m_d->m_multipleWeightedPropValues.begin() ;
627 it !=
m_d->m_multipleWeightedPropValues.end() ; it++) {
630 const std::vector<std::pair<std::string,float> >& vval = (*it).second;
631 std::vector<std::pair <std::string, float > >::size_type sizeMultipleValues=vval.size();
632 file.write((
char*) &sizeMultipleValues,
sizeof(uint32_t));
633 for( std::vector<std::pair<std::string,float> >::const_iterator vit = vval.begin() ;
634 vit != vval.end() ; vit++ ) {
636 file.write((
char*) &((*vit).second),
sizeof(
float));
641 LDEBUG <<
"end of properties";
666 for (std::map<std::string, uint64_t>::const_iterator it =
667 m_d->m_intValues.begin (); it !=
m_d->m_intValues.end (); it++)
669 os << (*it).first <<
"=" << (*it).second;
670 if(it !=
m_d->m_intValues.end ()) os <<
";";
673 for (std::map<std::string, std::string>::const_iterator it =
674 m_d->m_stringValues.begin (); it !=
m_d->m_stringValues.end ();
677 os << (*it).first <<
"=" << (*it).second;
678 if(it !=
m_d->m_stringValues.end ()) os <<
";";
681 for (std::map<std::string, QDate>::const_iterator it =
682 m_d->m_dateValues.begin (); it !=
m_d->m_dateValues.end (); it++)
684 os << (*it).first <<
"="
685 << (*it).second.toString (Qt::ISODate).toStdString();
686 if(it !=
m_d->m_dateValues.end ()) os <<
";";
689 for (std::map<std::string, std::pair<QDate, QDate> >::const_iterator it =
690 m_d->m_dateIntervalValues.begin ();
691 it !=
m_d->m_dateIntervalValues.end (); it++)
693 os << (*it).first <<
"=["
694 << ((*it).second).first.toString (Qt::ISODate).toStdString() <<
","
695 << ((*it).second).second.toString(Qt::ISODate).toStdString() <<
"]";
696 if(it !=
m_d->m_dateIntervalValues.end ()) os <<
";";
699 for (std::map<std::string, std::vector<std::string> >::const_iterator it =
700 m_d->m_multipleStringValues.begin ();
701 it !=
m_d->m_multipleStringValues.end (); it++)
703 os << (*it).first <<
"=[";
704 const std::vector<std::string>& vval = (*it).second;
707 std::vector<std::string>::const_iterator vit = vval.begin();
710 for (; vit != vval.end (); vit++)
716 if(it !=
m_d->m_multipleStringValues.end ()) os <<
";";
719 for (std::map<std::string, std::vector<std::pair<std::string, float> > >::const_iterator it =
720 m_d->m_multipleWeightedPropValues.begin ();
721 it !=
m_d->m_multipleWeightedPropValues.end (); it++)
723 os << (*it).first <<
"=";
724 const std::vector<std::pair<std::string, float> >& vval =
728 std::vector<std::pair<std::string, float> >::const_iterator vit =
730 os <<
"(" << (*vit).first <<
"," << (*vit).second <<
")";
732 for (; vit != vval.end (); vit++)
734 os <<
", (" << (*vit).first <<
"," << (*vit).second <<
")";
737 if(it !=
m_d->m_multipleWeightedPropValues.end ()) os <<
";";
743 std::ostringstream oss;
745 qts << QString::fromStdString(oss.str());
751 std::ostringstream oss;
753 qts << QString::fromStdString(oss.str());
std::pair< uint64_t, bool > getIntValue(std::string propName) const
Read access functions for "only once valued" property propName.
std::pair< QDate, bool > getDateValue(std::string propName) const
std::pair< DateIntervalPropertiesIterator, DateIntervalPropertiesIterator > getDateIntervalProperties() const
virtual void read(std::istream &file)
std::pair< StringPropMultIter, StringPropMultIter > getMultipleStringPropValue(std::string propName) const
Read access functions for "multiple-valued" property propName Return a pair of iterator (begin,...
virtual bool is_empty() const
void addWeightedPropValue(const std::string &propName, const std::pair< std::string, float > &str)
std::pair< DatePropertiesIterator, DatePropertiesIterator > getDateProperties() const
std::pair< MultiValuedPropertyIterator< std::pair< std::string, float > >, MultiValuedPropertyIterator< std::pair< std::string, float > > > getWeightedPropPropertyNames() const
std::pair< MultiValuedPropertyIterator< std::string >, MultiValuedPropertyIterator< std::string > > getStringPropertyNames() const
Read access functions for all "multiple valued" properties return an iterator of names Types may be a...
std::pair< IntPropertiesIterator, IntPropertiesIterator > getIntProperties() const
GenericDocumentProperties()
std::pair< std::pair< QDate, QDate >, bool > getDateIntervalValue(std::string propName) const
std::pair< std::string, bool > getStringValue(std::string propName) const
GenericDocumentPropertiesPrivate * m_d
void setStringValue(const std::string &propName, const std::string &val)
std::map< std::string, std::string >::const_iterator StringPropertiesIterator
virtual void print(std::ostream &) const
void write(std::ostream &file) const
void addStringValue(const std::string &propName, const std::string &str)
void setDateIntervalValue(const std::string &propName, const std::pair< QDate, QDate > &val)
void setMultipleStringPropValue(const std::string &propName, const std::vector< std::string > &val)
GenericDocumentProperties & operator=(const GenericDocumentProperties &)
virtual ~GenericDocumentProperties()
void setDateValue(const std::string &propName, const QDate &val)
void setMultipleWeightedPropValue(const std::string &propName, const std::vector< std::pair< std::string, float > > &val)
std::pair< StringPropertiesIterator, StringPropertiesIterator > getStringProperties() const
std::pair< WeightedPropMultIter, WeightedPropMultIter > getMultipleWeightedPropValue(std::string propName) const
void setIntValue(const std::string &propName, const uint64_t &val)
std::map< std::string, uint64_t >::const_iterator IntPropertiesIterator
Read access functions for all "only once valued" properties return an iterator Types may be any of (u...
Holds document properties.
void readStringField(istream &file, string &s)
void writeStringField(ostream &file, const string &s)
std::ostream & operator<<(std::ostream &os, const GenericDocumentProperties &p)
bool mypredicate(const std::pair< std::string, float > &a, const std::pair< std::string, float > &b)