File indexing completed on 2024-05-19 04:27:43

0001 /*
0002  *  SPDX-FileCopyrightText: 2021 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 #include "KoResourceLoadResult.h"
0007 
0008 #include <variant>
0009 #include <KisMpl.h>
0010 
0011 #include <KoResource.h>
0012 
0013 struct KoResourceLoadResult::Private
0014 {
0015     // XXX: this should take a monostate for null resources
0016     // AAA: no, it shouldn't, null resource must be a KoResourceSignature only
0017     std::variant<KoResourceSP, KoEmbeddedResource, KoResourceSignature> value;
0018 };
0019 
0020 KoResourceLoadResult::KoResourceLoadResult(KoResourceSP resource)
0021     : m_d(new Private)
0022 {
0023     m_d->value = resource;
0024 }
0025 
0026 KoResourceLoadResult::KoResourceLoadResult(KoEmbeddedResource embeddedResource)
0027     : m_d(new Private)
0028 {
0029     m_d->value = embeddedResource;
0030 }
0031 
0032 KoResourceLoadResult::KoResourceLoadResult(KoResourceSignature signature)
0033     : m_d(new Private)
0034 {
0035     m_d->value = signature;
0036 }
0037 
0038 KoResourceLoadResult::KoResourceLoadResult(const KoResourceLoadResult &rhs)
0039     : m_d(new Private(*rhs.m_d))
0040 {
0041 }
0042 
0043 KoResourceLoadResult &KoResourceLoadResult::operator=(const KoResourceLoadResult &rhs)
0044 {
0045     m_d->value = rhs.m_d->value;
0046     return *this;
0047 }
0048 
0049 KoResourceLoadResult::~KoResourceLoadResult()
0050 {
0051 }
0052 
0053 KoResourceSP KoResourceLoadResult::resource() const noexcept
0054 {
0055     return std::holds_alternative<KoResourceSP>(m_d->value) ? std::get<KoResourceSP>(m_d->value) : KoResourceSP();
0056 }
0057 
0058 KoEmbeddedResource KoResourceLoadResult::embeddedResource() const noexcept
0059 {
0060     return std::holds_alternative<KoEmbeddedResource>(m_d->value) ? std::get<KoEmbeddedResource>(m_d->value) : KoEmbeddedResource();
0061 }
0062 
0063 KoResourceSignature KoResourceLoadResult::signature() const
0064 {
0065     return std::visit(
0066         kismpl::overloaded {
0067             [](const KoResourceSignature &signature) { return signature; },
0068             [](const KoResourceSP &resource) { return resource->signature(); },
0069             [](const KoEmbeddedResource &resource) { return resource.signature(); }
0070         }, m_d->value);
0071 }
0072 
0073 KoResourceLoadResult::Type KoResourceLoadResult::type() const
0074 {
0075     return std::visit(
0076         kismpl::overloaded {
0077             [](auto) { return FailedLink; },
0078             [](const KoResourceSP &) { return ExistingResource; },
0079             [](const KoEmbeddedResource &) { return EmbeddedResource; }
0080         }, m_d->value);
0081 }