Skip to content

Commit 5992cb5

Browse files
authored
Update OGType Enum stuff (#100)
1 parent a161f23 commit 5992cb5

File tree

13 files changed

+190
-133
lines changed

13 files changed

+190
-133
lines changed

Package.resolved

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/OpenGraph_SPI/Runtime/OGTypeApplyEnumData.cpp

Lines changed: 0 additions & 18 deletions
This file was deleted.

Sources/OpenGraph_SPI/Runtime/OGTypeApplyEnumData.h

Lines changed: 0 additions & 25 deletions
This file was deleted.

Sources/OpenGraph_SPI/Runtime/OGTypeApplyField.cpp

Lines changed: 0 additions & 18 deletions
This file was deleted.

Sources/OpenGraph_SPI/Runtime/OGTypeApplyField.h

Lines changed: 0 additions & 26 deletions
This file was deleted.

Sources/OpenGraph_SPI/Runtime/OGTypeApplyOptions.h

Lines changed: 0 additions & 20 deletions
This file was deleted.

Sources/OpenGraph_SPI/Runtime/OGTypeID.cpp

Lines changed: 74 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
#include "OGTypeID.h"
99
#include "metadata.hpp"
10+
#include "../Util/assert.hpp"
1011

1112
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
1213
#include <swift/Runtime/Metadata.h>
@@ -40,28 +41,72 @@ OGTypeKind OGTypeGetKind(OGTypeID typeID) {
4041
#endif
4142
}
4243

44+
void OGTypeApplyFields(const void *type, const void *block, void *context) {
45+
// TODO
46+
return;
47+
}
48+
49+
bool OGTypeApplyFields2(const void *type, OGTypeApplyOptions options, const void *block, void *context) {
50+
// TODO
51+
return false;
52+
}
53+
4354
#if OPENGRAPH_RELEASE >= OPENGRAPH_RELEASE_2024
4455

45-
OGTypeSignature const OGTypeGetSignature(OGTypeID typeID) {
56+
uint32_t OGTypeGetEnumTag(OGTypeID typeID, const void *value) {
4657
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
4758
auto metadata = reinterpret_cast<OG::swift::metadata const*>(typeID);
48-
// TODO
49-
return OGTypeSignature{};
59+
auto vwt = metadata->getValueWitnesses();
60+
if (!swift::EnumValueWitnessTable::classof(vwt)) {
61+
OG::precondition_failure("not an enum type: %s", metadata->name(false).data);
62+
}
63+
auto enum_vwt = static_cast<const swift::EnumValueWitnessTable *>(vwt);
64+
return enum_vwt->getEnumTag(static_cast<const swift::OpaqueValue *>(value), metadata);
5065
#else
51-
return OGTypeSignature{};
66+
return 0;
5267
#endif
5368
}
54-
void const* OGTypeGetDescriptor(OGTypeID typeID) {
69+
70+
void OGTypeProjectEnumData(OGTypeID typeID, void *value) {
5571
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
5672
auto metadata = reinterpret_cast<OG::swift::metadata const*>(typeID);
57-
return metadata->descriptor();
73+
auto vwt = metadata->getValueWitnesses();
74+
if (!swift::EnumValueWitnessTable::classof(vwt)) {
75+
OG::precondition_failure("not an enum type: %s", metadata->name(false).data);
76+
}
77+
auto enum_vwt = static_cast<const swift::EnumValueWitnessTable *>(vwt);
78+
enum_vwt->destructiveProjectEnumData(static_cast<swift::OpaqueValue *>(value), metadata);
5879
#else
59-
return nullptr;
80+
return;
81+
#endif
82+
}
83+
84+
void OGTypeInjectEnumTag(OGTypeID typeID, uint32_t tag, void *value) {
85+
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
86+
auto metadata = reinterpret_cast<OG::swift::metadata const*>(typeID);
87+
auto vwt = metadata->getValueWitnesses();
88+
if (!swift::EnumValueWitnessTable::classof(vwt)) {
89+
OG::precondition_failure("not an enum type: %s", metadata->name(false).data);
90+
}
91+
auto enum_vwt = static_cast<const swift::EnumValueWitnessTable *>(vwt);
92+
return enum_vwt->destructiveInjectEnumTag(static_cast<swift::OpaqueValue *>(value), tag, metadata);
93+
#else
94+
return;
6095
#endif
6196
}
6297

6398
#endif /* OPENGRAPH_RELEASE */
6499

100+
bool OGTypeApplyEnumData() {
101+
// TODO
102+
return false;
103+
}
104+
105+
bool OGTypeApplyMutableEnumData() {
106+
// TODO
107+
return false;
108+
}
109+
65110
CFStringRef OGTypeDescription(OGTypeID typeID) {
66111
CFMutableStringRef ref = CFStringCreateMutable(CFAllocatorGetDefault(), 0);
67112
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
@@ -71,6 +116,28 @@ CFStringRef OGTypeDescription(OGTypeID typeID) {
71116
return ref;
72117
}
73118

119+
#if OPENGRAPH_RELEASE >= OPENGRAPH_RELEASE_2024
120+
121+
OGTypeSignature const OGTypeGetSignature(OGTypeID typeID) {
122+
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
123+
auto metadata = reinterpret_cast<OG::swift::metadata const*>(typeID);
124+
// TODO
125+
return OGTypeSignature{};
126+
#else
127+
return OGTypeSignature{};
128+
#endif
129+
}
130+
void const* OGTypeGetDescriptor(OGTypeID typeID) {
131+
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
132+
auto metadata = reinterpret_cast<OG::swift::metadata const*>(typeID);
133+
return metadata->descriptor();
134+
#else
135+
return nullptr;
136+
#endif
137+
}
138+
139+
#endif /* OPENGRAPH_RELEASE */
140+
74141
void const* OGTypeNominalDescriptor(OGTypeID typeID) {
75142
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
76143
auto metadata = reinterpret_cast<OG::swift::metadata const*>(typeID);

Sources/OpenGraph_SPI/Runtime/OGTypeID.h

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@ typedef OG_CLOSED_ENUM(uint32_t, OGTypeKind) {
3030
OGTypeKindMetatype,
3131
} OG_SWIFT_NAME(Metadata.Kind);
3232

33+
typedef OG_OPTIONS(uint32_t, OGTypeApplyOptions) {
34+
OGTypeApplyOptions_0 = 0,
35+
OGTypeApplyOptions_1 = 1 << 0,
36+
OGTypeApplyOptions_2 = 1 << 1,
37+
OGTypeApplyOptions_4 = 1 << 2,
38+
};
39+
3340
#if OPENGRAPH_RELEASE >= OPENGRAPH_RELEASE_2024
3441

3542
typedef struct OG_SWIFT_NAME(Signature) OGTypeSignature {
@@ -44,22 +51,59 @@ OG_EXPORT
4451
OG_REFINED_FOR_SWIFT
4552
OGTypeKind OGTypeGetKind(OGTypeID typeID) OG_SWIFT_NAME(getter:Metadata.kind(self:));
4653

54+
// TODO
55+
// OGOverrideComparisonForTypeDescriptor();
56+
57+
OG_EXPORT
58+
OG_REFINED_FOR_SWIFT
59+
void OGTypeApplyFields(const void *type, const void *block, void *context);
60+
61+
OG_EXPORT
62+
OG_REFINED_FOR_SWIFT
63+
bool OGTypeApplyFields2(const void *type, OGTypeApplyOptions options, const void *block, void *context);
64+
65+
OG_EXPORT
66+
OG_REFINED_FOR_SWIFT
67+
uint32_t OGTypeGetEnumTag(OGTypeID typeID, const void *value) OG_SWIFT_NAME(Metadata.enumTag(self:_:));
68+
4769
#if OPENGRAPH_RELEASE >= OPENGRAPH_RELEASE_2024
4870

4971
OG_EXPORT
5072
OG_REFINED_FOR_SWIFT
51-
OGTypeSignature const OGTypeGetSignature(OGTypeID typeID) OG_SWIFT_NAME(getter:Metadata.signature(self:));
73+
void OGTypeProjectEnumData(OGTypeID typeID, void *value) OG_SWIFT_NAME(Metadata.projectEnumData(self:_:));
5274

5375
OG_EXPORT
5476
OG_REFINED_FOR_SWIFT
55-
void const* _Nullable OGTypeGetDescriptor(OGTypeID typeID) OG_SWIFT_NAME(getter:Metadata.descriptor(self:));
77+
void OGTypeInjectEnumTag(OGTypeID typeID, uint32_t tag, void *value) OG_SWIFT_NAME(Metadata.injectEnumTag(self:tag:_:));
5678

5779
#endif /* OPENGRAPH_RELEASE */
5880

81+
// TODO
82+
OG_EXPORT
83+
OG_REFINED_FOR_SWIFT
84+
bool OGTypeApplyEnumData();
85+
86+
// TODO
87+
OG_EXPORT
88+
OG_REFINED_FOR_SWIFT
89+
bool OGTypeApplyMutableEnumData();
90+
5991
OG_EXPORT
6092
OG_REFINED_FOR_SWIFT
6193
CFStringRef OGTypeDescription(OGTypeID typeID);
6294

95+
#if OPENGRAPH_RELEASE >= OPENGRAPH_RELEASE_2024
96+
97+
OG_EXPORT
98+
OG_REFINED_FOR_SWIFT
99+
OGTypeSignature const OGTypeGetSignature(OGTypeID typeID) OG_SWIFT_NAME(getter:Metadata.signature(self:));
100+
101+
OG_EXPORT
102+
OG_REFINED_FOR_SWIFT
103+
void const* _Nullable OGTypeGetDescriptor(OGTypeID typeID) OG_SWIFT_NAME(getter:Metadata.descriptor(self:));
104+
105+
#endif /* OPENGRAPH_RELEASE */
106+
63107
OG_EXPORT
64108
OG_REFINED_FOR_SWIFT
65109
void const* _Nullable OGTypeNominalDescriptor(OGTypeID typeID) OG_SWIFT_NAME(getter:Metadata.nominalDescriptor(self:));

Sources/OpenGraph_SPI/include/OGTypeApplyEnumData.h

Lines changed: 0 additions & 1 deletion
This file was deleted.

Sources/OpenGraph_SPI/include/OGTypeApplyField.h

Lines changed: 0 additions & 1 deletion
This file was deleted.

0 commit comments

Comments
 (0)