10#include <QtCore/QDateTime>
11#include <QtCore/QPointF>
12#include <QtCore/QMetaObject>
13#include <QtCore/QMetaEnum>
67 template <
typename ValueType>
73 template <
int Dimensions>
91 QStringList& stringList,
92 const QByteArray& containerTagName =
"Elements",
93 const QByteArray& elementTagName =
"Element");
95 template <
typename Conta
interType>
98 ContainterType& container,
99 const QByteArray& containerTagName =
"Elements",
100 const QByteArray& elementTagName =
"Element");
102 template <
typename Conta
interType>
105 ContainterType& container,
106 const QByteArray& containerTagName =
"Elements",
107 const QByteArray& elementTagName =
"Element");
115 template <
typename EnumType, QByteArray (*ToString)(EnumType),
bool (*FromString)(const QByteArray&, EnumType&)>
118 EnumType& enumValue);
123 template <
typename EnumType>
126 EnumType& enumValue);
131 template <
typename ContainerType,
typename KeyType>
134 ContainerType& container,
136 const QByteArray& containerTagName,
137 const QByteArray& elementTagName =
"Element",
138 const QByteArray& keyTagId =
"Key",
139 const QByteArray& valueTagId =
"Value",
140 const QByteArray& containerComment =
"List of elements");
142 template <
typename ContainerType,
typename KeyType>
145 ContainerType& container,
147 const QByteArray& containerTagName,
148 const QByteArray& elementTagName =
"Element",
149 const QByteArray& keyTagId =
"Key",
150 const QByteArray& valueTagId =
"Value",
151 const QByteArray& containerComment =
"List of elements");
153 template <
typename ObjectType>
156 std::unique_ptr<ObjectType>& objectPtrRef,
157 const QByteArray& tagName);
159 template <
typename ObjectInterface>
162 std::unique_ptr<ObjectInterface>& objectPtrRef,
164 const QByteArray& tagName);
169template <
typename ValueType>
177 retVal = retVal && archive.
BeginTag(minValueTag);
179 retVal = retVal && archive.
EndTag(minValueTag);
181 retVal = retVal && archive.
BeginTag(maxValueTag);
183 retVal = retVal && archive.
EndTag(maxValueTag);
188template <
int Dimensions>
193 for (
int i = 0; i < Dimensions; ++i){
194 retVal = retVal && archive.
Process(index[i]);
201template <
typename ContainerType>
204 ContainerType& container,
205 const QByteArray& containerTagName,
206 const QByteArray& elementTagName)
214 int elementsCount = container.count();
216 retVal = retVal && archive.
BeginMultiTag(elementsTag, elementTag, elementsCount);
222 for (
int i = 0; i < elementsCount; ++i){
223 typename ContainerType::value_type element = container[i];
225 retVal = retVal && archive.
BeginTag(elementTag);
226 retVal = retVal && archive.
Process(element);
227 retVal = retVal && archive.
EndTag(elementTag);
233 for (
int i = 0; i < elementsCount; ++i){
234 typename ContainerType::value_type element =
typename ContainerType::value_type();
236 retVal = retVal && archive.
BeginTag(elementTag);
237 retVal = retVal && archive.
Process(element);
238 retVal = retVal && archive.
EndTag(elementTag);
241 container.push_back(element);
246 retVal = retVal && archive.
EndTag(elementsTag);
252template <
typename ContainerType>
255 ContainerType& container,
256 const QByteArray& containerTagName,
257 const QByteArray& elementTagName)
265 int elementsCount = container.count();
267 retVal = retVal && archive.
BeginMultiTag(elementsTag, elementTag, elementsCount);
273 for (
int i = 0; i < elementsCount; ++i){
274 typename ContainerType::value_type element = container[i];
276 retVal = retVal && archive.
BeginTag(elementTag);
277 retVal = retVal && element.Serialize(archive);
278 retVal = retVal && archive.
EndTag(elementTag);
284 for (
int i = 0; i < elementsCount; ++i){
285 typename ContainerType::value_type element =
typename ContainerType::value_type();
287 retVal = retVal && archive.
BeginTag(elementTag);
288 retVal = retVal && element.Serialize(archive);
289 retVal = retVal && archive.
EndTag(elementTag);
292 container.push_back(element);
297 retVal = retVal && archive.
EndTag(elementsTag);
303template <
typename EnumType, QByteArray (*ToString)(EnumType),
bool (*FromString)(const QByteArray&, EnumType&)>
308 QByteArray enumValueAsText;
313 if (enumValueAsText.isEmpty() && (ToString !=
NULL)){
314 enumValueAsText = ToString(enumValue);
318 if (!enumValueAsText.isEmpty()){
319 retVal = retVal && archive.
Process(enumValueAsText);
322 if (FromString !=
NULL){
323 retVal = FromString(enumValueAsText, enumValue);
331 int value = enumValue;
333 retVal = retVal && archive.
Process(value);
337 enumValue = EnumType(value);
345template <
typename EnumType>
350 QByteArray enumValueAsText;
351 const auto metaEnum = QMetaEnum::fromType<EnumType>();
352 if (!metaEnum.isValid()){
356 enumValueAsText = metaEnum.valueToKey((
int)enumValue);
357 if (enumValueAsText.isEmpty()){
363 retVal = retVal && archive.
Process(enumValueAsText);
365 enumValue = EnumType(metaEnum.keyToValue(enumValueAsText.constData(), &retVal));
371template<
typename ContainerType,
typename KeyType>
374 ContainerType& container,
376 const QByteArray& containerTagName,
377 const QByteArray& elementTagName,
378 const QByteArray& keyTagId,
379 const QByteArray& valueTagId,
380 const QByteArray& containerComment)
390 int paramsCount = container.count();
392 retVal = retVal && archive.
BeginMultiTag(parametersTag, parameterTag, paramsCount);
394 for (
typename ContainerType::iterator iterator = container.begin(); iterator != container.end(); ++iterator){
395 retVal = retVal && archive.
BeginTag(parameterTag);
397 typename ContainerType::key_type key = iterator.key();
398 retVal = retVal && archive.
BeginTag(parameterKeyTag);
399 retVal = retVal && SerializeKeyFunction(archive, key);
400 retVal = retVal && archive.
EndTag(parameterKeyTag);
402 typename ContainerType::mapped_type value = iterator.value();
403 retVal = retVal && archive.
BeginTag(parameterValueTag);
404 retVal = retVal && archive.
Process(value);
405 retVal = retVal && archive.
EndTag(parameterValueTag);
407 retVal = retVal && archive.
EndTag(parameterTag);
410 retVal = retVal && archive.
EndTag(parametersTag);
416 retVal = retVal && archive.
BeginMultiTag(parametersTag, parameterTag, paramsCount);
422 for (
int i = 0; i < paramsCount; ++i){
423 retVal = retVal && archive.
BeginTag(parameterTag);
425 typename ContainerType::key_type key =
typename ContainerType::key_type();
426 retVal = retVal && archive.
BeginTag(parameterKeyTag);
427 retVal = retVal && SerializeKeyFunction(archive, key);
428 retVal = retVal && archive.
EndTag(parameterKeyTag);
433 typename ContainerType::mapped_type value;
434 retVal = retVal && archive.
BeginTag(parameterValueTag);
435 retVal = retVal && archive.
Process(value);
436 retVal = retVal && archive.
EndTag(parameterValueTag);
438 retVal = retVal && archive.
EndTag(parameterTag);
440 container.insert(key, value);
443 retVal = retVal && archive.
EndTag(parametersTag);
450template<
typename ContainerType,
typename KeyType>
453 ContainerType& container,
455 const QByteArray& containerTagName,
456 const QByteArray& elementTagName,
457 const QByteArray& keyTagId,
458 const QByteArray& valueTagId,
459 const QByteArray& containerComment)
469 int paramsCount = container.count();
471 retVal = retVal && archive.
BeginMultiTag(parametersTag, parameterTag, paramsCount);
473 for (
typename ContainerType::iterator iterator = container.begin(); iterator != container.end(); ++iterator){
474 retVal = retVal && archive.
BeginTag(parameterTag);
476 typename ContainerType::key_type key = iterator.key();
477 retVal = retVal && archive.
BeginTag(parameterKeyTag);
478 retVal = retVal && SerializeKeyFunction(archive, key);
479 retVal = retVal && archive.
EndTag(parameterKeyTag);
481 typename ContainerType::mapped_type value = iterator.value();
482 retVal = retVal && archive.
BeginTag(parameterValueTag);
483 retVal = retVal && value.Serialize(archive);
484 retVal = retVal && archive.
EndTag(parameterValueTag);
486 retVal = retVal && archive.
EndTag(parameterTag);
489 retVal = retVal && archive.
EndTag(parametersTag);
495 retVal = retVal && archive.
BeginMultiTag(parametersTag, parameterTag, paramsCount);
501 for (
int i = 0; i < paramsCount; ++i){
502 retVal = retVal && archive.
BeginTag(parameterTag);
504 typename ContainerType::key_type key =
typename ContainerType::key_type();
505 retVal = retVal && archive.
BeginTag(parameterKeyTag);
506 retVal = retVal && SerializeKeyFunction(archive, key);
507 retVal = retVal && archive.
EndTag(parameterKeyTag);
512 typename ContainerType::mapped_type value;
513 retVal = retVal && archive.
BeginTag(parameterValueTag);
514 retVal = retVal && value.Serialize(archive);
515 retVal = retVal && archive.
EndTag(parameterValueTag);
517 retVal = retVal && archive.
EndTag(parameterTag);
519 container.insert(key, value);
522 retVal = retVal && archive.
EndTag(parametersTag);
529#define I_SERIALIZE_FLAG(Enum, archive, flag) iser::CPrimitiveTypesSerializer::SerializeEnum<int, Enum##ToString, Enum##FromString>(archive, flag);
530#define I_SERIALIZE_ENUM(Enum, archive, enumValue) iser::CPrimitiveTypesSerializer::SerializeEnum<Enum, ToString, FromString>(archive, enumValue);
Process tag used to group data in archive stream.
@ TT_GROUP
Normal tag used for grouping of tags or processed elements.
@ TT_LEAF
Leaf tag, it can contain only one primitive element.
@ TT_MULTIPLE
Multiple tag containing variable number of child tags.
Implementation of serialize method for some common data types.
static bool SerializeContainer(iser::IArchive &archive, ContainterType &container, const QByteArray &containerTagName="Elements", const QByteArray &elementTagName="Element")
static bool SerializeIndex(iser::IArchive &archive, istd::TIndex< Dimensions > &index)
Serialize a generic index object.
static bool SerializeQStringList(iser::IArchive &archive, QStringList &stringList, const QByteArray &containerTagName="Elements", const QByteArray &elementTagName="Element")
Serialize a QStringList object.
static bool SerializeAssociativeContainer(iser::IArchive &archive, ContainerType &container, bool(*SerializeKeyFunction)(iser::IArchive &, KeyType &key), const QByteArray &containerTagName, const QByteArray &elementTagName="Element", const QByteArray &keyTagId="Key", const QByteArray &valueTagId="Value", const QByteArray &containerComment="List of elements")
This method can be used for serialization associatime containers i.e.: QHash, QMap std::map (since c+...
static bool SerializeQEnum(iser::IArchive &archive, EnumType &enumValue)
Method for serialization of the enumerated value using Qt's meta information system (Q_ENUM or Q_ENUM...
static bool SerializeOptionalObject(iser::IArchive &archive, std::unique_ptr< ObjectType > &objectPtrRef, const QByteArray &tagName)
static bool SerializeObjectContainer(iser::IArchive &archive, ContainterType &container, const QByteArray &containerTagName="Elements", const QByteArray &elementTagName="Element")
static bool SerializeDateTime(iser::IArchive &archive, QDateTime &dateTime)
Serialize QDateTime object.
static bool SerializeEnum(iser::IArchive &archive, EnumType &enumValue)
Method for serialization of the enumerated value using ACF's meta information extensions for the C++ ...
static bool SerializeRanges(iser::IArchive &archive, istd::CRanges &ranges)
Serialize list of range objects.
static bool SerializeIntRanges(iser::IArchive &archive, istd::CIntRanges &ranges)
Serialize list of integer-based ranges.
static bool SerializeQVariant(iser::IArchive &archive, QVariant &variant)
Serialize a QVariant object.
static bool SerializeQPointF(iser::IArchive &archive, QPointF &point)
Serialize a QPointF object.
static bool SerializeIntRange(iser::IArchive &archive, istd::CIntRange &range)
Serialize an integer-based range object.
static bool SerializeOptionalObject(iser::IArchive &archive, std::unique_ptr< ObjectInterface > &objectPtrRef, istd::TIFactory< ObjectInterface > &objectFactoryPtr, const QByteArray &tagName)
static bool SerializeAssociativeObjectContainer(iser::IArchive &archive, ContainerType &container, bool(*SerializeKeyFunction)(iser::IArchive &, KeyType &key), const QByteArray &containerTagName, const QByteArray &elementTagName="Element", const QByteArray &keyTagId="Key", const QByteArray &valueTagId="Value", const QByteArray &containerComment="List of elements")
static bool SerializeDate(iser::IArchive &archive, QDate &date)
Serialize QDate object.
static bool SerializeRange(iser::IArchive &archive, istd::CRange &range)
Serialize a range object.
Represents an input/output persistence archive for object serialization.
virtual bool Process(bool &value)=0
Processes (reads or writes) a boolean value.
virtual bool EndTag(const CArchiveTag &tag)=0
Ends a tagged section in the archive.
virtual bool BeginMultiTag(const CArchiveTag &tag, const CArchiveTag &subTag, int &count)=0
Begins a tagged section containing multiple elements of the same type.
virtual bool IsStoring() const =0
Checks if this archive is in storing (writing) or loading (reading) mode.
virtual bool BeginTag(const CArchiveTag &tag)=0
Begins a tagged section in the archive.
Generic interface for a factory.
Multidimensional index used to addressing fixed-size array.
ValueType & GetMinValueRef()
Get reference to the bottom value.
ValueType & GetMaxValueRef()
Get reference to the top value.
Contains general persistence mechanism with basic archives implementations.
TRanges< double > CRanges
TRanges< int > CIntRanges