blob: 111faa83f48bd4b6e9c038494bd8e8c254a7b4e8 [file] [log] [blame]
// 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
}