13#include <QtCore/QDateTime>
14#include <QtCore/QPointF>
15#include <QtCore/QMetaObject>
16#include <QtCore/QMetaEnum>
69 template <
int Dimensions>
87 template <
typename Conta
interType>
90 ContainterType& container,
103 template <
typename Conta
interType>
106 ContainterType& container,
116 template <
typename EnumType, QByteArray (*ToString)(EnumType),
bool (*FromString)(const QByteArray&, EnumType&)>
119 EnumType& enumValue);
126 template <
typename EnumType>
130 const QObject* objectPtr);
136template <
int Dimensions>
141 for (
int i = 0; i < Dimensions; ++i){
142 retVal = retVal && archive.
Process(index[i]);
149template <
typename ContainerType>
152 ContainerType& container,
158 int elementsCount = container.count();
160 retVal = retVal && archive.
BeginMultiTag(elementsTag, elementTag, elementsCount);
168 for (
int i = 0; i < elementsCount; ++i) {
169 typename ContainerType::value_type element;
170 retVal = retVal && archive.
BeginTag(elementTag);
171 retVal = retVal && archive.
Process(element);
172 retVal = retVal && archive.
EndTag(elementTag);
175 container.push_back(element);
180 for (
int i = 0; i < elementsCount; ++i) {
181 typename ContainerType::value_type element = container[i];
183 retVal = retVal && archive.
BeginTag(elementTag);
184 retVal = retVal && archive.
Process(element);
185 retVal = retVal && archive.
EndTag(elementTag);
189 retVal = retVal && archive.
EndTag(elementsTag);
195template <
typename ContainerType>
198 ContainerType& container,
204 int elementsCount = container.count();
206 retVal = retVal && archive.
BeginMultiTag(elementsTag, elementTag, elementsCount);
214 for (
int i = 0; i < elementsCount; ++i) {
215 typename ContainerType::value_type element;
216 retVal = retVal && archive.
BeginTag(elementTag);
217 retVal = retVal && element.Serialize(archive);
218 retVal = retVal && archive.
EndTag(elementTag);
221 container.push_back(element);
226 for (
int i = 0; i < elementsCount; ++i) {
227 typename ContainerType::value_type element = container[i];
229 retVal = retVal && archive.
BeginTag(elementTag);
230 retVal = retVal && element.Serialize(archive);
231 retVal = retVal && archive.
EndTag(elementTag);
235 retVal = retVal && archive.
EndTag(elementsTag);
241template <
typename EnumType, QByteArray (*ToString)(EnumType),
bool (*FromString)(const QByteArray&, EnumType&)>
246 QByteArray enumValueAsText;
251 if (enumValueAsText.isEmpty() && (ToString !=
nullptr)){
252 enumValueAsText = ToString(enumValue);
256 if (!enumValueAsText.isEmpty()){
257 retVal = retVal && archive.
Process(enumValueAsText);
260 if (FromString !=
nullptr){
261 retVal = FromString(enumValueAsText, enumValue);
269 int value = enumValue;
271 retVal = retVal && archive.
Process(value);
275 enumValue = EnumType(value);
283template <
typename EnumType>
287 const QObject* objectPtr)
289 QByteArray enumValueAsText;
290 QMetaEnum foundEnumMeta;
292 QString enumTypeName =
typeid(EnumType).name();
293 enumTypeName = enumTypeName.mid(enumTypeName.lastIndexOf(
":") + 1);
295 if (objectPtr !=
nullptr){
296 const QMetaObject* metaObjectPtr = objectPtr->metaObject();
299 int enumeratorsCount = metaObjectPtr->enumeratorCount();
300 for (
int enumeratorIndex = 0; enumeratorIndex < enumeratorsCount; ++enumeratorIndex){
301 QMetaEnum enumMeta = metaObjectPtr->enumerator(enumeratorIndex);
302 QString enumName = enumMeta.name();
304 if (enumTypeName == enumName){
305 foundEnumMeta = enumMeta;
308 int keysCount = enumMeta.keyCount();
309 for (
int keyIndex = 0; keyIndex < keysCount; ++keyIndex){
311 if (enumMeta.value(keyIndex) == enumValue){
312 enumValueAsText = enumMeta.valueToKey(keyIndex);
323 if (!enumValueAsText.isEmpty()){
324 retVal = retVal && archive.
Process(enumValueAsText);
327 Q_ASSERT(foundEnumMeta.isValid());
329 enumValue = EnumType(foundEnumMeta.keyToValue(enumValueAsText.constData(), &retVal));
333 int value = enumValue;
335 retVal = retVal && archive.
Process(value);
339 enumValue = EnumType(value);
347#define I_SERIALIZE_FLAG(Enum, archive, flag) iser::CPrimitiveTypesSerializer::SerializeEnum<int, Enum##ToString, Enum##FromString>(archive, flag);
348#define I_SERIALIZE_ENUM(Enum, archive, enumValue) iser::CPrimitiveTypesSerializer::SerializeEnum<Enum, ToString, FromString>(archive, enumValue);
Process tag used to group data in archive stream.
Implementation of serialize method for some common data types.
static bool SerializeIndex(iser::IArchive &archive, istd::TIndex< Dimensions > &index)
Serialize a generic index object.
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 ICF's meta information extensions for the C++ ...
static bool SerializeSimpleContainer(iser::IArchive &archive, ContainterType &container, const iser::CArchiveTag &elementsTag, const iser::CArchiveTag &elementTag)
Serialize container of simple types.
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 SerializeContainer(iser::IArchive &archive, ContainterType &container, const iser::CArchiveTag &elementsTag, const iser::CArchiveTag &elementTag)
Serialize container of serializable elements.
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 SerializeDate(iser::IArchive &archive, QDate &date)
Serialize QDate object.
static bool SerializeRange(iser::IArchive &archive, istd::CRange &range)
Serialize a range object.
Represent input/output persistence archive.
virtual bool Process(bool &value)=0
Process primitive type.
virtual bool EndTag(const CArchiveTag &tag)=0
End of archive tag.
virtual bool BeginMultiTag(const CArchiveTag &tag, const CArchiveTag &subTag, int &count)=0
Begin of archive tag containing set of subelements of the same type.
virtual bool IsChanging() const =0
Check if this archive processing change the object state.
virtual bool BeginTag(const CArchiveTag &tag)=0
Begin of archive tag.
Multidimensional index used to addressing fixed-size array.
Contains general persistence mechanism with basic archives implementations.