// RUN: %target-swift-frontend %s -emit-silgen import StdlibUnittest public struct MyRange { var startIndex: Bound var endIndex: Bound } public protocol ForwardIndex : Equatable { associatedtype Distance : SignedNumeric func successor() -> Self } public protocol MySequence { associatedtype Iterator : IteratorProtocol associatedtype SubSequence = Void func makeIterator() -> Iterator var underestimatedCount: Int { get } func map( _ transform: (Iterator.Element) -> T ) -> [T] func filter( _ isIncluded: (Iterator.Element) -> Bool ) -> [Iterator.Element] func _customContainsEquatableElement( _ element: Iterator.Element ) -> Bool? func _preprocessingPass( _ preprocess: (Self) -> R ) -> R? func _copyToContiguousArray() -> ContiguousArray func _copyContents( initializing ptr: UnsafeMutablePointer ) -> UnsafeMutablePointer } extension MySequence { var underestimatedCount: Int { return 0 } public func map( _ transform: (Iterator.Element) -> T ) -> [T] { return [] } public func filter( _ isIncluded: (Iterator.Element) -> Bool ) -> [Iterator.Element] { return [] } public func _customContainsEquatableElement( _ element: Iterator.Element ) -> Bool? { return nil } public func _preprocessingPass( _ preprocess: (Self) -> R ) -> R? { return nil } public func _copyToContiguousArray() -> ContiguousArray { fatalError() } public func _copyContents( initializing ptr: UnsafeMutablePointer ) -> UnsafeMutablePointer { fatalError() } } public protocol MyIndexable : MySequence { associatedtype Index : ForwardIndex var startIndex: Index { get } var endIndex: Index { get } associatedtype _Element subscript(_: Index) -> _Element { get } } public protocol MyCollection : MyIndexable { associatedtype Iterator : IteratorProtocol = IndexingIterator associatedtype SubSequence : MySequence subscript(_: Index) -> Iterator.Element { get } subscript(_: MyRange) -> SubSequence { get } var first: Iterator.Element? { get } var isEmpty: Bool { get } var count: Index.Distance { get } func _customIndexOfEquatableElement(_ element: Iterator.Element) -> Index?? } extension MyCollection { public var isEmpty: Bool { return startIndex == endIndex } public func _preprocessingPass( _ preprocess: (Self) -> R ) -> R? { return preprocess(self) } public var count: Index.Distance { return 0 } public func _customIndexOfEquatableElement(_ element: Iterator.Element) -> Index?? { return nil } } public struct IndexingIterator : IteratorProtocol { public func next() -> I._Element? { return nil } } protocol Resettable : AnyObject { func reset() } internal var _allResettables: [Resettable] = [] public class TypeIndexed : Resettable { public init(_ value: Value) { self.defaultValue = value _allResettables.append(self) } public subscript(t: Any.Type) -> Value { get { return byType[ObjectIdentifier(t)] ?? defaultValue } set { byType[ObjectIdentifier(t)] = newValue } } public func reset() { byType = [:] } internal var byType: [ObjectIdentifier:Value] = [:] internal var defaultValue: Value } //===--- LoggingWrappers.swift --------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// public protocol Wrapper { associatedtype Base init(_: Base) var base: Base {get set} } public protocol LoggingType : Wrapper { associatedtype Log : AnyObject } extension LoggingType { public var log: Log.Type { return Log.self } public var selfType: Any.Type { return type(of: self) } } public class IteratorLog { public static func dispatchTester( _ g: G ) -> LoggingIterator> { return LoggingIterator(LoggingIterator(g)) } public static var next = TypeIndexed(0) } public struct LoggingIterator : IteratorProtocol, LoggingType { public typealias Log = IteratorLog public init(_ base: Base) { self.base = base } public mutating func next() -> Base.Element? { Log.next[selfType] += 1 return base.next() } public var base: Base } public class SequenceLog { public static func dispatchTester( _ s: S ) -> LoggingSequence> { return LoggingSequence(LoggingSequence(s)) } public static var iterator = TypeIndexed(0) public static var underestimatedCount = TypeIndexed(0) public static var map = TypeIndexed(0) public static var filter = TypeIndexed(0) public static var _customContainsEquatableElement = TypeIndexed(0) public static var _preprocessingPass = TypeIndexed(0) public static var _copyToContiguousArray = TypeIndexed(0) public static var _copyContents = TypeIndexed(0) } public protocol LoggingSequenceType : MySequence, LoggingType { associatedtype Base : MySequence associatedtype Log : AnyObject = SequenceLog associatedtype Iterator : IteratorProtocol = LoggingIterator } extension LoggingSequenceType { public var underestimatedCount: Int { SequenceLog.underestimatedCount[selfType] += 1 return base.underestimatedCount } } extension LoggingSequenceType where Log == SequenceLog, Iterator == LoggingIterator { public func makeIterator() -> LoggingIterator { Log.iterator[selfType] += 1 return LoggingIterator(base.makeIterator()) } public func map( _ transform: (Base.Iterator.Element) -> T ) -> [T] { Log.map[selfType] += 1 return base.map(transform) } public func filter( _ isIncluded: (Base.Iterator.Element) -> Bool ) -> [Base.Iterator.Element] { Log.filter[selfType] += 1 return base.filter(isIncluded) } public func _customContainsEquatableElement( _ element: Base.Iterator.Element ) -> Bool? { Log._customContainsEquatableElement[selfType] += 1 return base._customContainsEquatableElement(element) } /// If `self` is multi-pass (i.e., a `Collection`), invoke /// `preprocess` on `self` and return its result. Otherwise, return /// `nil`. public func _preprocessingPass( _ preprocess: (Self) -> R ) -> R? { Log._preprocessingPass[selfType] += 1 return base._preprocessingPass { _ in preprocess(self) } } /// Create a native array buffer containing the elements of `self`, /// in the same order. public func _copyToContiguousArray() -> ContiguousArray { Log._copyToContiguousArray[selfType] += 1 return base._copyToContiguousArray() } /// Copy a Sequence into an array. public func _copyContents( initializing ptr: UnsafeMutablePointer ) -> UnsafeMutablePointer { Log._copyContents[selfType] += 1 return base._copyContents(initializing: ptr) } } public struct LoggingSequence< Base_: MySequence > : LoggingSequenceType, MySequence { public typealias Log = SequenceLog public typealias Base = Base_ public init(_ base: Base_) { self.base = base } public var base: Base_ } public class CollectionLog : SequenceLog { public class func dispatchTester( _ c: C ) -> LoggingCollection> { return LoggingCollection(LoggingCollection(c)) } static var startIndex = TypeIndexed(0) static var endIndex = TypeIndexed(0) static var subscriptIndex = TypeIndexed(0) static var subscriptRange = TypeIndexed(0) static var isEmpty = TypeIndexed(0) static var count = TypeIndexed(0) static var _customIndexOfEquatableElement = TypeIndexed(0) static var first = TypeIndexed(0) } public protocol LoggingCollectionType : LoggingSequenceType, MyCollection { associatedtype Base : MyCollection associatedtype Index : ForwardIndex = Base.Index } extension LoggingCollectionType where Index == Base.Index { public var startIndex: Base.Index { CollectionLog.startIndex[selfType] += 1 return base.startIndex } public var endIndex: Base.Index { CollectionLog.endIndex[selfType] += 1 return base.endIndex } public subscript(position: Base.Index) -> Base.Iterator.Element { CollectionLog.subscriptIndex[selfType] += 1 return base[position] } public subscript(_prext_bounds: MyRange) -> Base.SubSequence { CollectionLog.subscriptRange[selfType] += 1 return base[_prext_bounds] } public var isEmpty: Bool { CollectionLog.isEmpty[selfType] += 1 return base.isEmpty } public var count: Base.Index.Distance { CollectionLog.count[selfType] += 1 return base.count } public func _customIndexOfEquatableElement(_ element: Base.Iterator.Element) -> Base.Index?? { CollectionLog._customIndexOfEquatableElement[selfType] += 1 return base._customIndexOfEquatableElement(element) } public var first: Base.Iterator.Element? { CollectionLog.first[selfType] += 1 return base.first } } public struct LoggingCollection : LoggingCollectionType { public typealias Iterator = LoggingIterator public typealias Log = CollectionLog public typealias Base = Base_ public typealias SubSequence = Base.SubSequence public func makeIterator() -> Iterator { return Iterator(base.makeIterator()) } public init(_ base: Base_) { self.base = base } public var base: Base_ } public func expectCustomizable< T : Wrapper where T : LoggingType, T.Base : Wrapper, T.Base : LoggingType, T.Log == T.Base.Log >(_: T, _ counters: TypeIndexed, stackTrace: SourceLocStack? = nil, file: String = #file, line: UInt = #line, collectMoreInfo: (()->String)? = nil ) { expectNotEqual( 0, counters[T.self], collectMoreInfo?() ?? "", stackTrace: stackTrace ?? SourceLocStack(), file: file, line: line) expectEqual( counters[T.self], counters[T.Base.self], collectMoreInfo?() ?? "", stackTrace: stackTrace ?? SourceLocStack(), file: file, line: line) } public func expectNotCustomizable< T : Wrapper where T : LoggingType, T.Base : Wrapper, T.Base : LoggingType, T.Log == T.Base.Log >(_: T, _ counters: TypeIndexed, stackTrace: SourceLocStack? = nil, file: String = #file, line: UInt = #line, collectMoreInfo: (()->String)? = nil ) { expectNotEqual( 0, counters[T.self], collectMoreInfo?() ?? "", stackTrace: stackTrace ?? SourceLocStack(), file: file, line: line) expectEqual( 0, counters[T.Base.self], collectMoreInfo?() ?? "", stackTrace: stackTrace ?? SourceLocStack(), file: file, line: line) }