0001 // 0002 // Deque.swift 0003 // Deque 0004 // 0005 // Created by Károly Lőrentey on 2016-01-20. 0006 // Copyright © 2016 Károly Lőrentey. 0007 // 0008 0009 import Foundation 0010 0011 //MARK: Deque 0012 0013 /// A double-ended queue type. `Deque` is an `Array`-like random-access collection of arbitrary elements 0014 /// that provides efficient insertion and deletion at both ends. 0015 /// 0016 /// Like arrays, deques are value types with copy-on-write semantics. `Deque` allocates a single buffer for 0017 /// element storage, using an exponential growth strategy. 0018 /// 0019 public struct Deque<Element
Deque.swift:46 extension Deque {Deque.swift:84 extension Deque: MutableCollectionType {Deque.swift:86 public typealias Generator = IndexingGenerator<Deque<Element>>Deque.swift:87 public typealias SubSequence = MutableSlice<Deque<Element>>Deque.swift:119 extension Deque: ArrayLiteralConvertible {Deque.swift:128 extension Deque: CustomStringConvertible, CustomDebugStringConvertible {Deque.swift:131 var result = debug ? "\(String(reflecting: Deque.self))([" : "Deque["Deque.swift:160 extension Deque: RangeReplaceableCollectionType {Deque.swift:282 extension Deque {Deque.swift:328 func == <Element: Equatable>(a: Deque<Element>, b: Deque<Element>) -> Bool {Deque.swift:328 func == <Element: Equatable>(a: Deque<Element>, b: Deque<Element>) -> Bool {Deque.swift:343 func != <Element: Equatable>(a: Deque<Element>, b: Deque<Element>) -> Bool {Deque.swift:343 func != <Element: Equatable>(a: Deque<Element>, b: Deque<Element>) -> Bool {Deque.swift:826 extension Deque {> { 0020 /// The storage for this deque. 0021 internal private(set) var buffer
Deque.swift:21 internal private(set) var buffer: DequeBuffer<Element>Deque.swift:33 public init<S: SequenceType where S.Generator.Element == Element>(_ elements: S) {Deque.swift:39 public init(count: Int, repeatedValue: Element) {: DequeBuffer<Element> 0022 0023 /// Initializes an empty deque. 0024 public init() { 0025 buffer = DequeBuffer() 0026 } 0027 /// Initializes an empty deque that is able to store at least `minimumCapacity` items without reallocating its storage. 0028 public init
Deque.swift:25 buffer = DequeBuffer()Deque.swift:29 buffer = DequeBuffer(capacity: minimumCapacity)Deque.swift:40 buffer = DequeBuffer(count: count, repeatedValue: repeatedValue)Deque.swift:48 var capacity: Int { return buffer.capacity }Deque.swift:57 guard buffer.capacity < minimumCapacity else { return }Deque.swift:58 if isUniquelyReferenced(&buffer) {Deque.swift:59 buffer = buffer.realloc(minimumCapacity)Deque.swift:59 buffer = buffer.realloc(minimumCapacity)Deque.swift:63 new.insertContentsOf(buffer, at: 0)Deque.swift:64 buffer = newDeque.swift:68 internal var isUnique: Bool { mutating get { return isUniquelyReferenced(&buffer) } }Deque.swift:71 self.makeUniqueWithCapacity(buffer.capacity)Deque.swift:75 guard !isUnique || buffer.capacity < capacity else { return }Deque.swift:77 copy.insertContentsOf(buffer, at: 0)Deque.swift:78 buffer = copyDeque.swift:90 public var count: Int { return buffer.count }Deque.swift:108 return buffer[index]Deque.swift:112 buffer[index] = valueDeque.swift:121 self.buffer = DequeBuffer(capacity: elements.count)Deque.swift:122 buffer.insertContentsOf(elements, at: 0)Deque.swift:170 buffer.replaceRange(range, with: newElements)Deque.swift:174 b.insertContentsOf(self.buffer, subRange: 0 ..< range.startIndex, at: 0)Deque.swift:176 b.insertContentsOf(self.buffer, subRange: range.endIndex ..< count, at: b.count)Deque.swift:177 buffer = bDeque.swift:186 buffer.append(newElement)Deque.swift:192 var capacity = buffer.capacityDeque.swift:193 var count = buffer.countDeque.swift:199 capacity = buffer.capacityDeque.swift:201 var i = buffer.bufferIndexForDequeIndex(count)Deque.swift:202 let p = buffer.elementsDeque.swift:210 buffer.count = countDeque.swift:219 buffer.insert(newElement, at: i)Deque.swift:227 buffer.insertContentsOf(newElements, at: i)Deque.swift:236 let element = buffer[i]Deque.swift:237 buffer.removeRange(i...i)Deque.swift:247 return buffer.popFirst()!Deque.swift:256 buffer.removeRange(0 ..< n)Deque.swift:265 buffer.removeRange(range)Deque.swift:273 buffer.removeRange(0..<count)Deque.swift:276 buffer = DequeBuffer()Deque.swift:289 return buffer.popLast()!Deque.swift:299 buffer.removeRange(c - n ..< c)Deque.swift:306 return buffer.popFirst()Deque.swift:313 return buffer.popLast()Deque.swift:321 buffer.prepend(element)Deque.swift:331 if count == 0 || a.buffer === b.buffer { return true }Deque.swift:331 if count == 0 || a.buffer === b.buffer { return true }Deque.swift:828 try withExtendedLifetime(buffer) { buffer in(minimumCapacity: Int) { 0029 buffer = DequeBuffer(capacity: minimumCapacity) 0030 } 0031 0032 /// Initialize a new deque from the elements of any sequence. 0033 public init<S: SequenceType where S.Generator.Element == Element>(_ elements: S) { 0034 self.init(minimumCapacity: elements.underestimateCount()) 0035 appendContentsOf(elements) 0036 } 0037 0038 /// Initialize a deque of `count` elements, each initialized to `repeatedValue`. 0039 public init(count: Int, repeatedValue: Element) { 0040 buffer = DequeBuffer(count: count, repeatedValue: repeatedValue) 0041 } 0042 } 0043 0044 //MARK: Uniqueness and Capacity 0045 0046 extension Deque { 0047 /// The maximum number of items this deque can store without reallocating its storage. 0048 var capacity
Deque.swift:34 self.init(minimumCapacity: elements.underestimateCount()): Int { return buffer.capacity } 0049 0050 private func grow
Deque.swift:51 guard capacity > self.capacity else { return self.capacity }Deque.swift:51 guard capacity > self.capacity else { return self.capacity }Deque.swift:52 return max(capacity, 2 * self.capacity)Deque.swift:169 if isUnique && count + delta <= capacity {(capacity: Int) -> Int { 0051 guard capacity > self.capacity else { return self.capacity } 0052 return max(capacity, 2 * self.capacity) 0053 } 0054 0055 /// Ensure that this deque is capable of storing at least `minimumCapacity` items without reallocating its storage. 0056 public mutating func reserveCapacity
Deque.swift:173 let b = DequeBuffer<Element>(capacity: grow(count + delta))Deque.swift:185 makeUniqueWithCapacity(grow(count + 1))Deque.swift:198 reserveCapacity(grow(count + 1))Deque.swift:218 makeUniqueWithCapacity(grow(count + 1))Deque.swift:226 makeUniqueWithCapacity(grow(count + numericCast(newElements.count)))Deque.swift:320 makeUniqueWithCapacity(grow(count + 1))(minimumCapacity: Int) { 0057 guard buffer.capacity < minimumCapacity else { return } 0058 if isUniquelyReferenced(&buffer) { 0059 buffer = buffer.realloc(minimumCapacity) 0060 } 0061 else { 0062 let new = DequeBuffer<Element>(capacity: minimumCapacity) 0063 new.insertContentsOf(buffer, at: 0) 0064 buffer = new 0065 } 0066 } 0067 0068 internal var isUnique
Deque.swift:198 reserveCapacity(grow(count + 1)): Bool { mutating get { return isUniquelyReferenced(&buffer) } } 0069 0070 private mutating func makeUnique
Deque.swift:75 guard !isUnique || buffer.capacity < capacity else { return }Deque.swift:169 if isUnique && count + delta <= capacity {() { 0071 self.makeUniqueWithCapacity(buffer.capacity) 0072 } 0073 0074 private mutating func makeUniqueWithCapacity
Deque.swift:235 makeUnique()(capacity: Int) { 0075 guard !isUnique || buffer.capacity < capacity else { return } 0076 let copy = DequeBuffer<Element>(capacity: capacity) 0077 copy.insertContentsOf(buffer, at: 0) 0078 buffer = copy 0079 } 0080 } 0081 0082 //MARK: MutableCollectionType 0083 0084 extension Deque: MutableCollectionType { 0085 public typealias Index = Int 0086 public typealias Generator = IndexingGenerator<Deque<Element>> 0087 public typealias SubSequence = MutableSlice<Deque<Element>> 0088 0089 /// The number of elements currently stored in this deque. 0090 public var count
Deque.swift:71 self.makeUniqueWithCapacity(buffer.capacity)Deque.swift:185 makeUniqueWithCapacity(grow(count + 1))Deque.swift:191 makeUniqueWithCapacity(self.count + newElements.underestimateCount())Deque.swift:218 makeUniqueWithCapacity(grow(count + 1))Deque.swift:226 makeUniqueWithCapacity(grow(count + numericCast(newElements.count)))Deque.swift:320 makeUniqueWithCapacity(grow(count + 1)): Int { return buffer.count } 0091 /// The position of the first element in a non-empty deque (this is always zero). 0092 public var startIndex: Int { return 0 } 0093 /// The index after the last element in a non-empty deque (this is always the element count). 0094 public var endIndex: Int { return count } 0095 0096 /// `true` iff this deque is empty. 0097 public var isEmpty: Bool { return count == 0 } 0098 0099 @inline(__always) 0100 private func checkSubscript
Deque.swift:94 public var endIndex: Int { return count }Deque.swift:97 public var isEmpty: Bool { return count == 0 }Deque.swift:101 precondition(index >= 0 && index < count)Deque.swift:166 precondition(range.startIndex >= 0 && range.endIndex <= count)Deque.swift:169 if isUnique && count + delta <= capacity {Deque.swift:173 let b = DequeBuffer<Element>(capacity: grow(count + delta))Deque.swift:176 b.insertContentsOf(self.buffer, subRange: range.endIndex ..< count, at: b.count)Deque.swift:185 makeUniqueWithCapacity(grow(count + 1))Deque.swift:191 makeUniqueWithCapacity(self.count + newElements.underestimateCount())Deque.swift:218 makeUniqueWithCapacity(grow(count + 1))Deque.swift:226 makeUniqueWithCapacity(grow(count + numericCast(newElements.count)))Deque.swift:246 precondition(count > 0)Deque.swift:255 precondition(count >= n)Deque.swift:264 precondition(range.startIndex >= 0 && range.endIndex <= count)Deque.swift:273 buffer.removeRange(0..<count)Deque.swift:288 precondition(count > 0)Deque.swift:297 let c = countDeque.swift:320 makeUniqueWithCapacity(grow(count + 1))Deque.swift:329 let count = a.countDeque.swift:330 if count != b.count { return false }Deque.swift:835 result.reserveCapacity(self.count)(index: Int) { 0101 precondition(index >= 0 && index < count) 0102 } 0103 0104 // Returns or changes the element at `index`. 0105 public subscript(index: Int) -> Element { 0106 get { 0107 checkSubscript(index) 0108 return buffer[index] 0109 } 0110 set(value) { 0111 checkSubscript(index) 0112 buffer[index] = value 0113 } 0114 } 0115 } 0116 0117 //MARK: ArrayLiteralConvertible 0118 0119 extension Deque: ArrayLiteralConvertible { 0120 public init(arrayLiteral elements: Element...) { 0121 self.buffer = DequeBuffer(capacity: elements.count) 0122 buffer.insertContentsOf(elements, at: 0) 0123 } 0124 } 0125 0126 //MARK: CustomStringConvertible 0127 0128 extension Deque: CustomStringConvertible, CustomDebugStringConvertible { 0129 @warn_unused_result 0130 private func makeDescription
Deque.swift:107 checkSubscript(index)Deque.swift:111 checkSubscript(index)Deque.swift:234 checkSubscript(i)(debug debug: Bool) -> String { 0131 var result = debug ? "\(String(reflecting: Deque.self))([" : "Deque[" 0132 var first = true 0133 for item in self { 0134 if first { 0135 first = false 0136 } else { 0137 result += ", " 0138 } 0139 if debug { 0140 debugPrint(item, terminator: "", toStream: &result) 0141 } 0142 else { 0143 print(item, terminator: "", toStream: &result) 0144 } 0145 } 0146 result += debug ? "])" : "]" 0147 return result 0148 } 0149 0150 public var description: String { 0151 return makeDescription(debug: false) 0152 } 0153 public var debugDescription: String { 0154 return makeDescription(debug: true) 0155 } 0156 } 0157 0158 //MARK: RangeReplaceableCollectionType 0159 0160 extension Deque: RangeReplaceableCollectionType { 0161 /// Replace the given `range` of elements with `newElements`. 0162 /// 0163 /// - Complexity: O(`range.count`) if storage isn't shared with another live deque, 0164 /// and `range` is a constant distance from the start or the end of the deque; otherwise O(`count + range.count`). 0165 public mutating func replaceRange<C: CollectionType where C.Generator.Element == Element>(range: Range<Int>, with newElements: C) { 0166 precondition(range.startIndex >= 0 && range.endIndex <= count) 0167 let newCount: Int = numericCast(newElements.count) 0168 let delta = newCount - range.count 0169 if isUnique && count + delta <= capacity { 0170 buffer.replaceRange(range, with: newElements) 0171 } 0172 else { 0173 let b = DequeBuffer<Element>(capacity: grow(count + delta)) 0174 b.insertContentsOf(self.buffer, subRange: 0 ..< range.startIndex, at: 0) 0175 b.insertContentsOf(newElements, at: b.count) 0176 b.insertContentsOf(self.buffer, subRange: range.endIndex ..< count, at: b.count) 0177 buffer = b 0178 } 0179 } 0180 0181 /// Append `newElement` to the end of this deque. 0182 /// 0183 /// - Complexity: Amortized O(1) if storage isn't shared with another live deque; otherwise O(`count`). 0184 public mutating func append(newElement: Element) { 0185 makeUniqueWithCapacity(grow(count + 1)) 0186 buffer.append(newElement) 0187 } 0188 0189 /// Append `newElements` to the end of this queue. 0190 public mutating func appendContentsOf
Deque.swift:151 return makeDescription(debug: false)Deque.swift:154 return makeDescription(debug: true)<S: SequenceType where S.Generator.Element == Element>(newElements: S) { 0191 makeUniqueWithCapacity(self.count + newElements.underestimateCount()) 0192 var capacity = buffer.capacity 0193 var count = buffer.count 0194 var generator = newElements.generate() 0195 var next = generator.next() 0196 while next != nil { 0197 if capacity == count { 0198 reserveCapacity(grow(count + 1)) 0199 capacity = buffer.capacity 0200 } 0201 var i = buffer.bufferIndexForDequeIndex(count) 0202 let p = buffer.elements 0203 while let element = next where count < capacity { 0204 p.advancedBy(i).initialize(element) 0205 i += 1 0206 if i == capacity { i = 0 } 0207 count += 1 0208 next = generator.next() 0209 } 0210 buffer.count = count 0211 } 0212 } 0213 0214 /// Insert `newElement` at index `i` into this deque. 0215 /// 0216 /// - Complexity: O(`count`). Note though that complexity is O(1) if `i` is of a constant distance from the front or end of the deque. 0217 public mutating func insert(newElement: Element, atIndex i: Int) { 0218 makeUniqueWithCapacity(grow(count + 1)) 0219 buffer.insert(newElement, at: i) 0220 } 0221 0222 /// Insert the contents of `newElements` into this deque, starting at index `i`. 0223 /// 0224 /// - Complexity: O(`count`). Note though that complexity is O(1) if `i` is of a constant distance from the front or end of the deque. 0225 public mutating func insertContentsOf<C: CollectionType where C.Generator.Element == Element>(newElements: C, at i: Int) { 0226 makeUniqueWithCapacity(grow(count + numericCast(newElements.count))) 0227 buffer.insertContentsOf(newElements, at: i) 0228 } 0229 0230 /// Remove the element at index `i` from this deque. 0231 /// 0232 /// - Complexity: O(`count`). Note though that complexity is O(1) if `i` is of a constant distance from the front or end of the deque. 0233 public mutating func removeAtIndex(i: Int) -> Element { 0234 checkSubscript(i) 0235 makeUnique() 0236 let element = buffer[i] 0237 buffer.removeRange(i...i) 0238 return element 0239 } 0240 0241 /// Remove and return the first element from this deque. 0242 /// 0243 /// - Requires: `count > 0` 0244 /// - Complexity: O(1) if storage isn't shared with another live deque; otherwise O(`count`). 0245 public mutating func removeFirst() -> Element { 0246 precondition(count > 0) 0247 return buffer.popFirst()! 0248 } 0249 0250 /// Remove the first `n` elements from this deque. 0251 /// 0252 /// - Requires: `count >= n` 0253 /// - Complexity: O(`n`) if storage isn't shared with another live deque; otherwise O(`count`). 0254 public mutating func removeFirst(n: Int) { 0255 precondition(count >= n) 0256 buffer.removeRange(0 ..< n) 0257 } 0258 0259 /// Remove the first `n` elements from this deque. 0260 /// 0261 /// - Requires: `count >= n` 0262 /// - Complexity: O(`n`) if storage isn't shared with another live deque; otherwise O(`count`). 0263 public mutating func removeRange(range: Range<Int>) { 0264 precondition(range.startIndex >= 0 && range.endIndex <= count) 0265 buffer.removeRange(range) 0266 } 0267 0268 /// Remove all elements from this deque. 0269 /// 0270 /// - Complexity: O(`count`). 0271 public mutating func removeAll(keepCapacity keepCapacity: Bool = false) { 0272 if keepCapacity { 0273 buffer.removeRange(0..<count) 0274 } 0275 else { 0276 buffer = DequeBuffer() 0277 } 0278 } 0279 } 0280 0281 //MARK: Miscellaneous mutators 0282 extension Deque { 0283 /// Remove and return the last element from this deque. 0284 /// 0285 /// - Requires: `count > 0` 0286 /// - Complexity: O(1) if storage isn't shared with another live deque; otherwise O(`count`). 0287 public mutating func removeLast() -> Element { 0288 precondition(count > 0) 0289 return buffer.popLast()! 0290 } 0291 0292 /// Remove and return the last `n` elements from this deque. 0293 /// 0294 /// - Requires: `count >= n` 0295 /// - Complexity: O(`n`) if storage isn't shared with another live deque; otherwise O(`count`). 0296 public mutating func removeLast(n: Int) { 0297 let c = count 0298 precondition(c >= n) 0299 buffer.removeRange(c - n ..< c) 0300 } 0301 0302 /// Remove and return the first element if the deque isn't empty; otherwise return nil. 0303 /// 0304 /// - Complexity: O(1) if storage isn't shared with another live deque; otherwise O(`count`). 0305 public mutating func popFirst() -> Element? { 0306 return buffer.popFirst() 0307 } 0308 0309 /// Remove and return the last element if the deque isn't empty; otherwise return nil. 0310 /// 0311 /// - Complexity: O(1) if storage isn't shared with another live deque; otherwise O(`count`). 0312 public mutating func popLast() -> Element? { 0313 return buffer.popLast() 0314 } 0315 0316 /// Prepend `newElement` to the front of this deque. 0317 /// 0318 /// - Complexity: Amortized O(1) if storage isn't shared with another live deque; otherwise O(count). 0319 public mutating func prepend(element: Element) { 0320 makeUniqueWithCapacity(grow(count + 1)) 0321 buffer.prepend(element) 0322 } 0323 } 0324 0325 //MARK: Equality operators 0326 0327 @warn_unused_result 0328 func == <Element: Equatable>(a: Deque<Element>, b: Deque<Element>) -> Bool { 0329 let count = a.count 0330 if count != b.count { return false } 0331 if count == 0 || a.buffer === b.buffer { return true } 0332 0333 var agen = a.generate() 0334 var bgen = b.generate() 0335 while let anext = agen.next() { 0336 let bnext = bgen.next() 0337 if anext != bnext { return false } 0338 } 0339 return true 0340 } 0341 0342 @warn_unused_result 0343 func != <Element: Equatable>(a: Deque<Element>, b: Deque<Element>) -> Bool { 0344 return !(a == b) 0345 } 0346 0347 //MARK: DequeBuffer 0348 0349 /// Storage buffer for a deque. 0350 final class DequeBuffer
Deque.swift:35 appendContentsOf(elements)<Element
Deque.swift:21 internal private(set) var buffer: DequeBuffer<Element>Deque.swift:25 buffer = DequeBuffer()Deque.swift:29 buffer = DequeBuffer(capacity: minimumCapacity)Deque.swift:40 buffer = DequeBuffer(count: count, repeatedValue: repeatedValue)Deque.swift:62 let new = DequeBuffer<Element>(capacity: minimumCapacity)Deque.swift:76 let copy = DequeBuffer<Element>(capacity: capacity)Deque.swift:121 self.buffer = DequeBuffer(capacity: elements.count)Deque.swift:173 let b = DequeBuffer<Element>(capacity: grow(count + delta))Deque.swift:276 buffer = DequeBuffer()Deque.swift:395 internal func realloc(capacity: Int) -> DequeBuffer {Deque.swift:397 let buffer = DequeBuffer(capacity: capacity)Deque.swift:577 internal func insertContentsOf(buffer: DequeBuffer, at index: Int) {Deque.swift:581 internal func insertContentsOf(buffer: DequeBuffer, subRange: Range<Int>, at index: Int) {Deque.swift:802 extension DequeBuffer {>: NonObjectiveCBase { 0351 /// Pointer to allocated storage. 0352 internal private(set) var elements
Deque.swift:352 internal private(set) var elements: UnsafeMutablePointer<Element>Deque.swift:369 internal convenience init(count: Int, repeatedValue: Element) {Deque.swift:444 internal func prepend(element: Element) {Deque.swift:452 internal func popFirst() -> Element? {Deque.swift:460 internal func append(element: Element) {Deque.swift:467 internal func popLast() -> Element? {Deque.swift:570 internal func insert(element: Element, at index: Int) {Deque.swift:634 internal func insertContentsOf<C: CollectionType where C.Generator.Element == Element>(collection: C, at index: Int) {Deque.swift:763 internal func replaceRange<C: CollectionType where C.Generator.Element == Element>(range: Range<Int>, with newElements: C) {: UnsafeMutablePointer<Element> 0353 /// The capacity of this storage buffer. 0354 internal let capacity
Deque.swift:202 let p = buffer.elementsDeque.swift:363 self.elements = UnsafeMutablePointer.alloc(capacity)Deque.swift:371 let p = elementsDeque.swift:382 let p = self.elementsDeque.swift:399 let dst = buffer.elementsDeque.swift:400 let src = self.elementsDeque.swift:435 return elements.advancedBy(i).memoryDeque.swift:440 elements.advancedBy(i).memory = newValueDeque.swift:447 elements.advancedBy(i).initialize(element)Deque.swift:454 let first = elements.advancedBy(start).move()Deque.swift:463 elements.advancedBy(endIndex).initialize(element)Deque.swift:470 let last = elements.advancedBy(lastIndex).move()Deque.swift:490 elements.advancedBy(i + length).moveInitializeBackwardFrom(elements.advancedBy(i), count: end - i)Deque.swift:490 elements.advancedBy(i + length).moveInitializeBackwardFrom(elements.advancedBy(i), count: end - i)Deque.swift:495 elements.moveInitializeFrom(elements.advancedBy(capacity - length), count: end + length - capacity)Deque.swift:495 elements.moveInitializeFrom(elements.advancedBy(capacity - length), count: end + length - capacity)Deque.swift:497 elements.advancedBy(i + length).moveInitializeBackwardFrom(elements.advancedBy(i), count: capacity - i - length)Deque.swift:497 elements.advancedBy(i + length).moveInitializeBackwardFrom(elements.advancedBy(i), count: capacity - i - length)Deque.swift:502 elements.advancedBy(i + length - capacity).moveInitializeFrom(elements.advancedBy(i), count: end - i)Deque.swift:502 elements.advancedBy(i + length - capacity).moveInitializeFrom(elements.advancedBy(i), count: end - i)Deque.swift:509 elements.advancedBy(length).moveInitializeBackwardFrom(elements, count: end)Deque.swift:509 elements.advancedBy(length).moveInitializeBackwardFrom(elements, count: end)Deque.swift:511 elements.moveInitializeFrom(elements.advancedBy(capacity - length), count: length)Deque.swift:511 elements.moveInitializeFrom(elements.advancedBy(capacity - length), count: length)Deque.swift:513 elements.advancedBy(i + length).moveInitializeBackwardFrom(elements.advancedBy(i), count: capacity - i - length)Deque.swift:513 elements.advancedBy(i + length).moveInitializeBackwardFrom(elements.advancedBy(i), count: capacity - i - length)Deque.swift:518 elements.advancedBy(length).moveInitializeBackwardFrom(elements, count: end)Deque.swift:518 elements.advancedBy(length).moveInitializeBackwardFrom(elements, count: end)Deque.swift:520 elements.advancedBy(i + length - capacity).moveInitializeFrom(elements.advancedBy(i), count: capacity - i)Deque.swift:520 elements.advancedBy(i + length - capacity).moveInitializeFrom(elements.advancedBy(i), count: capacity - i)Deque.swift:531 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: i - start)Deque.swift:531 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: i - start)Deque.swift:536 elements.advancedBy(capacity + start - length).moveInitializeFrom(elements.advancedBy(start), count: length - start)Deque.swift:536 elements.advancedBy(capacity + start - length).moveInitializeFrom(elements.advancedBy(start), count: length - start)Deque.swift:538 elements.moveInitializeFrom(elements.advancedBy(length), count: i - length)Deque.swift:538 elements.moveInitializeFrom(elements.advancedBy(length), count: i - length)Deque.swift:543 elements.advancedBy(capacity + start - length).moveInitializeFrom(elements.advancedBy(start), count: i - start)Deque.swift:543 elements.advancedBy(capacity + start - length).moveInitializeFrom(elements.advancedBy(start), count: i - start)Deque.swift:550 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: capacity - start)Deque.swift:550 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: capacity - start)Deque.swift:552 elements.advancedBy(capacity - length).moveInitializeFrom(elements, count: length)Deque.swift:552 elements.advancedBy(capacity - length).moveInitializeFrom(elements, count: length)Deque.swift:554 elements.moveInitializeFrom(elements.advancedBy(i - length), count: i - length)Deque.swift:554 elements.moveInitializeFrom(elements.advancedBy(i - length), count: i - length)Deque.swift:559 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: capacity - start)Deque.swift:559 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: capacity - start)Deque.swift:561 elements.advancedBy(capacity - length).moveInitializeFrom(elements, count: i)Deque.swift:561 elements.advancedBy(capacity - length).moveInitializeFrom(elements, count: i)Deque.swift:574 elements.advancedBy(i).initialize(element)Deque.swift:589 let dp = self.elementsDeque.swift:590 let sp = buffer.elementsDeque.swift:640 var q = elements.advancedBy(bufferIndexForDequeIndex(index))Deque.swift:641 let limit = elements.advancedBy(capacity)Deque.swift:646 q = elementsDeque.swift:658 let p = elementsDeque.swift:769 let p = elementsDeque.swift:786 let p = elementsDeque.swift:805 var p = elements + startDeque.swift:812 var p = elements + startDeque.swift:817 p = elements: Int 0355 /// The number of items currently in this deque. 0356 internal private(set) var count
Deque.swift:48 var capacity: Int { return buffer.capacity }Deque.swift:57 guard buffer.capacity < minimumCapacity else { return }Deque.swift:71 self.makeUniqueWithCapacity(buffer.capacity)Deque.swift:75 guard !isUnique || buffer.capacity < capacity else { return }Deque.swift:192 var capacity = buffer.capacityDeque.swift:199 capacity = buffer.capacityDeque.swift:364 self.capacity = capacityDeque.swift:383 if start + count <= capacity {Deque.swift:387 let c = capacity - startDeque.swift:391 p.dealloc(capacity)Deque.swift:396 if capacity <= self.capacity { return self }Deque.swift:401 if self.start + self.count <= self.capacity {Deque.swift:405 let c = self.capacity - self.startDeque.swift:417 if i >= capacity { return i - capacity }Deque.swift:417 if i >= capacity { return i - capacity }Deque.swift:426 return capacity - start + iDeque.swift:429 internal var isFull: Bool { return count == capacity }Deque.swift:445 precondition(count < capacity)Deque.swift:446 let i = start == 0 ? capacity - 1 : start - 1Deque.swift:461 precondition(count < capacity)Deque.swift:481 assert(count + length <= capacity)Deque.swift:486 let end = start + count <= capacity ? start + count : start + count - capacityDeque.swift:486 let end = start + count <= capacity ? start + count : start + count - capacityDeque.swift:488 if end + length <= capacity { // Neither gap nor elements after it will be wrappedDeque.swift:493 else if i + length <= capacity { // Elements after gap will be wrappedDeque.swift:495 elements.moveInitializeFrom(elements.advancedBy(capacity - length), count: end + length - capacity)Deque.swift:495 elements.moveInitializeFrom(elements.advancedBy(capacity - length), count: end + length - capacity)Deque.swift:497 elements.advancedBy(i + length).moveInitializeBackwardFrom(elements.advancedBy(i), count: capacity - i - length)Deque.swift:502 elements.advancedBy(i + length - capacity).moveInitializeFrom(elements.advancedBy(i), count: end - i)Deque.swift:507 if i + length <= capacity { // Gap will not be wrappedDeque.swift:511 elements.moveInitializeFrom(elements.advancedBy(capacity - length), count: length)Deque.swift:513 elements.advancedBy(i + length).moveInitializeBackwardFrom(elements.advancedBy(i), count: capacity - i - length)Deque.swift:520 elements.advancedBy(i + length - capacity).moveInitializeFrom(elements.advancedBy(i), count: capacity - i)Deque.swift:520 elements.advancedBy(i + length - capacity).moveInitializeFrom(elements.advancedBy(i), count: capacity - i)Deque.swift:536 elements.advancedBy(capacity + start - length).moveInitializeFrom(elements.advancedBy(start), count: length - start)Deque.swift:543 elements.advancedBy(capacity + start - length).moveInitializeFrom(elements.advancedBy(start), count: i - start)Deque.swift:550 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: capacity - start)Deque.swift:552 elements.advancedBy(capacity - length).moveInitializeFrom(elements, count: length)Deque.swift:559 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: capacity - start)Deque.swift:561 elements.advancedBy(capacity - length).moveInitializeFrom(elements, count: i)Deque.swift:565 start = start < length ? capacity + start - length : start - lengthDeque.swift:584 assert(count + subRange.count <= capacity)Deque.swift:604 let t = buffer.capacity - srcStartDeque.swift:609 let t = self.capacity - dstStartDeque.swift:614 let st = buffer.capacity - srcStartDeque.swift:615 let dt = self.capacity - dstStartDeque.swift:637 assert(count + c <= capacity)Deque.swift:641 let limit = elements.advancedBy(capacity)Deque.swift:660 let j = i + rc <= capacity ? i + rc : i + rc - capacityDeque.swift:660 let j = i + rc <= capacity ? i + rc : i + rc - capacityDeque.swift:670 p.advancedBy(i).destroy(capacity - i)Deque.swift:677 let end = start + count < capacity ? start + count : start + count - capacityDeque.swift:677 let end = start + count < capacity ? start + count : start + count - capacityDeque.swift:685 else if i + rc > capacity { // Collapsed range is wrappedDeque.swift:688 p.advancedBy(i).moveInitializeFrom(p.advancedBy(i + rc - capacity), count: capacity + end - i - rc)Deque.swift:688 p.advancedBy(i).moveInitializeFrom(p.advancedBy(i + rc - capacity), count: capacity + end - i - rc)Deque.swift:693 p.advancedBy(i).moveInitializeFrom(p.advancedBy(i + rc - capacity), count: capacity - i)Deque.swift:693 p.advancedBy(i).moveInitializeFrom(p.advancedBy(i + rc - capacity), count: capacity - i)Deque.swift:702 p.advancedBy(i).moveInitializeFrom(p.advancedBy(i + rc), count: capacity - i - rc)Deque.swift:704 p.advancedBy(capacity - rc).moveInitializeFrom(p, count: end)Deque.swift:709 p.advancedBy(i).moveInitializeFrom(p.advancedBy(i + rc), count: capacity - i - rc)Deque.swift:711 p.advancedBy(capacity - rc).moveInitializeFrom(p, count: rc)Deque.swift:727 if start + rc >= capacity { // Result will not be wrappedDeque.swift:729 p.advancedBy(start + rc - capacity).moveInitializeFrom(p.advancedBy(start), count: capacity + j - start - rc)Deque.swift:729 p.advancedBy(start + rc - capacity).moveInitializeFrom(p.advancedBy(start), count: capacity + j - start - rc)Deque.swift:734 p.moveInitializeFrom(p.advancedBy(capacity - rc), count: j)Deque.swift:736 p.advancedBy(start + rc).moveInitializeBackwardFrom(p.advancedBy(start), count: capacity - start - rc)Deque.swift:741 if capacity - start <= rc { // Result will not be wrappedDeque.swift:745 p.advancedBy(start + rc - capacity).moveInitializeFrom(p.advancedBy(start), count: capacity - start)Deque.swift:745 p.advancedBy(start + rc - capacity).moveInitializeFrom(p.advancedBy(start), count: capacity - start)Deque.swift:752 p.moveInitializeFrom(p.advancedBy(capacity) - rc, count: rc)Deque.swift:754 p.advancedBy(start + rc).moveInitializeBackwardFrom(p.advancedBy(start), count: capacity - start - rc)Deque.swift:758 start = (start + rc < capacity ? start + rc : start + rc - capacity)Deque.swift:758 start = (start + rc < capacity ? start + rc : start + rc - capacity)Deque.swift:766 assert(count + delta < capacity)Deque.swift:771 let limit = p.advancedBy(capacity)Deque.swift:788 let limit = p.advancedBy(capacity)Deque.swift:804 if start + count <= capacity {Deque.swift:813 for _ in start ..< capacity {Deque.swift:818 for _ in 0 ..< start + count - capacity {: Int 0357 /// The index of the first item. 0358 internal private(set) var start
Deque.swift:90 public var count: Int { return buffer.count }Deque.swift:175 b.insertContentsOf(newElements, at: b.count)Deque.swift:176 b.insertContentsOf(self.buffer, subRange: range.endIndex ..< count, at: b.count)Deque.swift:193 var count = buffer.countDeque.swift:210 buffer.count = countDeque.swift:365 self.count = 0Deque.swift:372 self.count = countDeque.swift:383 if start + count <= capacity {Deque.swift:384 p.advancedBy(start).destroy(count)Deque.swift:389 p.destroy(count - c)Deque.swift:398 buffer.count = self.countDeque.swift:398 buffer.count = self.countDeque.swift:401 if self.start + self.count <= self.capacity {Deque.swift:402 dst.moveInitializeFrom(src.advancedBy(start), count: count)Deque.swift:407 dst.advancedBy(c).moveInitializeFrom(src, count: self.count - c)Deque.swift:409 self.count = 0Deque.swift:429 internal var isFull: Bool { return count == capacity }Deque.swift:433 assert(index >= 0 && index < count)Deque.swift:438 assert(index >= 0 && index < count)Deque.swift:445 precondition(count < capacity)Deque.swift:449 self.count += 1Deque.swift:453 guard count > 0 else { return nil }Deque.swift:456 self.count -= 1Deque.swift:461 precondition(count < capacity)Deque.swift:462 let endIndex = bufferIndexForDequeIndex(count)Deque.swift:464 self.count += 1Deque.swift:468 guard count > 0 else { return nil }Deque.swift:469 let lastIndex = bufferIndexForDequeIndex(count - 1)Deque.swift:471 self.count -= 1Deque.swift:480 assert(index >= 0 && index <= self.count)Deque.swift:481 assert(count + length <= capacity)Deque.swift:484 if index >= (count + 1) / 2 {Deque.swift:486 let end = start + count <= capacity ? start + count : start + count - capacityDeque.swift:486 let end = start + count <= capacity ? start + count : start + count - capacityDeque.swift:486 let end = start + count <= capacity ? start + count : start + count - capacityDeque.swift:524 count += lengthDeque.swift:566 count += lengthDeque.swift:571 precondition(index >= 0 && index <= count && !isFull)Deque.swift:578 self.insertContentsOf(buffer, subRange: 0 ..< buffer.count, at: index)Deque.swift:583 assert(index >= 0 && index <= count)Deque.swift:584 assert(count + subRange.count <= capacity)Deque.swift:585 assert(subRange.startIndex >= 0 && subRange.endIndex <= buffer.count)Deque.swift:635 assert(index >= 0 && index <= count)Deque.swift:637 assert(count + c <= capacity)Deque.swift:655 assert(range.endIndex <= self.count)Deque.swift:676 if count - range.startIndex - rc < range.startIndex {Deque.swift:677 let end = start + count < capacity ? start + count : start + count - capacityDeque.swift:677 let end = start + count < capacity ? start + count : start + count - capacityDeque.swift:677 let end = start + count < capacity ? start + count : start + count - capacityDeque.swift:717 count -= rcDeque.swift:759 count -= rcDeque.swift:766 assert(count + delta < capacity)Deque.swift:804 if start + count <= capacity {Deque.swift:806 for _ in 0 ..< count {Deque.swift:818 for _ in 0 ..< start + count - capacity {: Int 0359 0360 internal init
Deque.swift:366 self.start = 0Deque.swift:383 if start + count <= capacity {Deque.swift:384 p.advancedBy(start).destroy(count)Deque.swift:387 let c = capacity - startDeque.swift:388 p.advancedBy(start).destroy(c)Deque.swift:401 if self.start + self.count <= self.capacity {Deque.swift:402 dst.moveInitializeFrom(src.advancedBy(start), count: count)Deque.swift:405 let c = self.capacity - self.startDeque.swift:406 dst.moveInitializeFrom(src.advancedBy(self.start), count: c)Deque.swift:416 let i = start + indexDeque.swift:423 if i >= start {Deque.swift:424 return i - startDeque.swift:426 return capacity - start + iDeque.swift:446 let i = start == 0 ? capacity - 1 : start - 1Deque.swift:446 let i = start == 0 ? capacity - 1 : start - 1Deque.swift:448 self.start = iDeque.swift:454 let first = elements.advancedBy(start).move()Deque.swift:455 self.start = bufferIndexForDequeIndex(1)Deque.swift:486 let end = start + count <= capacity ? start + count : start + count - capacityDeque.swift:486 let end = start + count <= capacity ? start + count : start + count - capacityDeque.swift:486 let end = start + count <= capacity ? start + count : start + count - capacityDeque.swift:528 if i >= start { // Elements before index are not yet wrapped.Deque.swift:529 if start >= length { // Neither gap nor elements before it will be wrapped.Deque.swift:531 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: i - start)Deque.swift:531 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: i - start)Deque.swift:531 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: i - start)Deque.swift:536 elements.advancedBy(capacity + start - length).moveInitializeFrom(elements.advancedBy(start), count: length - start)Deque.swift:536 elements.advancedBy(capacity + start - length).moveInitializeFrom(elements.advancedBy(start), count: length - start)Deque.swift:536 elements.advancedBy(capacity + start - length).moveInitializeFrom(elements.advancedBy(start), count: length - start)Deque.swift:543 elements.advancedBy(capacity + start - length).moveInitializeFrom(elements.advancedBy(start), count: i - start)Deque.swift:543 elements.advancedBy(capacity + start - length).moveInitializeFrom(elements.advancedBy(start), count: i - start)Deque.swift:543 elements.advancedBy(capacity + start - length).moveInitializeFrom(elements.advancedBy(start), count: i - start)Deque.swift:550 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: capacity - start)Deque.swift:550 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: capacity - start)Deque.swift:550 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: capacity - start)Deque.swift:559 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: capacity - start)Deque.swift:559 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: capacity - start)Deque.swift:559 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: capacity - start)Deque.swift:565 start = start < length ? capacity + start - length : start - lengthDeque.swift:565 start = start < length ? capacity + start - length : start - lengthDeque.swift:565 start = start < length ? capacity + start - length : start - lengthDeque.swift:565 start = start < length ? capacity + start - length : start - lengthDeque.swift:677 let end = start + count < capacity ? start + count : start + count - capacityDeque.swift:677 let end = start + count < capacity ? start + count : start + count - capacityDeque.swift:677 let end = start + count < capacity ? start + count : start + count - capacityDeque.swift:721 if j >= start { // No wrap anywhere before end of collapsed rangeDeque.swift:723 p.advancedBy(start + rc).moveInitializeBackwardFrom(p.advancedBy(start), count: j - start - rc)Deque.swift:723 p.advancedBy(start + rc).moveInitializeBackwardFrom(p.advancedBy(start), count: j - start - rc)Deque.swift:723 p.advancedBy(start + rc).moveInitializeBackwardFrom(p.advancedBy(start), count: j - start - rc)Deque.swift:727 if start + rc >= capacity { // Result will not be wrappedDeque.swift:729 p.advancedBy(start + rc - capacity).moveInitializeFrom(p.advancedBy(start), count: capacity + j - start - rc)Deque.swift:729 p.advancedBy(start + rc - capacity).moveInitializeFrom(p.advancedBy(start), count: capacity + j - start - rc)Deque.swift:729 p.advancedBy(start + rc - capacity).moveInitializeFrom(p.advancedBy(start), count: capacity + j - start - rc)Deque.swift:736 p.advancedBy(start + rc).moveInitializeBackwardFrom(p.advancedBy(start), count: capacity - start - rc)Deque.swift:736 p.advancedBy(start + rc).moveInitializeBackwardFrom(p.advancedBy(start), count: capacity - start - rc)Deque.swift:736 p.advancedBy(start + rc).moveInitializeBackwardFrom(p.advancedBy(start), count: capacity - start - rc)Deque.swift:741 if capacity - start <= rc { // Result will not be wrappedDeque.swift:745 p.advancedBy(start + rc - capacity).moveInitializeFrom(p.advancedBy(start), count: capacity - start)Deque.swift:745 p.advancedBy(start + rc - capacity).moveInitializeFrom(p.advancedBy(start), count: capacity - start)Deque.swift:745 p.advancedBy(start + rc - capacity).moveInitializeFrom(p.advancedBy(start), count: capacity - start)Deque.swift:754 p.advancedBy(start + rc).moveInitializeBackwardFrom(p.advancedBy(start), count: capacity - start - rc)Deque.swift:754 p.advancedBy(start + rc).moveInitializeBackwardFrom(p.advancedBy(start), count: capacity - start - rc)Deque.swift:754 p.advancedBy(start + rc).moveInitializeBackwardFrom(p.advancedBy(start), count: capacity - start - rc)Deque.swift:758 start = (start + rc < capacity ? start + rc : start + rc - capacity)Deque.swift:758 start = (start + rc < capacity ? start + rc : start + rc - capacity)Deque.swift:758 start = (start + rc < capacity ? start + rc : start + rc - capacity)Deque.swift:758 start = (start + rc < capacity ? start + rc : start + rc - capacity)Deque.swift:804 if start + count <= capacity {Deque.swift:805 var p = elements + startDeque.swift:812 var p = elements + startDeque.swift:813 for _ in start ..< capacity {Deque.swift:818 for _ in 0 ..< start + count - capacity {(capacity: Int = 16) { 0361 // TODO: It would be nicer if element storage was tail-allocated after this instance. 0362 // ManagedBuffer is supposed to do that, but ManagedBuffer is surprisingly slow. :-/ 0363 self.elements = UnsafeMutablePointer.alloc(capacity) 0364 self.capacity = capacity 0365 self.count = 0 0366 self.start = 0 0367 } 0368 0369 internal convenience init
Deque.swift:25 buffer = DequeBuffer()Deque.swift:29 buffer = DequeBuffer(capacity: minimumCapacity)Deque.swift:121 self.buffer = DequeBuffer(capacity: elements.count)Deque.swift:276 buffer = DequeBuffer()Deque.swift:370 self.init(capacity: count)Deque.swift:397 let buffer = DequeBuffer(capacity: capacity)(count: Int, repeatedValue: Element) { 0370 self.init(capacity: count) 0371 let p = elements 0372 self.count = count 0373 var q = p 0374 let limit = p + count 0375 while q != limit { 0376 q.initialize(repeatedValue) 0377 q += 1 0378 } 0379 } 0380 0381 deinit { 0382 let p = self.elements 0383 if start + count <= capacity { 0384 p.advancedBy(start).destroy(count) 0385 } 0386 else { 0387 let c = capacity - start 0388 p.advancedBy(start).destroy(c) 0389 p.destroy(count - c) 0390 } 0391 p.dealloc(capacity) 0392 } 0393 0394 @warn_unused_result 0395 internal func realloc
Deque.swift:40 buffer = DequeBuffer(count: count, repeatedValue: repeatedValue)(capacity: Int) -> DequeBuffer { 0396 if capacity <= self.capacity { return self } 0397 let buffer = DequeBuffer(capacity: capacity) 0398 buffer.count = self.count 0399 let dst = buffer.elements 0400 let src = self.elements 0401 if self.start + self.count <= self.capacity { 0402 dst.moveInitializeFrom(src.advancedBy(start), count: count) 0403 } 0404 else { 0405 let c = self.capacity - self.start 0406 dst.moveInitializeFrom(src.advancedBy(self.start), count: c) 0407 dst.advancedBy(c).moveInitializeFrom(src, count: self.count - c) 0408 } 0409 self.count = 0 0410 return buffer 0411 } 0412 0413 0414 /// Returns the storage buffer index for a deque index. 0415 internal func bufferIndexForDequeIndex
Deque.swift:59 buffer = buffer.realloc(minimumCapacity)(index: Int) -> Int { 0416 let i = start + index 0417 if i >= capacity { return i - capacity } 0418 return i 0419 } 0420 0421 /// Returns the deque index for a storage buffer index. 0422 internal func dequeIndexForBufferIndex(i: Int) -> Int { 0423 if i >= start { 0424 return i - start 0425 } 0426 return capacity - start + i 0427 } 0428 0429 internal var isFull
Deque.swift:201 var i = buffer.bufferIndexForDequeIndex(count)Deque.swift:434 let i = bufferIndexForDequeIndex(index)Deque.swift:439 let i = bufferIndexForDequeIndex(index)Deque.swift:455 self.start = bufferIndexForDequeIndex(1)Deque.swift:462 let endIndex = bufferIndexForDequeIndex(count)Deque.swift:469 let lastIndex = bufferIndexForDequeIndex(count - 1)Deque.swift:483 let i = bufferIndexForDequeIndex(index)Deque.swift:573 let i = bufferIndexForDequeIndex(index)Deque.swift:592 let dstStart = self.bufferIndexForDequeIndex(index)Deque.swift:593 let srcStart = buffer.bufferIndexForDequeIndex(subRange.startIndex)Deque.swift:597 let dstEnd = self.bufferIndexForDequeIndex(index + srcCount)Deque.swift:598 let srcEnd = buffer.bufferIndexForDequeIndex(subRange.endIndex)Deque.swift:640 var q = elements.advancedBy(bufferIndexForDequeIndex(index))Deque.swift:659 let i = bufferIndexForDequeIndex(range.startIndex)Deque.swift:770 var q = p.advancedBy(bufferIndexForDequeIndex(range.startIndex))Deque.swift:787 var q = p.advancedBy(bufferIndexForDequeIndex(range.startIndex + common)): Bool { return count == capacity } 0430 0431 internal subscript
Deque.swift:571 precondition(index >= 0 && index <= count && !isFull)(index: Int) -> Element { 0432 get { 0433 assert(index >= 0 && index < count) 0434 let i = bufferIndexForDequeIndex(index) 0435 return elements.advancedBy(i).memory 0436 } 0437 set { 0438 assert(index >= 0 && index < count) 0439 let i = bufferIndexForDequeIndex(index) 0440 elements.advancedBy(i).memory = newValue 0441 } 0442 } 0443 0444 internal func prepend
Deque.swift:108 return buffer[index]Deque.swift:112 buffer[index] = valueDeque.swift:236 let element = buffer[i](element: Element) { 0445 precondition(count < capacity) 0446 let i = start == 0 ? capacity - 1 : start - 1 0447 elements.advancedBy(i).initialize(element) 0448 self.start = i 0449 self.count += 1 0450 } 0451 0452 internal func popFirst
Deque.swift:321 buffer.prepend(element)() -> Element? { 0453 guard count > 0 else { return nil } 0454 let first = elements.advancedBy(start).move() 0455 self.start = bufferIndexForDequeIndex(1) 0456 self.count -= 1 0457 return first 0458 } 0459 0460 internal func append
Deque.swift:247 return buffer.popFirst()!Deque.swift:306 return buffer.popFirst()(element: Element) { 0461 precondition(count < capacity) 0462 let endIndex = bufferIndexForDequeIndex(count) 0463 elements.advancedBy(endIndex).initialize(element) 0464 self.count += 1 0465 } 0466 0467 internal func popLast
Deque.swift:186 buffer.append(newElement)() -> Element? { 0468 guard count > 0 else { return nil } 0469 let lastIndex = bufferIndexForDequeIndex(count - 1) 0470 let last = elements.advancedBy(lastIndex).move() 0471 self.count -= 1 0472 return last 0473 } 0474 0475 /// Create a gap of `length` uninitialized slots starting at `index`. 0476 /// Existing elements are moved out of the way. 0477 /// You are expected to fill the gap by initializing all slots in it after calling this method. 0478 /// Note that all previously calculated buffer indexes are invalidated by this method. 0479 private func openGapAt
Deque.swift:289 return buffer.popLast()!Deque.swift:313 return buffer.popLast()(index: Int, length: Int) { 0480 assert(index >= 0 && index <= self.count) 0481 assert(count + length <= capacity) 0482 guard length > 0 else { return } 0483 let i = bufferIndexForDequeIndex(index) 0484 if index >= (count + 1) / 2 { 0485 // Make room by sliding elements at/after index to the right 0486 let end = start + count <= capacity ? start + count : start + count - capacity 0487 if i <= end { // Elements after index are not yet wrapped 0488 if end + length <= capacity { // Neither gap nor elements after it will be wrapped 0489 // ....ABCD̲EF...... 0490 elements.advancedBy(i + length).moveInitializeBackwardFrom(elements.advancedBy(i), count: end - i) 0491 // ....ABC.̲..DEF... 0492 } 0493 else if i + length <= capacity { // Elements after gap will be wrapped 0494 // .........ABCD̲EF. (count = 3) 0495 elements.moveInitializeFrom(elements.advancedBy(capacity - length), count: end + length - capacity) 0496 // EF.......ABCD̲... 0497 elements.advancedBy(i + length).moveInitializeBackwardFrom(elements.advancedBy(i), count: capacity - i - length) 0498 // EF.......ABC.̲..D 0499 } 0500 else { // Gap will be wrapped 0501 // .........ABCD̲EF. (count = 5) 0502 elements.advancedBy(i + length - capacity).moveInitializeFrom(elements.advancedBy(i), count: end - i) 0503 // .DEF.....ABC.̲... 0504 } 0505 } 0506 else { // Elements after index are already wrapped 0507 if i + length <= capacity { // Gap will not be wrapped 0508 // F.......ABCD̲E (count = 1) 0509 elements.advancedBy(length).moveInitializeBackwardFrom(elements, count: end) 0510 // .F......ABCD̲E 0511 elements.moveInitializeFrom(elements.advancedBy(capacity - length), count: length) 0512 // EF......ABCD̲. 0513 elements.advancedBy(i + length).moveInitializeBackwardFrom(elements.advancedBy(i), count: capacity - i - length) 0514 // EF......ABC.̲D 0515 } 0516 else { // Gap will be wrapped 0517 // F.......ABCD̲E (count = 3) 0518 elements.advancedBy(length).moveInitializeBackwardFrom(elements, count: end) 0519 // ...F....ABCD̲E 0520 elements.advancedBy(i + length - capacity).moveInitializeFrom(elements.advancedBy(i), count: capacity - i) 0521 // .DEF....ABC.̲. 0522 } 0523 } 0524 count += length 0525 } 0526 else { 0527 // Make room by sliding elements before index to the left, updating `start`. 0528 if i >= start { // Elements before index are not yet wrapped. 0529 if start >= length { // Neither gap nor elements before it will be wrapped. 0530 // ....ABCD̲EF... 0531 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: i - start) 0532 // .ABC...D̲EF... 0533 } 0534 else if i >= length { // Elements before the gap will be wrapped. 0535 // ..ABCD̲EF.... 0536 elements.advancedBy(capacity + start - length).moveInitializeFrom(elements.advancedBy(start), count: length - start) 0537 // ...BCD̲EF...A 0538 elements.moveInitializeFrom(elements.advancedBy(length), count: i - length) 0539 // BC...D̲EF...A 0540 } 0541 else { // Gap will be wrapped 0542 // .ABCD̲EF....... (count = 5) 0543 elements.advancedBy(capacity + start - length).moveInitializeFrom(elements.advancedBy(start), count: i - start) 0544 // ....D̲EF...ABC. 0545 } 0546 } 0547 else { // Elements before index are already wrapped. 0548 if i >= length { // Gap will not be wrapped. 0549 // BCD̲EF......A (count = 1) 0550 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: capacity - start) 0551 // BCD̲EF.....A. 0552 elements.advancedBy(capacity - length).moveInitializeFrom(elements, count: length) 0553 // .CD̲EF.....AB 0554 elements.moveInitializeFrom(elements.advancedBy(i - length), count: i - length) 0555 // C.D̲EF.....AB 0556 } 0557 else { // Gap will be wrapped. 0558 // CD̲EF......AB 0559 elements.advancedBy(start - length).moveInitializeFrom(elements.advancedBy(start), count: capacity - start) 0560 // CD̲EF...AB... 0561 elements.advancedBy(capacity - length).moveInitializeFrom(elements, count: i) 0562 // .D̲EF...ABC.. 0563 } 0564 } 0565 start = start < length ? capacity + start - length : start - length 0566 count += length 0567 } 0568 } 0569 0570 internal func insert
Deque.swift:572 openGapAt(index, length: 1)Deque.swift:587 openGapAt(index, length: subRange.count)Deque.swift:639 openGapAt(index, length: c)Deque.swift:785 openGapAt(range.startIndex + common, length: newCount - common)(element: Element, at index: Int) { 0571 precondition(index >= 0 && index <= count && !isFull) 0572 openGapAt(index, length: 1) 0573 let i = bufferIndexForDequeIndex(index) 0574 elements.advancedBy(i).initialize(element) 0575 } 0576 0577 internal func insertContentsOf
Deque.swift:219 buffer.insert(newElement, at: i)(buffer: DequeBuffer, at index: Int) { 0578 self.insertContentsOf(buffer, subRange: 0 ..< buffer.count, at: index) 0579 } 0580 0581 internal func insertContentsOf
Deque.swift:63 new.insertContentsOf(buffer, at: 0)Deque.swift:77 copy.insertContentsOf(buffer, at: 0)(buffer: DequeBuffer, subRange: Range<Int>, at index: Int) { 0582 assert(buffer !== self) 0583 assert(index >= 0 && index <= count) 0584 assert(count + subRange.count <= capacity) 0585 assert(subRange.startIndex >= 0 && subRange.endIndex <= buffer.count) 0586 guard subRange.count > 0 else { return } 0587 openGapAt(index, length: subRange.count) 0588 0589 let dp = self.elements 0590 let sp = buffer.elements 0591 0592 let dstStart = self.bufferIndexForDequeIndex(index) 0593 let srcStart = buffer.bufferIndexForDequeIndex(subRange.startIndex) 0594 0595 let srcCount = subRange.count 0596 0597 let dstEnd = self.bufferIndexForDequeIndex(index + srcCount) 0598 let srcEnd = buffer.bufferIndexForDequeIndex(subRange.endIndex) 0599 0600 if srcStart < srcEnd && dstStart < dstEnd { 0601 dp.advancedBy(dstStart).initializeFrom(sp.advancedBy(srcStart), count: srcCount) 0602 } 0603 else if dstStart < dstEnd { 0604 let t = buffer.capacity - srcStart 0605 dp.advancedBy(dstStart).initializeFrom(sp.advancedBy(srcStart), count: t) 0606 dp.advancedBy(dstStart + t).initializeFrom(sp, count: srcCount - t) 0607 } 0608 else if srcStart < srcEnd { 0609 let t = self.capacity - dstStart 0610 dp.advancedBy(dstStart).initializeFrom(sp.advancedBy(srcStart), count: t) 0611 dp.initializeFrom(sp.advancedBy(srcStart + t), count: srcCount - t) 0612 } 0613 else { 0614 let st = buffer.capacity - srcStart 0615 let dt = self.capacity - dstStart 0616 0617 if dt < st { 0618 dp.advancedBy(dstStart).initializeFrom(sp.advancedBy(srcStart), count: dt) 0619 dp.initializeFrom(sp.advancedBy(srcStart + dt), count: st - dt) 0620 dp.advancedBy(st - dt).initializeFrom(sp, count: srcCount - st) 0621 } 0622 else if dt > st { 0623 dp.advancedBy(dstStart).initializeFrom(sp.advancedBy(srcStart), count: st) 0624 dp.advancedBy(dstStart + st).initializeFrom(sp, count: dt - st) 0625 dp.initializeFrom(sp.advancedBy(dt - st), count: srcCount - dt) 0626 } 0627 else { 0628 dp.advancedBy(dstStart).initializeFrom(sp.advancedBy(srcStart), count: st) 0629 dp.initializeFrom(sp, count: srcCount - st) 0630 } 0631 } 0632 } 0633 0634 internal func insertContentsOf
Deque.swift:174 b.insertContentsOf(self.buffer, subRange: 0 ..< range.startIndex, at: 0)Deque.swift:176 b.insertContentsOf(self.buffer, subRange: range.endIndex ..< count, at: b.count)Deque.swift:578 self.insertContentsOf(buffer, subRange: 0 ..< buffer.count, at: index)<C: CollectionType where C.Generator.Element == Element>(collection: C, at index: Int) { 0635 assert(index >= 0 && index <= count) 0636 let c: Int = numericCast(collection.count) 0637 assert(count + c <= capacity) 0638 guard c > 0 else { return } 0639 openGapAt(index, length: c) 0640 var q = elements.advancedBy(bufferIndexForDequeIndex(index)) 0641 let limit = elements.advancedBy(capacity) 0642 for element in collection { 0643 q.initialize(element) 0644 q = q.successor() 0645 if q == limit { 0646 q = elements 0647 } 0648 } 0649 } 0650 0651 /// Destroy elements in the range (index ..< index + count) and collapse the gap by moving remaining elements. 0652 /// Note that all previously calculated buffer indexes are invalidated by this method. 0653 private func removeRange
Deque.swift:122 buffer.insertContentsOf(elements, at: 0)Deque.swift:175 b.insertContentsOf(newElements, at: b.count)Deque.swift:227 buffer.insertContentsOf(newElements, at: i)(range: Range<Int>) { 0654 assert(range.startIndex >= 0) 0655 assert(range.endIndex <= self.count) 0656 guard range.count > 0 else { return } 0657 let rc = range.count 0658 let p = elements 0659 let i = bufferIndexForDequeIndex(range.startIndex) 0660 let j = i + rc <= capacity ? i + rc : i + rc - capacity 0661 0662 // Destroy items in collapsed range 0663 if i <= j { 0664 // ....ABC̲D̲E̲FG... 0665 p.advancedBy(i).destroy(rc) 0666 // ....AB...FG... 0667 } 0668 else { 0669 // D̲E̲FG.......ABC̲ 0670 p.advancedBy(i).destroy(capacity - i) 0671 // D̲E̲FG.......AB. 0672 p.destroy(j) 0673 // ..FG.......AB. 0674 } 0675 0676 if count - range.startIndex - rc < range.startIndex { 0677 let end = start + count < capacity ? start + count : start + count - capacity 0678 0679 // Slide trailing items to the left 0680 if i <= end { // No wrap anywhere after start of collapsed range 0681 // ....AB.̲..CD... 0682 p.advancedBy(i).moveInitializeFrom(p.advancedBy(i + rc), count: end - i - rc) 0683 // ....ABC̲D...... 0684 } 0685 else if i + rc > capacity { // Collapsed range is wrapped 0686 if end <= rc { // Result will not be wrapped 0687 // .CD......AB.̲.. 0688 p.advancedBy(i).moveInitializeFrom(p.advancedBy(i + rc - capacity), count: capacity + end - i - rc) 0689 // .........ABC̲D. 0690 } 0691 else { // Result will remain wrapped 0692 // .CDEFG...AB.̲.. 0693 p.advancedBy(i).moveInitializeFrom(p.advancedBy(i + rc - capacity), count: capacity - i) 0694 // ....FG...ABC̲DE 0695 p.moveInitializeFrom(p.advancedBy(rc), count: end - rc) 0696 // FG.......ABC̲DE 0697 } 0698 } 0699 else { // Wrap is after collapsed range 0700 if end <= rc { // Result will not be wrapped 0701 // D.......AB.̲..C 0702 p.advancedBy(i).moveInitializeFrom(p.advancedBy(i + rc), count: capacity - i - rc) 0703 // D.......ABC̲... 0704 p.advancedBy(capacity - rc).moveInitializeFrom(p, count: end) 0705 // ........ABC̲D.. 0706 } 0707 else { // Result will remain wrapped 0708 // DEFG....AB.̲..C 0709 p.advancedBy(i).moveInitializeFrom(p.advancedBy(i + rc), count: capacity - i - rc) 0710 // DEFG....ABC̲... 0711 p.advancedBy(capacity - rc).moveInitializeFrom(p, count: rc) 0712 // ...G....ABC̲DEF 0713 p.moveInitializeFrom(p.advancedBy(rc), count: end - rc) 0714 // G.......ABC̲DEF 0715 } 0716 } 0717 count -= rc 0718 } 0719 else { 0720 // Slide preceding items to the right 0721 if j >= start { // No wrap anywhere before end of collapsed range 0722 // ...AB...C̲D... 0723 p.advancedBy(start + rc).moveInitializeBackwardFrom(p.advancedBy(start), count: j - start - rc) 0724 // ......ABC̲D... 0725 } 0726 else if j < rc { // Collapsed range is wrapped 0727 if start + rc >= capacity { // Result will not be wrapped 0728 // ...C̲D.....AB.. 0729 p.advancedBy(start + rc - capacity).moveInitializeFrom(p.advancedBy(start), count: capacity + j - start - rc) 0730 // .ABC̲D......... 0731 } 0732 else { // Result will remain wrapped 0733 // ..E̲F.....ABCD.. 0734 p.moveInitializeFrom(p.advancedBy(capacity - rc), count: j) 0735 // CDE̲F.....AB.... 0736 p.advancedBy(start + rc).moveInitializeBackwardFrom(p.advancedBy(start), count: capacity - start - rc) 0737 // CDE̲F.........AB 0738 } 0739 } 0740 else { // Wrap is before collapsed range 0741 if capacity - start <= rc { // Result will not be wrapped 0742 // CD...E̲F.....AB 0743 p.advancedBy(rc).moveInitializeBackwardFrom(p, count: j - rc) 0744 // ...CDE̲F.....AB 0745 p.advancedBy(start + rc - capacity).moveInitializeFrom(p.advancedBy(start), count: capacity - start) 0746 // .ABCDE̲F....... 0747 } 0748 else { // Result will remain wrapped 0749 // EF...G̲H...ABCD 0750 p.advancedBy(rc).moveInitializeBackwardFrom(p, count: j - rc) 0751 // ...EFG̲H...ABCD 0752 p.moveInitializeFrom(p.advancedBy(capacity) - rc, count: rc) 0753 // BCDEFG̲H...A... 0754 p.advancedBy(start + rc).moveInitializeBackwardFrom(p.advancedBy(start), count: capacity - start - rc) 0755 // BCDEFG̲H......A 0756 } 0757 } 0758 start = (start + rc < capacity ? start + rc : start + rc - capacity) 0759 count -= rc 0760 } 0761 } 0762 0763 internal func replaceRange
Deque.swift:237 buffer.removeRange(i...i)Deque.swift:256 buffer.removeRange(0 ..< n)Deque.swift:265 buffer.removeRange(range)Deque.swift:273 buffer.removeRange(0..<count)Deque.swift:299 buffer.removeRange(c - n ..< c)Deque.swift:782 removeRange(range.startIndex + common ..< range.endIndex)<C: CollectionType where C.Generator.Element == Element>(range: Range<Int>, with newElements: C) { 0764 let newCount: Int = numericCast(newElements.count) 0765 let delta = newCount - range.count 0766 assert(count + delta < capacity) 0767 let common = min(range.count, newCount) 0768 if common > 0 { 0769 let p = elements 0770 var q = p.advancedBy(bufferIndexForDequeIndex(range.startIndex)) 0771 let limit = p.advancedBy(capacity) 0772 var i = common 0773 for element in newElements { 0774 q.memory = element 0775 q = q.successor() 0776 if q == limit { q = p } 0777 i -= 1 0778 if i == 0 { break } 0779 } 0780 } 0781 if range.count > common { 0782 removeRange(range.startIndex + common ..< range.endIndex) 0783 } 0784 else if newCount > common { 0785 openGapAt(range.startIndex + common, length: newCount - common) 0786 let p = elements 0787 var q = p.advancedBy(bufferIndexForDequeIndex(range.startIndex + common)) 0788 let limit = p.advancedBy(capacity) 0789 var i = newElements.startIndex.advancedBy(numericCast(common)) 0790 while i != newElements.endIndex { 0791 q.initialize(newElements[i]) 0792 i = i.successor() 0793 q = q.successor() 0794 if q == limit { q = p } 0795 } 0796 } 0797 } 0798 } 0799 0800 //MARK: 0801 0802 extension DequeBuffer { 0803 internal func forEach
Deque.swift:170 buffer.replaceRange(range, with: newElements)(@noescape body: (Element) throws -> ()) rethrows { 0804 if start + count <= capacity { 0805 var p = elements + start 0806 for _ in 0 ..< count { 0807 try body(p.memory) 0808 p += 1 0809 } 0810 } 0811 else { 0812 var p = elements + start 0813 for _ in start ..< capacity { 0814 try body(p.memory) 0815 p += 1 0816 } 0817 p = elements 0818 for _ in 0 ..< start + count - capacity { 0819 try body(p.memory) 0820 p += 1 0821 } 0822 } 0823 } 0824 } 0825 0826 extension Deque { 0827 public func forEach
Deque.swift:829 try buffer.forEach(body)(@noescape body: (Element) throws -> ()) rethrows { 0828 try withExtendedLifetime(buffer) { buffer in 0829 try buffer.forEach(body) 0830 } 0831 } 0832 0833 public func map<T>(@noescape transform: (Element) throws -> T) rethrows -> [T] { 0834 var result: [T] = [] 0835 result.reserveCapacity(self.count) 0836 try self.forEach { result.append(try transform($0)) } 0837 return result 0838 } 0839 0840 public func flatMap<T>(@noescape transform: (Element) throws -> T?) rethrows -> [T] { 0841 var result: [T] = [] 0842 try self.forEach { 0843 if let r = try transform($0) { 0844 result.append(r) 0845 } 0846 } 0847 return result 0848 } 0849 0850 public func flatMap<S: SequenceType>(transform: (Element) throws -> S) rethrows -> [S.Generator.Element] { 0851 var result: [S.Generator.Element] = [] 0852 try self.forEach { 0853 result.appendContentsOf(try transform($0)) 0854 } 0855 return result 0856 } 0857 0858 public func filter(@noescape includeElement: (Element) throws -> Bool) rethrows -> [Element] { 0859 var result: [Element] = [] 0860 try self.forEach { 0861 if try includeElement($0) { 0862 result.append($0) 0863 } 0864 } 0865 return result 0866 } 0867 0868 public func reduce<T>(initial: T, @noescape combine: (T, Element) throws -> T) rethrows -> T { 0869 var result = initial 0870 try self.forEach { 0871 result = try combine(result, $0) 0872 } 0873 return result 0874 } 0875 } 0876 0877
Deque.swift:836 try self.forEach { result.append(try transform($0)) }Deque.swift:842 try self.forEach {Deque.swift:852 try self.forEach {Deque.swift:860 try self.forEach {Deque.swift:870 try self.forEach {