Skip to content

Commit 18c0c44

Browse files
committed
add another increment function useful for generation-counted pointers
1 parent 0eb3725 commit 18c0c44

File tree

3 files changed

+39
-35
lines changed

3 files changed

+39
-35
lines changed

Sources/CAtomics/include/CAtomics.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -315,18 +315,22 @@ CLANG_ATOMICS_POINTER_GENERATE(AtomicOptionalOpaquePointer, atomic_uintptr_t, st
315315
#define CLANG_ATOMICS_TAGGED_POINTER_CREATE(swiftType, pointerType, nullability) \
316316
static __inline__ __attribute__((__always_inline__)) \
317317
SWIFT_NAME(swiftType.init(_:tag:)) \
318-
swiftType swiftType##Create(pointerType nullability ptr, long tag) \
319-
{ swiftType s; s.tag = tag; s.ptr = ptr; return s; }
318+
swiftType swiftType##Create(pointerType nullability p, long tag) \
319+
{ swiftType s; s.tag = tag; s.ptr = p; return s; }
320320

321-
#define CLANG_ATOMICS_TAGGED_POINTER_INCREMENT(swiftType) \
321+
#define CLANG_ATOMICS_TAGGED_POINTER_INCREMENT(swiftType, pointerType, nullability) \
322322
static __inline__ __attribute__((__always_inline__)) \
323323
SWIFT_NAME(swiftType.increment(self:)) \
324324
void swiftType##Increment(swiftType *_Nonnull ptr) \
325325
{ ptr->tag++; } \
326326
static __inline__ __attribute__((__always_inline__)) \
327327
SWIFT_NAME(swiftType.incremented(self:)) \
328328
swiftType swiftType##Incremented(swiftType t) \
329-
{ swiftType s; s = t; s.tag++; return s; }
329+
{ swiftType s; s = t; s.tag++; return s; } \
330+
static __inline__ __attribute__((__always_inline__)) \
331+
SWIFT_NAME(swiftType.incremented(self:with:)) \
332+
swiftType swiftType##IncrementedWith(swiftType t, pointerType nullability p) \
333+
{ swiftType s; s.tag = t.tag+1; s.ptr = p; return s; }
330334

331335
#define CLANG_ATOMICS_TAGGED_POINTER_INITIALIZE(atomicType, structType) \
332336
static __inline__ __attribute__((__always_inline__)) \
@@ -387,7 +391,7 @@ CLANG_ATOMICS_POINTER_GENERATE(AtomicOptionalOpaquePointer, atomic_uintptr_t, st
387391
#define CLANG_ATOMICS_TAGGED_POINTER_GENERATE(swiftType, pointerType, nullability) \
388392
CLANG_ATOMICS_TAGGED_POINTER_STRUCT(swiftType, __UNION_TYPE, pointerType, nullability) \
389393
CLANG_ATOMICS_TAGGED_POINTER_CREATE(swiftType, pointerType, nullability) \
390-
CLANG_ATOMICS_TAGGED_POINTER_INCREMENT(swiftType)
394+
CLANG_ATOMICS_TAGGED_POINTER_INCREMENT(swiftType, pointerType, nullability)
391395

392396
#define CLANG_ATOMICS_ATOMIC_TAGGED_POINTER_GENERATE(atomicType, structType, alignment) \
393397
CLANG_ATOMICS_STRUCT(atomicType, _Atomic(__UNION_TYPE), alignment) \

Tests/CAtomicsTests/CAtomicsTests.swift

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,7 @@ extension CAtomicsBasicTests
10351035
{
10361036
let r0 = TaggedRawPointer(UnsafeRawPointer(bitPattern: UInt.randomPositive())!, tag: 2)
10371037
var r1 = r0
1038-
let r2 = TaggedRawPointer(UnsafeRawPointer(bitPattern: UInt.randomPositive())!, tag: 5)
1038+
let r2 = TaggedRawPointer(UnsafeRawPointer(bitPattern: UInt.randomPositive())!, tag: 4)
10391039

10401040
XCTAssertEqual(MemoryLayout<TaggedRawPointer>.size, MemoryLayout<UnsafeRawPointer>.size*2)
10411041

@@ -1046,12 +1046,12 @@ extension CAtomicsBasicTests
10461046
XCTAssertEqual(r0.tag &+ 1, r1.tag)
10471047

10481048
XCTAssertEqual(r1.tag, 3)
1049-
r1.increment()
1050-
XCTAssertEqual(r1.tag, 4)
1051-
r1.increment()
1052-
XCTAssertEqual(r1.tag, r2.tag)
1053-
XCTAssertNotEqual(r1.ptr, r2.ptr)
1049+
r1 = r0.incremented(with: r2.ptr)
1050+
XCTAssertEqual(r0.tag &+ 1, r1.tag)
1051+
XCTAssertEqual(r1.ptr, r2.ptr)
10541052
XCTAssertNotEqual(r1, r2)
1053+
r1.increment()
1054+
XCTAssertEqual(r1, r2)
10551055

10561056
let r3 = r2.incremented()
10571057
XCTAssertNotEqual(r2, r3)
@@ -1132,7 +1132,7 @@ extension CAtomicsBasicTests
11321132
{
11331133
let r0 = TaggedMutableRawPointer(UnsafeMutableRawPointer(bitPattern: UInt.randomPositive())!, tag: 2)
11341134
var r1 = r0
1135-
let r2 = TaggedMutableRawPointer(UnsafeMutableRawPointer(bitPattern: UInt.randomPositive())!, tag: 5)
1135+
let r2 = TaggedMutableRawPointer(UnsafeMutableRawPointer(bitPattern: UInt.randomPositive())!, tag: 4)
11361136

11371137
XCTAssertEqual(MemoryLayout<TaggedMutableRawPointer>.size, MemoryLayout<UnsafeMutableRawPointer>.size*2)
11381138

@@ -1143,12 +1143,12 @@ extension CAtomicsBasicTests
11431143
XCTAssertEqual(r0.tag &+ 1, r1.tag)
11441144

11451145
XCTAssertEqual(r1.tag, 3)
1146-
r1.increment()
1147-
XCTAssertEqual(r1.tag, 4)
1148-
r1.increment()
1149-
XCTAssertEqual(r1.tag, r2.tag)
1150-
XCTAssertNotEqual(r1.ptr, r2.ptr)
1146+
r1 = r0.incremented(with: r2.ptr)
1147+
XCTAssertEqual(r0.tag &+ 1, r1.tag)
1148+
XCTAssertEqual(r1.ptr, r2.ptr)
11511149
XCTAssertNotEqual(r1, r2)
1150+
r1.increment()
1151+
XCTAssertEqual(r1, r2)
11521152

11531153
let r3 = r2.incremented()
11541154
XCTAssertNotEqual(r2, r3)
@@ -1229,7 +1229,7 @@ extension CAtomicsBasicTests
12291229
{
12301230
let r0 = TaggedOptionalRawPointer(UnsafeRawPointer(bitPattern: UInt.randomPositive()), tag: 2)
12311231
var r1 = r0
1232-
let r2 = TaggedOptionalRawPointer(UnsafeRawPointer(bitPattern: UInt.randomPositive()), tag: 5)
1232+
let r2 = TaggedOptionalRawPointer(UnsafeRawPointer(bitPattern: UInt.randomPositive()), tag: 4)
12331233

12341234
XCTAssertEqual(MemoryLayout<TaggedOptionalRawPointer>.size, MemoryLayout<UnsafeRawPointer>.size*2)
12351235

@@ -1240,12 +1240,12 @@ extension CAtomicsBasicTests
12401240
XCTAssertEqual(r0.tag &+ 1, r1.tag)
12411241

12421242
XCTAssertEqual(r1.tag, 3)
1243-
r1.increment()
1244-
XCTAssertEqual(r1.tag, 4)
1245-
r1.increment()
1246-
XCTAssertEqual(r1.tag, r2.tag)
1247-
XCTAssertNotEqual(r1.ptr, r2.ptr)
1243+
r1 = r0.incremented(with: r2.ptr)
1244+
XCTAssertEqual(r0.tag &+ 1, r1.tag)
1245+
XCTAssertEqual(r1.ptr, r2.ptr)
12481246
XCTAssertNotEqual(r1, r2)
1247+
r1.increment()
1248+
XCTAssertEqual(r1, r2)
12491249

12501250
let r3 = r2.incremented()
12511251
XCTAssertNotEqual(r2, r3)
@@ -1326,7 +1326,7 @@ extension CAtomicsBasicTests
13261326
{
13271327
let r0 = TaggedOptionalMutableRawPointer(UnsafeMutableRawPointer(bitPattern: UInt.randomPositive()), tag: 2)
13281328
var r1 = r0
1329-
let r2 = TaggedOptionalMutableRawPointer(UnsafeMutableRawPointer(bitPattern: UInt.randomPositive()), tag: 5)
1329+
let r2 = TaggedOptionalMutableRawPointer(UnsafeMutableRawPointer(bitPattern: UInt.randomPositive()), tag: 4)
13301330

13311331
XCTAssertEqual(MemoryLayout<TaggedOptionalMutableRawPointer>.size, MemoryLayout<UnsafeMutableRawPointer>.size*2)
13321332

@@ -1337,12 +1337,12 @@ extension CAtomicsBasicTests
13371337
XCTAssertEqual(r0.tag &+ 1, r1.tag)
13381338

13391339
XCTAssertEqual(r1.tag, 3)
1340-
r1.increment()
1341-
XCTAssertEqual(r1.tag, 4)
1342-
r1.increment()
1343-
XCTAssertEqual(r1.tag, r2.tag)
1344-
XCTAssertNotEqual(r1.ptr, r2.ptr)
1340+
r1 = r0.incremented(with: r2.ptr)
1341+
XCTAssertEqual(r0.tag &+ 1, r1.tag)
1342+
XCTAssertEqual(r1.ptr, r2.ptr)
13451343
XCTAssertNotEqual(r1, r2)
1344+
r1.increment()
1345+
XCTAssertEqual(r1, r2)
13461346

13471347
let r3 = r2.incremented()
13481348
XCTAssertNotEqual(r2, r3)

Tests/CAtomicsTests/CAtomicsTests.swift.gyb

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ extension CAtomicsBasicTests
218218
% bang = '!' if (optional is '') else ''
219219
let r0 = ${taggedType}(${nativeType}(bitPattern: UInt.randomPositive())${bang}, tag: 2)
220220
var r1 = r0
221-
let r2 = ${taggedType}(${nativeType}(bitPattern: UInt.randomPositive())${bang}, tag: 5)
221+
let r2 = ${taggedType}(${nativeType}(bitPattern: UInt.randomPositive())${bang}, tag: 4)
222222

223223
XCTAssertEqual(MemoryLayout<${taggedType}>.size, MemoryLayout<${nativeType}>.size*2)
224224

@@ -229,12 +229,12 @@ extension CAtomicsBasicTests
229229
XCTAssertEqual(r0.tag &+ 1, r1.tag)
230230

231231
XCTAssertEqual(r1.tag, 3)
232-
r1.increment()
233-
XCTAssertEqual(r1.tag, 4)
234-
r1.increment()
235-
XCTAssertEqual(r1.tag, r2.tag)
236-
XCTAssertNotEqual(r1.ptr, r2.ptr)
232+
r1 = r0.incremented(with: r2.ptr)
233+
XCTAssertEqual(r0.tag &+ 1, r1.tag)
234+
XCTAssertEqual(r1.ptr, r2.ptr)
237235
XCTAssertNotEqual(r1, r2)
236+
r1.increment()
237+
XCTAssertEqual(r1, r2)
238238

239239
let r3 = r2.incremented()
240240
XCTAssertNotEqual(r2, r3)

0 commit comments

Comments
 (0)