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+
65110CFStringRef 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+
74141void const * OGTypeNominalDescriptor (OGTypeID typeID) {
75142 #ifdef OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
76143 auto metadata = reinterpret_cast <OG::swift::metadata const *>(typeID);
0 commit comments