/**************************************************************************** ** ** Copyright (C) 2016 Jochen Becher ** Contact: https://www.qt.io/licensing/ ** ** This file is part of Qt Creator. ** ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ****************************************************************************/ #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