// Copyright (C) 2016 Jochen Becher // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #pragma once #include "tag.h" #include "baseclass.h" #include "attribute.h" #include "reference.h" #include "access.h" #include "typeregistry.h" #include "serialize_pointer.h" #include "serialize_basic.h" #include "serialize_container.h" #include "serialize_enum.h" #include // qark is (Q)t(Ar)chiving(K)it namespace qark { template inline Archive &operator<<(Archive &archive, const T &t) { save(archive, t, Parameters()); return archive; } template inline Archive &operator>>(Archive &archive, T &t) { load(archive, t, Parameters()); return archive; } template typename std::enable_if::type operator||(Archive &archive, T &t) { return archive << t; } template typename std::enable_if::type operator||(Archive &archive, T &t) { return archive >> t; } template inline Archive &operator<<(Archive &archive, T (*f)()) { archive << f(); return archive; } template inline Archive &operator>>(Archive &archive, T (*f)()) { archive >> f(); return archive; } template typename std::enable_if::type operator||(Archive &archive, T (*f)()) { return archive << f; } template typename std::enable_if::type operator||(Archive &archive, T (*f)()) { return archive >> f; } template inline Archive &operator<<(Archive &archive, const Tag &tag) { archive.beginElement(tag); return archive; } template inline Archive &operator>>(Archive &archive, const Tag &tag) { archive.append(tag); return archive; } template typename std::enable_if::type operator||( Archive &archive, const Tag &tag) { return archive << tag; } template typename std::enable_if::type operator||( Archive &archive, const Tag &tag) { return archive >> tag; } template inline Archive &operator<<(Archive &archive, const Object &object) { archive.beginElement(object); return archive; } template inline Archive &operator>>(Archive &archive, const Object &object) { archive.append(object); return archive; } template typename std::enable_if::type operator||( Archive &archive, const Object &object) { return archive << object; } template typename std::enable_if::type operator||( Archive &archive, const Object &object) { return archive >> object; } template inline Archive &operator<<(Archive &archive, const End &end) { archive.endElement(end); return archive; } template inline Archive &operator>>(Archive &archive, const End &end) { archive.append(end); return archive; } template typename std::enable_if::type operator||( Archive &archive, const End &end) { return archive << end; } template typename std::enable_if::type operator||( Archive &archive, const End &end) { return archive >> end; } template Archive &operator<<(Archive &archive, const Base &base) { archive.beginBase(base); archive << base.base(); archive.endBase(base); return archive; } template Archive &operator>>(Archive &archive, const Base &base) { archive.append(base); return archive; } template typename std::enable_if::type operator||( Archive &archive, const Base &base) { return archive << base; } template typename std::enable_if::type operator||( Archive &archive, const Base &base) { return archive >> base; } template Archive &operator<<(Archive &archive, const Attr &attr) { archive.beginAttribute(attr); save(archive, *attr.value(), attr.parameters()); archive.endAttribute(attr); return archive; } template Archive &operator>>(Archive &archive, const Attr &attr) { archive.append(attr); return archive; } template typename std::enable_if::type operator||( Archive &archive, const Attr &attr) { return archive << attr; } template typename std::enable_if::type operator||( Archive &archive, const Attr &attr) { return archive >> attr; } template typename std::enable_if::value, Archive &>::type operator<<(Archive &archive, const GetterAttr &attr) { if (!((attr.object().*(attr.getter()))() == (U().*(attr.getter()))())) { archive.beginAttribute(attr); save(archive, (attr.object().*(attr.getter()))(), attr.parameters()); archive.endAttribute(attr); } return archive; } template typename std::enable_if::value, Archive &>::type operator<<(Archive &archive, const GetterAttr &attr) { archive.beginAttribute(attr); save(archive, (attr.object().*(attr.getter()))(), attr.parameters()); archive.endAttribute(attr); return archive; } template Archive &operator>>(Archive &archive, const SetterAttr &attr) { archive.append(attr); return archive; } // TODO find possibility to avoid error message if T does not have an operator== template typename std::enable_if::value, Archive &>::type operator<<(Archive &archive, const GetterSetterAttr &attr) { if (!((attr.object().*(attr.getter()))() == (U().*(attr.getter()))())) { archive.beginAttribute(attr); save(archive, (attr.object().*(attr.getter()))(), attr.parameters()); archive.endAttribute(attr); } return archive; } // TODO Check for default values, e.g. using T() template typename std::enable_if::value, Archive &>::type operator<<(Archive &archive, const GetterSetterAttr &attr) { archive.beginAttribute(attr); save(archive, (attr.object().*(attr.getter()))(), attr.parameters()); archive.endAttribute(attr); return archive; } template Archive &operator>>(Archive &archive, const GetterSetterAttr &attr) { archive.append(attr); return archive; } template typename std::enable_if::type operator||( Archive &archive, const GetterSetterAttr &attr) { return archive << attr; } template typename std::enable_if::type operator||( Archive &archive, const GetterSetterAttr &attr) { return archive >> attr; } template Archive &operator<<(Archive &archive, const GetFuncAttr &attr) { archive.beginAttribute(attr); save(archive, ((*attr.getterFunc())(attr.object())), attr.parameters()); archive.endAttribute(attr); return archive; } template Archive &operator>>(Archive &archive, const SetFuncAttr &attr) { archive.append(attr); return archive; } template Archive &operator<<(Archive &archive, const GetSetFuncAttr &attr) { archive.beginAttribute(attr); save(archive, ((*attr.getterFunc())(attr.object())), attr.parameters()); archive.endAttribute(attr); return archive; } template Archive &operator>>(Archive &archive, const GetSetFuncAttr &attr) { archive.append(attr); return archive; } template typename std::enable_if::type operator||( Archive &archive, const GetSetFuncAttr &attr) { return archive << attr; } template typename std::enable_if::type operator||( Archive &archive, const GetSetFuncAttr &attr) { return archive >> attr; } template Archive &operator<<(Archive &archive, const Ref &ref) { archive.beginReference(ref); save(archive, *ref.value(), ref.parameters()); archive.endReference(ref); return archive; } template Archive &operator<<(Archive &archive, const Ref &ref) { archive.beginReference(ref); save(archive, *ref.value(), ref.parameters()); archive.endReference(ref); return archive; } template Archive &operator>>(Archive &archive, const Ref &ref) { archive.append(ref); return archive; } template typename std::enable_if::type operator||( Archive &archive, const Ref &ref) { archive.beginReference(ref); save(archive, *ref.value(), ref.parameters()); archive.endReference(ref); return archive; } template typename std::enable_if::type operator||( Archive &archive, const Ref &ref) { return archive >> ref; } template Archive &operator<<(Archive &archive, const GetterRef &ref) { archive.beginReference(ref); save(archive, (ref.object().*(ref.getter()))(), ref.parameters()); archive.endReference(ref); return archive; } template Archive &operator>>(Archive &archive, const SetterRef &ref) { archive.append(ref); return archive; } template Archive &operator<<(Archive &archive, const GetterSetterRef &ref) { archive.beginReference(ref); save(archive, (ref.object().*(ref.getter()))(), ref.parameters()); archive.endReference(ref); return archive; } template Archive &operator>>(Archive &archive, const GetterSetterRef &ref) { archive.append(ref); return archive; } template typename std::enable_if::type operator||( Archive &archive, const GetterSetterRef &ref) { return archive << ref; } template typename std::enable_if::type operator||( Archive &archive, const GetterSetterRef &ref) { return archive >> ref; } template Archive &operator<<(Archive &archive, const GetFuncRef &ref) { archive.beginReference(ref); save(archive, ref.getterFunc()(ref.object()), ref.parameters()); archive.endReference(ref); return archive; } template Archive &operator>>(Archive &archive, const SetFuncRef &ref) { archive.append(ref); return archive; } template Archive &operator<<(Archive &archive, const GetSetFuncRef &ref) { archive.beginReference(ref); save(archive, ref.getterFunc()(ref.object()), ref.parameters()); archive.endReference(ref); return archive; } template Archive &operator>>(Archive &archive, const GetSetFuncRef &ref) { archive.append(ref); return archive; } template typename std::enable_if::type operator||( Archive &archive, const GetSetFuncRef &ref) { return archive << ref; } template typename std::enable_if::type operator||( Archive &archive, const GetSetFuncRef &ref) { return archive >> ref; } } // namespace qark