Skip to content

Commit af59f18

Browse files
committed
Update TupleTypeTests
1 parent 22658e7 commit af59f18

File tree

4 files changed

+116
-14
lines changed

4 files changed

+116
-14
lines changed

Sources/OpenGraph/Runtime/TupleType.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,6 @@ extension TupleType {
4444
__OGTupleGetElement(self, tupleValue, index, dstValue, Metadata(T.self), options)
4545
}
4646
}
47+
48+
@_silgen_name("OGTupleWithBuffer")
49+
public func withUnsafeTuple(of type: TupleType, count: Int, _ body: (UnsafeMutableTuple) -> ())

Sources/OpenGraph_SPI/Runtime/OGTupleType.cpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,10 @@ size_t OGTupleElementOffsetChecked(OGTupleType tuple_type, size_t index, OGTypeI
137137
#endif
138138
}
139139

140-
void *update(void* dst_ptr, const void *src_ptr, const OG::swift::metadata * metadata, OGTupleCopyOptions mode) {
140+
void *update(void* dst_ptr, const void *src_ptr, const OG::swift::metadata * metadata, OGTupleCopyOptions options) {
141141
auto dst = reinterpret_cast<swift::OpaqueValue *>(dst_ptr);
142142
auto src = reinterpret_cast<swift::OpaqueValue *>(const_cast<void *>(src_ptr));
143-
switch (mode) {
143+
switch (options) {
144144
case OGTupleCopyOptionsAssignCopy:
145145
return metadata->vw_assignWithCopy(dst, src);
146146
case OGTupleCopyOptionsInitCopy:
@@ -150,11 +150,11 @@ void *update(void* dst_ptr, const void *src_ptr, const OG::swift::metadata * met
150150
case OGTupleCopyOptionsInitTake:
151151
return metadata->vw_initializeWithTake(dst, src);
152152
default:
153-
OG::precondition_failure("unknown copy options: %d", mode);
153+
OG::precondition_failure("unknown copy options: %d", options);
154154
}
155155
}
156156

157-
void *OGTupleSetElement(OGTupleType tuple_type, void* tuple_value, size_t index, const void *element_value, OGTypeID check_type, OGTupleCopyOptions mode) {
157+
void *OGTupleSetElement(OGTupleType tuple_type, void* tuple_value, size_t index, const void *element_value, OGTypeID check_type, OGTupleCopyOptions options) {
158158
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
159159
auto metadata = reinterpret_cast<OG::swift::metadata const*>(tuple_type);
160160
if (metadata->getKind() != swift::MetadataKind::Tuple) {
@@ -164,7 +164,7 @@ void *OGTupleSetElement(OGTupleType tuple_type, void* tuple_value, size_t index,
164164
if (reinterpret_cast<OGTypeID>(metadata) != check_type) {
165165
OG::precondition_failure("element type mismatch");
166166
}
167-
return update(tuple_value, element_value, metadata, mode);
167+
return update(tuple_value, element_value, metadata, options);
168168
}
169169
auto tuple_metadata = reinterpret_cast<const swift::TupleTypeMetadata *>(metadata);
170170
if (tuple_metadata->NumElements <= index) {
@@ -174,13 +174,13 @@ void *OGTupleSetElement(OGTupleType tuple_type, void* tuple_value, size_t index,
174174
if (reinterpret_cast<OGTypeID>(element.Type) != check_type) {
175175
OG::precondition_failure("element type mismatch");
176176
}
177-
return update((void *)((intptr_t)tuple_value + index), element_value, metadata, mode);
177+
return update((void *)(element.findIn(reinterpret_cast<swift::OpaqueValue *>(tuple_value))), element_value, reinterpret_cast<const OG::swift::metadata *>(element.Type), options);
178178
#else
179179
return nullptr;
180180
#endif
181181
}
182182

183-
void *OGTupleGetElement(OGTupleType tuple_type, void* tuple_value, size_t index, void *element_value, OGTypeID check_type, OGTupleCopyOptions mode) {
183+
void *OGTupleGetElement(OGTupleType tuple_type, void* tuple_value, size_t index, void *element_value, OGTypeID check_type, OGTupleCopyOptions options) {
184184
#ifdef OPENGRAPH_SWIFT_TOOLCHAIN_SUPPORTED
185185
auto metadata = reinterpret_cast<OG::swift::metadata const*>(tuple_type);
186186
if (metadata->getKind() != swift::MetadataKind::Tuple) {
@@ -190,7 +190,7 @@ void *OGTupleGetElement(OGTupleType tuple_type, void* tuple_value, size_t index,
190190
if (reinterpret_cast<OGTypeID>(metadata) != check_type) {
191191
OG::precondition_failure("element type mismatch");
192192
}
193-
return update(element_value, tuple_value, metadata, mode);
193+
return update(element_value, tuple_value, metadata, options);
194194
}
195195
auto tuple_metadata = reinterpret_cast<const swift::TupleTypeMetadata *>(metadata);
196196
if (tuple_metadata->NumElements <= index) {
@@ -200,7 +200,7 @@ void *OGTupleGetElement(OGTupleType tuple_type, void* tuple_value, size_t index,
200200
if (reinterpret_cast<OGTypeID>(element.Type) != check_type) {
201201
OG::precondition_failure("element type mismatch");
202202
}
203-
return update(element_value, (const void *)((intptr_t)tuple_value + index), metadata, mode);
203+
return update(element_value, (const void *)(element.findIn(reinterpret_cast<swift::OpaqueValue *>(tuple_value))), reinterpret_cast<const OG::swift::metadata *>(element.Type), options);
204204
#else
205205
return nullptr;
206206
#endif

Sources/OpenGraph_SPI/Runtime/OGTupleType.h

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,19 @@ typedef OG_CLOSED_ENUM(uint32_t, OGTupleCopyOptions) {
2222
OGTupleCopyOptionsInitTake = 3
2323
} OG_SWIFT_NAME(TupleType.CopyOptions);
2424

25-
typedef struct OGUnsafeTuple {
25+
struct OGUnsafeTuple {
2626
OGTupleType type;
2727
const void *value;
28-
} OGUnsafeTuple OG_SWIFT_NAME(UnsafeTuple);
28+
} OG_SWIFT_NAME(UnsafeTuple);
2929

30-
typedef struct OGUnsafeMutableTuple {
30+
typedef struct OGUnsafeTuple OGUnsafeTuple;
31+
32+
struct OGUnsafeMutableTuple {
3133
OGTupleType type;
3234
void *value;
33-
} OGUnsafeMutableTuple OG_SWIFT_NAME(UnsafeMutableTuple);
35+
} OG_SWIFT_NAME(UnsafeMutableTuple);
36+
37+
typedef struct OGUnsafeMutableTuple OGUnsafeMutableTuple;
3438

3539
OG_EXTERN_C_BEGIN
3640

@@ -78,6 +82,10 @@ OG_EXPORT
7882
OG_REFINED_FOR_SWIFT
7983
void OGTupleDestoryElement(OGTupleType tuple_type, void *buffer, size_t index) OG_SWIFT_NAME(TupleType.destory(self:_:at:));
8084

85+
OG_EXPORT
86+
OG_REFINED_FOR_SWIFT
87+
void OGTupleWithBuffer(OGTupleType tuple_type, size_t count, const void (*_Nullable function)(const void * _Nullable context OG_SWIFT_CONTEXT) OG_SWIFT_CC(swift), const void * _Nullable context);
88+
8189
OG_EXTERN_C_END
8290

8391
OG_ASSUME_NONNULL_END

Tests/OpenGraphCompatibilityTests/Runtime/TupleTypeTests.swift

Lines changed: 92 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,97 @@
44

55
import Testing
66

7-
@Suite(.disabled(if: !compatibilityTestEnabled, "OGTupleType is not implemented"))
7+
@Suite(.enabled(if: swiftToolchainSupported))
88
struct TupleTypeTests {
9+
class T1 {
10+
var a = 0
11+
var b: Double = 0
12+
}
13+
14+
struct T2 {
15+
var a: Int = 0
16+
var b: Double = 0
17+
}
18+
19+
enum T3 {
20+
case a, b
21+
}
22+
23+
@Test
24+
func initType() {
25+
#expect(TupleType(T1.self).rawValue == Metadata(T1.self).rawValue)
26+
#expect(TupleType([T1.self, T2.self]).rawValue == Metadata((T1, T2).self).rawValue)
27+
#expect(TupleType([T1.self, T2.self, T3.self]).rawValue == Metadata((T1, T2, T3).self).rawValue)
28+
}
29+
30+
31+
@Test
32+
func type() {
33+
#expect(TupleType([T1.self, T2.self, T3.self]).type == (T1, T2, T3).self)
34+
}
35+
36+
@Test(arguments:[
37+
(TupleType(Void.self), true, 0 ..< 0),
38+
(TupleType(T1.self), false, 0 ..< 1),
39+
(TupleType([T1.self, T2.self]), false, 0 ..< 2),
40+
])
41+
func collectionAPI(tupleType: TupleType, expectedIsEmpty: Bool, expectedIndices: Range<Int>) {
42+
#expect(tupleType.isEmpty == expectedIsEmpty)
43+
#expect(tupleType.indices == expectedIndices)
44+
}
45+
46+
@Test
47+
func elementTypeAndOffset() {
48+
let tupleType = TupleType([T1.self, T2.self, T3.self])
49+
#expect(tupleType.type(at: 0) == T1.self)
50+
#expect(tupleType.type(at: 1) == T2.self)
51+
#expect(tupleType.type(at: 2) == T3.self)
52+
53+
#expect(tupleType.offset(at: 0, as: T1.self) == 0)
54+
#expect(tupleType.offset(at: 1, as: T2.self) == 8)
55+
#expect(tupleType.offset(at: 2, as: T3.self) == 24)
56+
}
57+
58+
@Test
59+
func getAndSetElement() {
60+
let tupleType = TupleType([T1.self, T2.self])
61+
var tuple = (T1(), T2())
62+
#expect(tuple.0.a == 0)
63+
#expect(tuple.0.b == 0)
64+
#expect(tuple.1.a == 0)
65+
#expect(tuple.1.b == 0)
66+
67+
var newT1 = T1()
68+
newT1.a = 1
69+
var newT2 = T2(a: 2)
70+
71+
withUnsafeMutablePointer(to: &tuple) { tuplePointer in
72+
withUnsafePointer(to: newT1) {
73+
tupleType.setElement(in: tuplePointer, at: 0, from: $0, options: .assignCopy)
74+
}
75+
#expect(tuplePointer.pointee.0.a == 1)
76+
#expect(tuplePointer.pointee.1.a == 0)
77+
withUnsafePointer(to: newT2) {
78+
tupleType.setElement(in: tuplePointer, at: 1, from: $0, options: .assignCopy)
79+
}
80+
#expect(tuplePointer.pointee.0.a == 1)
81+
#expect(tuplePointer.pointee.1.a == 2)
82+
}
83+
84+
tuple.0.a = 3
85+
tuple.1.a = 4
86+
87+
withUnsafeMutablePointer(to: &tuple) { tuplePointer in
88+
withUnsafeMutablePointer(to: &newT1) {
89+
tupleType.getElement(in: tuplePointer, at: 0, to: $0, options: .assignCopy)
90+
}
91+
#expect(newT1.a == 3)
92+
#expect(newT2.a == 2)
93+
94+
withUnsafeMutablePointer(to: &newT2) {
95+
tupleType.getElement(in: tuplePointer, at: 1, to: $0, options: .assignCopy)
96+
}
97+
#expect(newT2.a == 4)
98+
}
99+
}
9100
}

0 commit comments

Comments
 (0)