File: dump_api.swift

package info (click to toggle)
swiftlang 6.1.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,791,532 kB
  • sloc: cpp: 9,901,743; ansic: 2,201,431; asm: 1,091,827; python: 308,252; objc: 82,166; f90: 80,126; lisp: 38,358; pascal: 25,559; sh: 20,429; ml: 5,058; perl: 4,745; makefile: 4,484; awk: 3,535; javascript: 3,018; xml: 918; fortran: 664; cs: 573; ruby: 396
file content (65 lines) | stat: -rw-r--r-- 2,187 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
// RUN: %target-swift-frontend -typecheck %s -dump-api-path %t.dump
// RUN: diff -u %S/Inputs/dumped_api.swift %t.dump/dump_api.swift

public class _AnyIteratorBase {}

/// An abstract `IteratorProtocol` base class over `T` elements.
///
/// Use this as a `Sequence`'s associated `Iterator` type when you
/// don't want to expose details of the concrete iterator, a subclass.
///
/// It is an error to create instances of `AnyIterator` that are not
/// also instances of an `AnyIterator` subclass.
///
/// See also:
///
///     struct AnySequence<S: Sequence>
///     func anyIterator<I: IteratorProtocol>(base: I) -> AnyIterator<I.Element>
///     func anyIterator<T>(nextImplementation: () -> T?) -> AnyIterator<T>
public class AnyIterator<T> : _AnyIteratorBase, IteratorProtocol {
  /// Initialize the instance.  May only be called from a subclass
  /// initializer.
  override public init() {
    super.init()
  }

  /// Advance to the next element and return it, or `nil` if no next
  /// element exists.
  ///
  /// Note: subclasses must override this method.
  public func next() -> T? {fatalError("abstract")}
}

/// Every `IteratorProtocol` can also be a `Sequence`.  Note that
/// traversing the sequence consumes the iterator.
extension AnyIterator : Sequence {
  /// Returns `self`.
  public func makeIterator() -> AnyIterator { return self }
}

/// Return a `IteratorProtocol` instance that wraps `base` but whose type
/// depends only on the type of `I.Element`.
///
/// Example:
///
///     func countStrings() -> AnyIterator<String> {
///       let lazyStrings = lazy(0..<10).map { String($0) }
///
///       // This is a really complicated type of no interest to our
///       // clients.
///       let g: MapSequenceIterator<RangeIterator<Int>, String>
///         = lazyStrings.makeIterator()
///       return anyIterator(g)
///     }
public func anyIterator<I: IteratorProtocol>(base: I) -> AnyIterator<I.Element> {
  return FooIteratorBox(base)
}

public class FooIteratorBox<
  Base: IteratorProtocol
> : AnyIterator<Base.Element> {
  init(_ base: Base) { self.base = base }
  public override func next() -> Base.Element? { return base.next() }
  var base: Base
}