// RUN: rm -rf %t // RUN: mkdir -p %t // RUN: %gyb %s > %t/collection-combinatorics.swift // RUN: %target-swift-frontend -typecheck -verify %t/collection-combinatorics.swift // It should be possible to conform to any combination of // (1 + RangeReplaceable) * (1 + Bidirectional + RandomAccess) * (1 + Mutable) // Collection and get reasonable default implementations for slicing // operations from the standard library. struct CustomIndex : Comparable { static func <(lhs: CustomIndex, rhs: CustomIndex) -> Bool { return false } static func ==(lhs: CustomIndex, rhs: CustomIndex) -> Bool { return false } static var min: CustomIndex { return CustomIndex() } static var max: CustomIndex { return CustomIndex() } } % for mutable in ['', 'Mutable']: % for rangeReplaceable in ['', 'RangeReplaceable']: % for capability in ['', 'Bidirectional', 'RandomAccess']: % for index in ['Int', 'CustomIndex']: % indexLabel = 'Custom' if index == 'CustomIndex' else '' /// A rump implementation of Collection. struct ${indexLabel}${mutable}${rangeReplaceable}${capability}Butt : ${mutable}Collection % if rangeReplaceable: , ${rangeReplaceable}Collection % end % if capability: , ${capability}Collection % end { subscript(i: ${index}) -> Int { get { return 0 } % if mutable: set { } % end } % if capability: func index(before i: ${index}) -> ${index} { return i } % end func index(after i: ${index}) -> ${index} { return i } var startIndex: ${index} { return .min } var endIndex: ${index} { return .max } % if rangeReplaceable: init() {} mutating func replaceSubrange(_: Range<${index}>, with: C) where C.Iterator.Element == Int {} % end % if capability == 'RandomAccess' and index == 'CustomIndex': // This type alias is required for some random-access collections with // a custom index type -- without it the default implementation for // `indices` doesn't attach. typealias Indices = DefaultRandomAccessIndices<${indexLabel}${mutable}${rangeReplaceable}${capability}Butt> % end }