mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
This hook allows Set.find() to be equally efficient in static and generic contexts. This time, with correct tests. Swift SVN r27404
97 lines
2.9 KiB
Plaintext
97 lines
2.9 KiB
Plaintext
//===--- CollectionAlgorithms.swift.gyb -----------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See http://swift.org/LICENSE.txt for license information
|
|
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
%{
|
|
|
|
# We know we will eventually get a SequenceType.Element type. Define
|
|
# a shorthand that we can use today.
|
|
GElement = "Generator.Element"
|
|
|
|
}%
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// isEmpty
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
extension CollectionType {
|
|
// FIXME: dynamic dispatch for Set and Dictionary.
|
|
final public var _prext_isEmpty: Bool {
|
|
return startIndex == endIndex
|
|
}
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// first
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
extension CollectionType {
|
|
final public var _prext_first: Generator.Element? {
|
|
return _prext_isEmpty ? nil : self[startIndex]
|
|
}
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// find()
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
extension CollectionType where Self.${GElement} : Equatable {
|
|
/// Returns the first index where `value` appears in `self` or `nil` if
|
|
/// `value` is not found.
|
|
///
|
|
/// Complexity: O(\ `self.count()`\ )
|
|
final public func _prext_find(element: ${GElement}) -> Index? {
|
|
if let result? = _customFindEquatableElement(element) {
|
|
return result
|
|
}
|
|
|
|
for i in self._prext_indices {
|
|
if self[i] == element {
|
|
return i
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
extension CollectionType {
|
|
/// Returns the first index where `predicate` returns `true` for the
|
|
/// corresponding value, or `nil` if such value is not found.
|
|
///
|
|
/// Complexity: O(\ `self.count()`\ )
|
|
final public func _prext_find(
|
|
@noescape predicate: (${GElement}) -> Bool
|
|
) -> Index? {
|
|
for i in indices(self) {
|
|
if predicate(self[i]) {
|
|
return i
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// indices()
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
extension CollectionType {
|
|
/// Return the range of valid index values.
|
|
///
|
|
/// The result's `endIndex` is the same as that of `self`. Because
|
|
/// `Range` is half-open, iterating the values of the result produces
|
|
/// all valid subscript arguments for `self`, omitting its `endIndex`.
|
|
final public var _prext_indices: Range<Index> {
|
|
return Range(start: startIndex, end: endIndex)
|
|
}
|
|
}
|
|
|