22// RUN: -disable-experimental-parser-round-trip \
33// RUN: -enable-experimental-feature NonescapableTypes \
44// RUN: -enable-experimental-feature NoncopyableGenerics \
5- // RUN: -enable-experimental-lifetime-dependence-inference \
65// RUN: -disable-lifetime-dependence-diagnostics
76
87// REQUIRES: asserts
98// REQUIRES: swift_in_compiler
10- // REQUIRES: noncopyable_generics
11-
12- // FIXME(NCG): This requires nonescaping Optionals.
13- // XFAIL: *
149
1510// TODO: Use real Range
1611public struct FakeRange < Bound> {
@@ -67,7 +62,7 @@ public struct BufferView<Element> : ~Escapable {
6762 private var baseAddress : UnsafeRawPointer { start. _rawValue }
6863// TODO: Enable diagnostics once this initializer's store to temporary is handled
6964// CHECK: sil @$s31lifetime_dependence_scope_fixup10BufferViewV11baseAddress5count9dependsOnACyxGSVYls_Siqd__htclufC : $@convention(method) <Element><Owner> (UnsafeRawPointer, Int, @in_guaranteed Owner, @thin BufferView<Element>.Type) -> _scope(1) @owned BufferView<Element> {
70- public init < Owner> (
65+ public init < Owner: ~ Copyable & ~ Escapable > (
7166 baseAddress: UnsafeRawPointer ,
7267 count: Int ,
7368 dependsOn owner: borrowing Owner
@@ -77,7 +72,7 @@ public struct BufferView<Element> : ~Escapable {
7772 )
7873 }
7974// CHECK: sil hidden @$s31lifetime_dependence_scope_fixup10BufferViewV5start5count9dependsOnACyxGAA0eF5IndexVyxGYls_Siqd__htclufC : $@convention(method) <Element><Owner> (BufferViewIndex<Element>, Int, @in_guaranteed Owner, @thin BufferView<Element>.Type) -> _scope(1) @owned BufferView<Element> {
80- init < Owner> (
75+ init < Owner: ~ Copyable & ~ Escapable > (
8176 start index: BufferViewIndex < Element > ,
8277 count: Int ,
8378 dependsOn owner: borrowing Owner
@@ -113,6 +108,11 @@ extension BufferView {
113108
114109 public var startIndex : Index { start }
115110 public var endIndex : Index { start. advanced ( by: count) }
111+
112+ @inlinable @inline ( __always)
113+ public func distance( from start: Index , to end: Index ) -> Int {
114+ start. distance ( to: end)
115+ }
116116
117117 public subscript( position: Index ) -> Element {
118118 get {
@@ -134,30 +134,39 @@ extension BufferView {
134134 )
135135 }
136136 }
137+
138+ borrowing public func prefix( upTo index: BufferViewIndex < Element > ) -> _borrow( self ) Self {
139+ index == startIndex
140+ ? Self ( start: start, count: 0 , dependsOn: copy self)
141+ : prefix ( through: index. advanced ( by: - 1 ) )
142+ }
143+
144+ borrowing public func prefix( through index: Index ) -> _borrow( self ) Self {
145+ let nc = distance ( from: startIndex, to: index) &+ 1
146+ return Self ( start: start, count: nc, dependsOn: copy self)
147+ }
148+
149+ consuming public func prefix( _ maxLength: Int ) -> _consume( self ) Self {
150+ precondition ( maxLength >= 0 , " Can't have a prefix of negative length. " )
151+ let nc = maxLength < count ? maxLength : count
152+ return Self ( start: start, count: nc, dependsOn: self )
153+ }
137154}
138155
139- extension Array {
140- // var view: BufferView<Element> {
141- // withUnsafeBufferPointer {
142- // return BufferView(unsafeBuffer: $0, storage: self)
143- // }
144- // }
145- // TODO: Implementation of getter should not need a temporary
146- // rdar://123071321
147- // CHECK: sil hidden @$sSa31lifetime_dependence_scope_fixupE4viewAA10BufferViewVyxGvg : $@convention(method) <Element> (@guaranteed Array<Element>) -> _scope(0) @owned BufferView<Element> {
148- var view : BufferView < Element > {
149- var _view : BufferView < Element > ? // FIXME(NCG): This is not a thing. How did this work?
150- withUnsafePointer ( to: self ) {
151- _view = BufferView ( baseAddress: $0, count: self . count, dependsOn: self )
156+ extension ContiguousArray {
157+ public var view : BufferView < Element > {
158+ borrowing _read {
159+ yield BufferView (
160+ baseAddress: _baseAddressIfContiguous!, count: count, dependsOn: self
161+ )
152162 }
153- return _view!
154163 }
155164}
156165
157- public func array_view_element( a: [ Int ] , i: BufferViewIndex < Int > ) -> Int {
166+ public func array_view_element( a: ContiguousArray < Int > , i: BufferViewIndex < Int > ) -> Int {
158167 a. view [ i]
159168}
160169
161- public func array_view_slice_element( a: [ Int ] , sliceIdx: FakeRange < BufferViewIndex < Int > > , Idx: BufferViewIndex < Int > ) -> Int {
170+ public func array_view_slice_element( a: ContiguousArray < Int > , sliceIdx: FakeRange < BufferViewIndex < Int > > , Idx: BufferViewIndex < Int > ) -> Int {
162171 a. view [ sliceIdx] [ Idx]
163172}
0 commit comments