Files
swift-mirror/test/stdlib/swap.swift
Karoy Lorentey ab51f1630c [stdlib] API additions for basic noncopyable primitives
- Add `exchange(_:with:)`
- Add `Optional.take()`
- Add `Unsafe[Mutable]BufferPointer.extracting(_:)`
- Finish generalizing `withExtendedLifetime`
- Radically simplify the implementation of `swap(_:_:)`
2024-06-07 14:09:53 -07:00

79 lines
1.5 KiB
Swift

// RUN: %target-run-simple-swift
// REQUIRES: executable_test
import StdlibUnittest
var suite = TestSuite("Unmanaged")
defer { runAllTests() }
struct Counted: ~Copyable {
let value: Int
static var instances: Int = 0
init(_ value: Int) {
self.value = value
Counted.instances += 1
}
deinit {
Counted.instances -= 1
expectGE(Counted.instances, 0)
}
}
suite.test("swap.Int") {
var a = 1
var b = 2
swap(&a, &b)
expectEqual(a, 2)
expectEqual(b, 1)
}
suite.test("exchange.Int") {
var a = 1
let old = exchange(&a, with: 2)
expectEqual(old, 1)
expectEqual(a, 2)
}
suite.test("swap.class") {
var a = LifetimeTracked(10)
var b = LifetimeTracked(20)
swap(&a, &b)
expectEqual(LifetimeTracked.instances, 2)
expectEqual(a.value, 20)
expectEqual(b.value, 10)
}
suite.test("exchange.class") {
var a = LifetimeTracked(10)
let old = exchange(&a, with: LifetimeTracked(20))
expectEqual(LifetimeTracked.instances, 2)
expectEqual(old.value, 10)
expectEqual(a.value, 20)
}
suite.test("swap.noncopyable") {
var a = Counted(10)
var b = Counted(20)
expectEqual(Counted.instances, 2)
swap(&a, &b)
expectEqual(Counted.instances, 2)
expectEqual(a.value, 20)
expectEqual(b.value, 10)
_ = consume a
_ = consume b
expectEqual(Counted.instances, 0)
}
suite.test("exchange.noncopyable") {
var a = Counted(10)
let old = exchange(&a, with: Counted(20))
expectEqual(Counted.instances, 2)
expectEqual(a.value, 20)
expectEqual(old.value, 10)
_ = consume old
_ = consume a
expectEqual(Counted.instances, 0)
}