File: protocol-conformance.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (104 lines) | stat: -rw-r--r-- 2,454 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// RUN: %target-run-simple-swift(-I %S/Inputs/ -Xfrontend -enable-experimental-cxx-interop)

// REQUIRES: executable_test

import StdlibUnittest
import ProtocolConformance

protocol TestMethods {
  init(_: DummyStruct)
  mutating func test1()
  mutating func test2(_: Int32)
  mutating func test3(_: Int32, _: UInt32) -> CChar
}

protocol CanReturn42 {
  mutating func return42() -> Int32
}

extension CanReturn42 {
  mutating func return42() -> Int32 { 0 }
}

protocol DefaultInitializable {
  init()
}

extension NonTrivial : TestMethods { }
extension NonTrivial : DefaultInitializable { }

extension Trivial : TestMethods { }
extension Trivial : DefaultInitializable { }

extension Trivial : CanReturn42 { }
extension ConformsToProtocol : CanReturn42 { }

@inline(never)
@_optimize(none)
func tryReturn42(_ _p: CanReturn42) -> Int32 {
  var p = _p
  return p.return42()
}

@inline(never)
@_optimize(none)
func makeIt<T : DefaultInitializable>(_ _: T.Type) -> T { T() }

@inline(never)
@_optimize(none)
func makeItWithDummy<T : TestMethods>(_ _: T.Type) -> T { T(DummyStruct()) }

@inline(never)
@_optimize(none)
func callTestMethods(on _subject: TestMethods) -> CChar {
  var subject = _subject
  subject.test1()
  subject.test2(0 as Int32)
  return subject.test3(0 as Int32, 1 as UInt32)
}

struct Holder<T : DefaultInitializable & TestMethods> {
  var value: DefaultInitializable & TestMethods = T()
}

@inline(never)
@_optimize(none)
func callTestMethods<T : TestMethods>(on subject: Holder<T>) -> CChar {
  callTestMethods(on: subject.value)
}

var ExtendedTypes = TestSuite("Extended C++ Types")

ExtendedTypes.test("(Don't) Use default impl") {
  let noMethod = Trivial()
  expectEqual(0, tryReturn42(noMethod))

  let hasMethod = ConformsToProtocol()
  expectEqual(42, tryReturn42(hasMethod))
}

ExtendedTypes.test("Constrained generic") {
  var trivial = makeIt(Trivial.self)
  var result = callTestMethods(on: trivial)
  expectEqual(42, result)
  
  let nonTrivial = makeIt(NonTrivial.self)
  result = callTestMethods(on: nonTrivial)
  expectEqual(42, result)
  
  trivial = makeItWithDummy(Trivial.self)
  result = callTestMethods(on: trivial)
  expectEqual(42, result)
}

ExtendedTypes.test("Generic struct") {
  var hold = Holder<Trivial>()
  var result = callTestMethods(on: hold)
  expectEqual(42, result)
  
  hold.value = makeItWithDummy(NonTrivial.self)
  result = callTestMethods(on: hold)
  expectEqual(42, result)
}

runAllTests()