blob: 65bf2144adb8f9783d7934f33c1bad34aeac8042 [file] [log] [blame] [edit]
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file LICENSE.rst or https://cmake.org/licensing for details. */
#pragma once
#include <array>
#include <cstddef>
#include <map>
#include <new>
#include <string>
#include <tuple>
#include <utility>
#include <vector>
#include <cm/optional>
#include <cm/type_traits>
#include <cm3p/json/value.h>
#include "cmStringAlgorithms.h"
// Base Class
struct cmSPDXSerializationBase
{
enum SPDXTypeId
{
INVALID = -1,
NULL_ID = 0,
#define X_SPDX(classtype, enumid, title, camel) enumid,
#include "cmSPDXTypes.def"
SPDX_TYPE_ID_MAX,
};
SPDXTypeId getTypeId() const;
std::string NodeId;
protected:
cmSPDXSerializationBase(SPDXTypeId id);
cmSPDXSerializationBase(SPDXTypeId id, std::string nodeId);
private:
SPDXTypeId TypeId;
};
// Convenience Classes
struct cmSPDXIdentifierReference : cmSPDXSerializationBase
{
cmSPDXIdentifierReference();
cmSPDXIdentifierReference(cmSPDXSerializationBase const& ref);
cmSPDXIdentifierReference(std::string const& ref);
Json::Value toJsonLD() const;
};
struct cmSPDXNonElementBase : cmSPDXSerializationBase
{
protected:
cmSPDXNonElementBase(SPDXTypeId id);
Json::Value toJsonLD() const;
};
// SPDX Core Data Types
// Nominally these are supposed to be validated strings
using cmSPDXDateTime = std::string;
using cmSPDXMediaType = std::string;
using cmSPDXSemVer = std::string;
// SPDX Core Enums
struct cmSPDXAnnotationType
{
enum cmSPDXAnnotationTypeId
{
INVALID = -1,
NULL_ID = 0,
OTHER,
REVIEW,
};
cmSPDXAnnotationTypeId TypeId;
cmSPDXAnnotationType(cmSPDXAnnotationTypeId typeId = NULL_ID);
Json::Value toJsonLD() const;
};
struct cmSPDXExternalIdentifierType
{
enum cmSPDXExternalIdentifierTypeId
{
INVALID = -1,
NULL_ID = 0,
CPE22,
CPE23,
CVE,
EMAIL,
GITOID,
OTHER,
PACKAGE_URL,
SECURITY_OTHER,
SWHID,
SWID,
URL_SCHEME,
};
cmSPDXExternalIdentifierTypeId TypeId;
cmSPDXExternalIdentifierType(
cmSPDXExternalIdentifierTypeId typeId = NULL_ID);
Json::Value toJsonLD() const;
};
struct cmSPDXExternalRefType
{
enum cmSPDXExternalRefTypeId
{
INVALID = -1,
NULL_ID = 0,
ALT_DOWNLOAD_LOCATION,
ALT_WEB_PAGE,
BINARY_ARTIFACT,
BOWER,
BUILD_META,
BUILD_SYSTEM,
CERTIFICATION_REPORT,
CHAT,
COMPONENT_ANALYSIS_REPORT,
CWE,
DOCUMENTATION,
DYNAMIC_ANALYSIS_REPORT,
EOL_NOTICE,
EXPORT_CONTROL_ASSESSMENT,
FUNDING,
ISSUE_TRACKER,
LICENSE,
MAILING_LIST,
MAVEN_CENTRAL,
METRICS,
NPM,
NUGET,
OTHER,
PRIVACY_ASSESSMENT,
PRODUCT_METADATA,
PURCHASE_ORDER,
QUALITY_ASSESSMENT_REPORT,
RELEASE_HISTORY,
RELEASE_NOTES,
RISK_ASSESSMENT,
RUNTIME_ANALYSIS_REPORT,
SECURE_SOFTWARE_ATTESTATION,
SECURITY_ADVERSARY_MODEL,
SECURITY_ADVISORY,
SECURITY_FIX,
SECURITY_OTHER,
SECURITY_PEN_TEST_REPORT,
SECURITY_POLICY,
SECURITY_THREAT_MODEL,
SOCIAL_MEDIA,
SOURCE_ARTIFACT,
STATIC_ANALYSIS_REPORT,
SUPPORT,
VCS,
VULNERABILITY_DISCLOSURE_REPORT,
VULNERABILITY_EXPLOITABILITY_ASSESSMENT,
};
cmSPDXExternalRefTypeId TypeId;
cmSPDXExternalRefType(cmSPDXExternalRefTypeId typeId = NULL_ID);
Json::Value toJsonLD() const;
};
struct cmSPDXHashAlgorithm
{
enum cmSPDXHashAlgorithmId
{
INVALID = -1,
NULL_ID = 0,
ADLER32,
BLAKE2B256,
BLAKE2B384,
BLAKE2B512,
BLAKE3,
CRYSTALS_DILITHIUM,
CRYSTALS_KYBER,
FALCON,
MD2,
MD4,
MD5,
MD6,
OTHER,
SHA1,
SHA224,
SHA256,
SHA384,
SHA3_224,
SHA3_256,
SHA3_384,
SHA3_512,
SHA512,
};
cmSPDXHashAlgorithmId TypeId;
cmSPDXHashAlgorithm(cmSPDXHashAlgorithmId typeId = NULL_ID);
Json::Value toJsonLD() const;
};
struct cmSPDXLifecycleScopeType
{
enum cmSPDXLifecycleScopeTypeId
{
INVALID = -1,
NULL_ID = 0,
BUILD,
DESIGN,
DEVELOPMENT,
OTHER,
RUNTIME,
TEST,
};
cmSPDXLifecycleScopeTypeId TypeId;
cmSPDXLifecycleScopeType(cmSPDXLifecycleScopeTypeId typeId = NULL_ID);
Json::Value toJsonLD() const;
};
struct cmSPDXProfileIdentifierType
{
enum cmSPDXProfileIdentifierTypeId
{
INVALID = -1,
NULL_ID = 0,
AI,
BUILD,
CORE,
DATASET,
EXPANDED_LICENSING,
EXTENSION,
LITE,
SECURITY,
SIMPLE_LICENSING,
SOFTWARE,
};
cmSPDXProfileIdentifierTypeId TypeId;
cmSPDXProfileIdentifierType(cmSPDXProfileIdentifierTypeId typeId = NULL_ID);
Json::Value toJsonLD() const;
};
struct cmSPDXRelationshipCompletenessType
{
enum cmSPDXRelationshipCompletenessTypeId
{
INVALID = -1,
NULL_ID = 0,
COMPLETE,
INCOMPLETE,
NO_ASSERTION,
};
cmSPDXRelationshipCompletenessTypeId TypeId;
cmSPDXRelationshipCompletenessType(
cmSPDXRelationshipCompletenessTypeId typeId = NULL_ID);
Json::Value toJsonLD() const;
};
struct cmSPDXRelationshipType
{
enum cmSPDXRelationshipTypeId
{
INVALID = -1,
NULL_ID = 0,
AFFECTS,
AMENDED_BY,
ANCESTOR_OF,
AVAILABLE_FROM,
CONFIGURES,
CONTAINS,
COORDINATED_BY,
COPIED_TO,
DELEGATED_TO,
DEPENDS_ON,
DESCENDANT_OF,
DESCRIBES,
DOES_NOT_AFFECT,
EXPANDS_TO,
EXPLOIT_CREATED_BY,
FIXED_BY,
FIXED_IN,
FOUND_BY,
GENERATES,
HAS_ADDED_FILE,
HAS_ASSESSMENT_FOR,
HAS_ASSOCIATED_VULNERABILITY,
HAS_CONCLUDED_LICENSE,
HAS_DATA_FILE,
HAS_DECLARED_LICENSE,
HAS_DELETED_FILE,
HAS_DEPENDENCY_MANIFEST,
HAS_DISTRIBUTION_ARTIFACT,
HAS_DOCUMENTATION,
HAS_DYNAMIC_LINK,
HAS_EVIDENCE,
HAS_EXAMPLE,
HAS_HOST,
HAS_INPUT,
HAS_METADATA,
HAS_OPTIONAL_COMPONENT,
HAS_OPTIONAL_DEPENDENCY,
HAS_OUTPUT,
HAS_PREREQUISITE,
HAS_PROVIDED_DEPENDENCY,
HAS_REQUIREMENT,
HAS_SPECIFICATION,
HAS_STATIC_LINK,
HAS_TEST,
HAS_TEST_CASE,
HAS_VARIANT,
INVOKED_BY,
MODIFIED_BY,
OTHER,
PACKAGED_BY,
PATCHED_BY,
PUBLISHED_BY,
REPORTED_BY,
REPUBLISHED_BY,
SERIALIZED_IN_ARTIFACT,
TESTED_ON,
TRAINED_ON,
UNDER_INVESTIGATION_FOR,
USES_TOOL,
};
cmSPDXRelationshipTypeId TypeId;
cmSPDXRelationshipType(cmSPDXRelationshipTypeId typeId = NULL_ID);
Json::Value toJsonLD() const;
};
struct cmSPDXSupportType
{
enum cmSPDXSupportTypeId
{
INVALID = -1,
NULL_ID = 0,
DEPLOYED,
DEVELOPMENT,
END_OF_SUPPORT,
LIMITED_SUPPORT,
NO_ASSERTION,
NO_SUPPORT,
SUPPORT,
};
cmSPDXSupportTypeId TypeId;
cmSPDXSupportType(cmSPDXSupportTypeId typeId = NULL_ID);
Json::Value toJsonLD() const;
};
// SPDX Core NonElement Classes, Abstract
struct cmSPDXIntegrityMethod : cmSPDXNonElementBase
{
cm::optional<std::string> Comment;
protected:
cmSPDXIntegrityMethod(SPDXTypeId id);
Json::Value toJsonLD() const;
};
// SPDX Core NonElement Classes, Concrete
struct cmSPDXCreationInfo : cmSPDXNonElementBase
{
cm::optional<std::string> Comment;
cmSPDXDateTime Created;
std::vector<cmSPDXIdentifierReference> CreatedBy;
cm::optional<std::vector<cmSPDXIdentifierReference>> CreatedUsing;
cmSPDXCreationInfo();
Json::Value toJsonLD() const;
};
struct cmSPDXDictionaryEntry : cmSPDXNonElementBase
{
std::string Key;
cm::optional<std::string> Value;
cmSPDXDictionaryEntry();
cmSPDXDictionaryEntry(std::string key);
cmSPDXDictionaryEntry(std::string key, std::string val);
Json::Value toJsonLD() const;
};
struct cmSPDXExternalIdentifier : cmSPDXNonElementBase
{
cm::optional<std::string> Comment;
cmSPDXExternalIdentifierType ExternalIdentifierType;
std::string Identifier;
cm::optional<std::vector<std::string>> IdentifierLocator;
cm::optional<std::string> IssuingAuthority;
cmSPDXExternalIdentifier();
Json::Value toJsonLD() const;
};
struct cmSPDXExternalMap : cmSPDXNonElementBase
{
cm::optional<cmSPDXIdentifierReference> DefiningArtifact;
std::string ExternalSpdxId;
cm::optional<std::string> LocationHint;
cm::optional<std::vector<cmSPDXIdentifierReference>> IntegrityMethod;
cmSPDXExternalMap();
Json::Value toJsonLD() const;
};
struct cmSPDXExternalRef : cmSPDXNonElementBase
{
cm::optional<std::string> Comment;
cm::optional<cmSPDXMediaType> ContentType;
cm::optional<cmSPDXExternalRefType> ExternalRefType;
cm::optional<std::vector<std::string>> Locator;
cmSPDXExternalRef();
Json::Value toJsonLD() const;
};
struct cmSPDXHash : cmSPDXIntegrityMethod
{
cmSPDXHashAlgorithm Algorithm;
std::string HashValue;
cmSPDXHash();
Json::Value toJsonLD() const;
};
struct cmSPDXNamespaceMap : cmSPDXNonElementBase
{
std::string Namespace;
std::string Prefix;
cmSPDXNamespaceMap();
Json::Value toJsonLD() const;
};
struct cmSPDXPackageVerificationCode : cmSPDXIntegrityMethod
{
cmSPDXHashAlgorithm Algorithm;
std::string HashValue;
cm::optional<std::vector<std::string>> PackageVerificationCodeExcludedFile;
cmSPDXPackageVerificationCode();
Json::Value toJsonLD() const;
};
struct cmSPDXPositiveIntegerRange : cmSPDXNonElementBase
{
unsigned int BeginIntegerRange;
unsigned int EndIntegerRange;
cmSPDXPositiveIntegerRange(unsigned int beingIntegerRange = 0,
unsigned int endIntegerRange = 0);
Json::Value toJsonLD() const;
};
// SPDX Core Element Classes, Abstract
struct cmSPDXElement : cmSPDXSerializationBase
{
cm::optional<std::string> Comment;
cmSPDXIdentifierReference CreationInfo;
cm::optional<std::string> Description;
cm::optional<std::vector<cmSPDXIdentifierReference>> Extension;
cm::optional<std::vector<cmSPDXIdentifierReference>> ExternalIdentifier;
cm::optional<std::vector<cmSPDXIdentifierReference>> ExternalRef;
cm::optional<std::string> Name;
// SpdxId is the NodeId
cm::optional<std::string> Summary;
cm::optional<std::vector<cmSPDXIdentifierReference>> VerifiedUsing;
protected:
cmSPDXElement(SPDXTypeId id, cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
struct cmSPDXArtifact : cmSPDXElement
{
cm::optional<cmSPDXDateTime> BuiltTime;
cm::optional<std::vector<cmSPDXIdentifierReference>> OriginatedBy;
cm::optional<cmSPDXDateTime> ReleaseTime;
cm::optional<std::vector<std::string>> StandardName;
cm::optional<cmSPDXIdentifierReference> SuppliedBy;
cm::optional<std::vector<cmSPDXSupportType>> SupportType;
cm::optional<cmSPDXDateTime> ValidUntilTime;
protected:
cmSPDXArtifact(SPDXTypeId id, cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
struct cmSPDXElementCollection : cmSPDXElement
{
cm::optional<std::vector<cmSPDXIdentifierReference>> Element;
cm::optional<std::vector<cmSPDXProfileIdentifierType>> ProfileConformance;
cm::optional<std::vector<cmSPDXIdentifierReference>> RootElement;
protected:
cmSPDXElementCollection(SPDXTypeId id,
cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
// SPDX Implicit Core Element Classes, Abstract
// Nominally an inheritable class, but adds nothing to Element
using cmSPDXAgentAbstract = cmSPDXElement;
struct cmSPDXBundleAbstract : cmSPDXElementCollection
{
std::string Context;
protected:
cmSPDXBundleAbstract(SPDXTypeId id, cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
// Nominally an inheritable class, but adds nothing to Bundle
using cmSPDXBomAbstract = cmSPDXBundleAbstract;
struct cmSPDXRelationshipAbstract : cmSPDXElement
{
cm::optional<cmSPDXRelationshipCompletenessType> Completeness;
cm::optional<cmSPDXDateTime> EndTime;
cmSPDXIdentifierReference From;
cmSPDXRelationshipType RelationshipType;
cm::optional<cmSPDXDateTime> StartTime;
std::vector<cmSPDXIdentifierReference> To;
protected:
cmSPDXRelationshipAbstract(SPDXTypeId id,
cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
// SPDX Core Element Classes, Concrete
struct cmSPDXAgent : cmSPDXAgentAbstract
{
cmSPDXAgent(cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
struct cmSPDXAnnotation : cmSPDXElement
{
cmSPDXAnnotationType AnnotationType;
cm::optional<cmSPDXMediaType> ContentType;
cm::optional<std::string> Statement;
cmSPDXIdentifierReference Subject;
cmSPDXAnnotation(cmSPDXCreationInfo const& creationInfo,
cmSPDXIdentifierReference subject = {});
Json::Value toJsonLD() const;
};
struct cmSPDXBom : cmSPDXBomAbstract
{
cmSPDXBom(cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
struct cmSPDXBundle : cmSPDXBundleAbstract
{
cmSPDXBundle(cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
struct cmSPDXIndividualElement : cmSPDXElement
{
cmSPDXIndividualElement(cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
struct cmSPDXLifecycleScopedRelationship : cmSPDXRelationshipAbstract
{
cm::optional<cmSPDXLifecycleScopeType> Scope;
cmSPDXLifecycleScopedRelationship(cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
struct cmSPDXOrganization : cmSPDXAgentAbstract
{
cmSPDXOrganization(cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
struct cmSPDXPerson : cmSPDXAgentAbstract
{
cmSPDXPerson(cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
struct cmSPDXRelationship : cmSPDXRelationshipAbstract
{
cmSPDXRelationship(cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
struct cmSPDXSoftwareAgent : cmSPDXAgentAbstract
{
cmSPDXSoftwareAgent(cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
struct cmSPDXSpdxDocument : cmSPDXElementCollection
{
cm::optional<cmSPDXIdentifierReference> DataLicense;
cm::optional<cmSPDXIdentifierReference> ExternalMap;
cm::optional<cmSPDXIdentifierReference> NamespaceMap;
cmSPDXSpdxDocument(cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
struct cmSPDXTool : cmSPDXElement
{
cmSPDXTool(cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
// SPDX Software Enums
struct cmSPDXContentIdentifierType
{
enum cmSPDXContentIdentifierTypeId
{
INVALID = -1,
NULL_ID = 0,
GITOID,
SWHID,
};
cmSPDXContentIdentifierTypeId TypeId;
cmSPDXContentIdentifierType(cmSPDXContentIdentifierTypeId typeId = NULL_ID);
Json::Value toJsonLD() const;
};
struct cmSPDXFileKindType
{
enum cmSPDXFileKindTypeId
{
INVALID = -1,
NULL_ID = 0,
DIRECTORY,
FILE,
};
cmSPDXFileKindTypeId TypeId;
cmSPDXFileKindType(cmSPDXFileKindTypeId typeId = NULL_ID);
Json::Value toJsonLD() const;
};
struct cmSPDXSbomType
{
enum cmSPDXSbomTypeId
{
INVALID = -1,
NULL_ID = 0,
ANALYZED,
BUILD,
DEPLOYED,
DESIGN,
RUNTIME,
SOURCE,
};
cmSPDXSbomTypeId TypeId;
cmSPDXSbomType(cmSPDXSbomTypeId typeId = NULL_ID);
Json::Value toJsonLD() const;
};
struct cmSPDXSoftwarePurpose
{
enum cmSPDXSoftwarePurposeId
{
INVALID = -1,
NULL_ID = 0,
APPLICATION,
ARCHIVE,
BOM,
CONFIGURATION,
CONTAINER,
DATA,
DEVICE,
DEVICE_DRIVER,
DISK_IMAGE,
DOCUMENTATION,
EVIDENCE,
EXECUTABLE,
FILE,
FILESYSTEM_IMAGE,
FIRMWARE,
FRAMEWORK,
INSTALL,
LIBRARY,
MANIFEST,
MODEL,
MODULE,
OPERATING_SYSTEM,
OTHER,
PATCH,
PLATFORM,
REQUIREMENT,
SOURCE,
SPECIFICATION,
TEST,
};
cmSPDXSoftwarePurposeId TypeId;
cmSPDXSoftwarePurpose(cmSPDXSoftwarePurposeId typeId = NULL_ID);
Json::Value toJsonLD() const;
};
// SPDX Software NonElement Classes, Concrete
struct cmSPDXContentIdentifier : cmSPDXIntegrityMethod
{
cmSPDXContentIdentifierType ContentIdentifierType;
std::string ContentIdentifierValue;
cmSPDXContentIdentifier();
Json::Value toJsonLD() const;
};
// SPDX Software Element Classes, Abstract
struct cmSPDXSoftwareArtifact : cmSPDXArtifact
{
cm::optional<std::vector<cmSPDXSoftwarePurpose>> AdditionalPurpose;
cm::optional<std::string> AttributionText;
cm::optional<cmSPDXIdentifierReference> ContentIdentifier;
cm::optional<std::string> CopyrightText;
cm::optional<cmSPDXSoftwarePurpose> PrimaryPurpose;
protected:
cmSPDXSoftwareArtifact(SPDXTypeId id,
cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
// SPDX Software Element Classes, Concrete
struct cmSPDXFile : cmSPDXSoftwareArtifact
{
cm::optional<cmSPDXMediaType> ContentType;
cm::optional<cmSPDXFileKindType> FileKind;
cmSPDXFile(cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
struct cmSPDXPackage : cmSPDXSoftwareArtifact
{
cm::optional<std::string> DownloadLocation;
cm::optional<std::string> HomePage;
cm::optional<std::string> PackageUrl;
cm::optional<std::string> PackageVersion;
cm::optional<std::string> SourceInfo;
cmSPDXPackage(cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
struct cmSPDXSbom : cmSPDXBomAbstract
{
cm::optional<std::vector<cmSPDXSbomType>> SbomType;
cmSPDXSbom(cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
struct cmSPDXSnippet : cmSPDXSoftwareArtifact
{
cm::optional<cmSPDXIdentifierReference> ByteRange;
cm::optional<cmSPDXIdentifierReference> LineRange;
cmSPDXIdentifierReference SnippetFromFile;
cmSPDXSnippet(cmSPDXCreationInfo const& creationInfo);
Json::Value toJsonLD() const;
};
// SPDX SimpleLicensing Element Classes, Abstract
// Nominally an inheritable class, but adds nothing to Element
using cmSPDXAnyLicenseInfo = cmSPDXElement;
// SPDX SimpleLicensing Element Classes, Concrete
struct cmSPDXLicenseExpression : cmSPDXAnyLicenseInfo
{
cm::optional<std::vector<cmSPDXIdentifierReference>> CustomIdToUri;
std::string LicenseExpression;
cm::optional<cmSPDXSemVer> LicenseListVersion;
cmSPDXLicenseExpression(cmSPDXCreationInfo const& CreationInfo);
Json::Value toJsonLD() const;
};
struct cmSPDXSimpleLicensingText : cmSPDXElement
{
std::string LicenseText;
cmSPDXSimpleLicensingText(cmSPDXCreationInfo const& CreationInfo);
Json::Value toJsonLD() const;
};
// Graph Manipulation
template <typename T>
cmSPDXSerializationBase::SPDXTypeId cmSPDXGetTypeId();
template <typename T>
std::string cmSPDXGetTypeName();
#define X_SPDX(classtype, enumid, member, camel) \
template <> \
cmSPDXSerializationBase::SPDXTypeId cmSPDXGetTypeId<classtype>(); \
\
template <> \
std::string cmSPDXGetTypeName<classtype>();
#include "cmSPDXTypes.def"
template <class T>
struct cmSPDXTag
{
using type = T;
};
union cmSPDXObject
{
cmSPDXSerializationBase SerializationBase;
cmSPDXObject();
cmSPDXObject(cmSPDXObject const& other);
cmSPDXObject(cmSPDXObject&& other) noexcept;
#define X_SPDX(classtype, enumid, member, camel) \
classtype member; \
cmSPDXObject(classtype val); \
\
template <typename... Args> \
cmSPDXObject(cmSPDXTag<classtype>, Args&&... args) \
{ \
new (&member) classtype(std::forward<Args>(args)...); \
}
#include "cmSPDXTypes.def"
cmSPDXObject& operator=(cmSPDXObject const& other);
cmSPDXObject& operator=(cmSPDXObject&& other) noexcept;
~cmSPDXObject();
template <typename T>
T* get()
{
T* ptr;
get(&ptr);
return ptr;
}
Json::Value toJsonLD() const;
private:
#define X_SPDX(classtype, enumid, member, camel) void get(classtype** ptr);
#include "cmSPDXTypes.def"
};
struct cmSPDXSimpleGraph
{
cmSPDXSimpleGraph(std::string iriBase, cmSPDXCreationInfo creationInfo = {});
template <typename T, typename... Args>
cm::enable_if_t<std::is_base_of<cmSPDXElement, T>::value, T>& insert(
Args&&... args)
{
std::string nodeId = cmStrCat(IRIBase, IRICount++);
auto const& it =
Graph.emplace(std::piecewise_construct, std::forward_as_tuple(nodeId),
std::forward_as_tuple(cmSPDXTag<T>{}, *CreationInfo,
std::forward<Args>(args)...));
auto& node = *it.first->second.template get<T>();
node.NodeId = std::move(nodeId);
return node;
}
cmSPDXCreationInfo& getCreationInfo();
template <typename T, typename... Args>
cm::enable_if_t<std::is_base_of<cmSPDXNonElementBase, T>::value, T>& insert(
Args&&... args)
{
std::size_t nodeCount = BlankCounts[cmSPDXGetTypeId<T>()]++;
std::string nodeId =
cmStrCat("_:", cmSPDXGetTypeName<T>(), "_", nodeCount);
auto const& it = Graph.emplace(
std::piecewise_construct, std::forward_as_tuple(nodeId),
std::forward_as_tuple(cmSPDXTag<T>{}, std::forward<Args>(args)...));
auto& node = *it.first->second.template get<T>();
node.NodeId = std::move(nodeId);
return node;
}
template <typename T>
T* get(std::string const& key)
{
auto it = Graph.find(key);
if (it == Graph.end()) {
return nullptr;
}
return it->second.get<T>();
}
template <typename T>
T* get(cmSPDXIdentifierReference const& key)
{
auto it = Graph.find(key.NodeId);
if (it == Graph.end()) {
return nullptr;
}
return it->second.get<T>();
}
Json::Value toJsonLD();
private:
std::string IRIBase;
std::size_t IRICount{ 0 };
std::array<std::size_t, cmSPDXSerializationBase::SPDX_TYPE_ID_MAX>
BlankCounts{};
std::map<std::string, cmSPDXObject> Graph;
cmSPDXCreationInfo* CreationInfo;
};