Files
swift-mirror/test/stdlib/collection-combinatorics.swift.gyb
Saleem Abdulrasool b67d5f0cf7 test: convert rm -rf && mkdir -p into %empty-directory
This converts the instances of the pattern for which we have a proper
substitution in lit.  This will make it easier to replace it
appropriately with Windows equivalents.
2018-03-06 14:30:54 -08:00

71 lines
2.1 KiB
Swift

// RUN: %empty-directory(%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<C: Collection>(_: 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 = DefaultIndices<${indexLabel}${mutable}${rangeReplaceable}${capability}Butt>
% end
}