@@ -51,7 +51,7 @@ class ListBuffer[A]
51
51
private [this ] var aliased = false
52
52
private [this ] var len = 0
53
53
54
- private type Predecessor [ A0 ] = :: [A0 ] /* | Null*/
54
+ private type Predecessor = :: [A ] /* | Null*/
55
55
56
56
def iterator : Iterator [A ] = new MutationTracker .CheckedIterator (first.iterator, mutationCount)
57
57
@@ -186,7 +186,8 @@ class ListBuffer[A]
186
186
last0 = null
187
187
}
188
188
189
- private def locate (i : Int ): Predecessor [A ] =
189
+ // returns the `::` at `i - 1` (such that its `next` at position `i` can be mutated), or `null` if `i == 0`.
190
+ private def predecessor (i : Int ): Predecessor =
190
191
if (i == 0 ) null
191
192
else if (i == len) last0
192
193
else {
@@ -196,10 +197,10 @@ class ListBuffer[A]
196
197
p = p.tail
197
198
j -= 1
198
199
}
199
- p.asInstanceOf [Predecessor [ A ] ]
200
+ p.asInstanceOf [Predecessor ]
200
201
}
201
202
202
- private def getNext (p : Predecessor [ A ] ): List [A ] =
203
+ private def getNext (p : Predecessor ): List [A ] =
203
204
if (p == null ) first else p.next
204
205
205
206
def update (idx : Int , elem : A ): Unit = {
@@ -213,7 +214,7 @@ class ListBuffer[A]
213
214
first = newElem
214
215
} else {
215
216
// `p` can not be `null` because the case where `idx == 0` is handled above
216
- val p = locate (idx)
217
+ val p = predecessor (idx)
217
218
val newElem = new :: (elem, p.tail.tail)
218
219
if (last0 eq p.tail) {
219
220
last0 = newElem
@@ -227,7 +228,7 @@ class ListBuffer[A]
227
228
if (idx < 0 || idx > len) throw CommonErrors .indexOutOfBounds(index = idx, max = len - 1 )
228
229
if (idx == len) addOne(elem)
229
230
else {
230
- val p = locate (idx)
231
+ val p = predecessor (idx)
231
232
val nx = elem :: getNext(p)
232
233
if (p eq null ) first = nx else p.next = nx
233
234
len += 1
@@ -240,7 +241,7 @@ class ListBuffer[A]
240
241
}
241
242
242
243
// `fresh` must be a `ListBuffer` that only we have access to
243
- private def insertAfter (prev : Predecessor [ A ] , fresh : ListBuffer [A ]): Unit = {
244
+ private def insertAfter (prev : Predecessor , fresh : ListBuffer [A ]): Unit = {
244
245
if (! fresh.isEmpty) {
245
246
val follow = getNext(prev)
246
247
if (prev eq null ) first = fresh.first else prev.next = fresh.first
@@ -258,15 +259,15 @@ class ListBuffer[A]
258
259
else {
259
260
val fresh = new ListBuffer [A ].freshFrom(it)
260
261
ensureUnaliased()
261
- insertAfter(locate (idx), fresh)
262
+ insertAfter(predecessor (idx), fresh)
262
263
}
263
264
}
264
265
}
265
266
266
267
def remove (idx : Int ): A = {
267
268
ensureUnaliased()
268
269
if (idx < 0 || idx >= len) throw CommonErrors .indexOutOfBounds(index = idx, max = len - 1 )
269
- val p = locate (idx)
270
+ val p = predecessor (idx)
270
271
val nx = getNext(p)
271
272
if (p eq null ) {
272
273
first = nx.tail
@@ -283,12 +284,12 @@ class ListBuffer[A]
283
284
if (count > 0 ) {
284
285
ensureUnaliased()
285
286
if (idx < 0 || idx + count > len) throw new IndexOutOfBoundsException (s " $idx to ${idx + count} is out of bounds (min 0, max ${len - 1 }) " )
286
- removeAfter(locate (idx), count)
287
+ removeAfter(predecessor (idx), count)
287
288
} else if (count < 0 ) {
288
289
throw new IllegalArgumentException (" removing negative number of elements: " + count)
289
290
}
290
291
291
- private def removeAfter (prev : Predecessor [ A ] , n : Int ) = {
292
+ private def removeAfter (prev : Predecessor , n : Int ) = {
292
293
@ tailrec def ahead (p : List [A ], n : Int ): List [A ] =
293
294
if (n == 0 ) p else ahead(p.tail, n - 1 )
294
295
val nx = ahead(getNext(prev), n)
@@ -345,7 +346,7 @@ class ListBuffer[A]
345
346
*/
346
347
def filterInPlace (p : A => Boolean ): this .type = {
347
348
ensureUnaliased()
348
- var prev : Predecessor [ A ] = null
349
+ var prev : Predecessor = null
349
350
var cur : List [A ] = first
350
351
while (! cur.isEmpty) {
351
352
val follow = cur.tail
@@ -354,7 +355,7 @@ class ListBuffer[A]
354
355
else prev.next = follow
355
356
len -= 1
356
357
} else {
357
- prev = cur.asInstanceOf [Predecessor [ A ] ]
358
+ prev = cur.asInstanceOf [Predecessor ]
358
359
}
359
360
cur = follow
360
361
}
@@ -378,7 +379,7 @@ class ListBuffer[A]
378
379
ensureUnaliased()
379
380
val i = math.min(_from, _len)
380
381
val n = math.min(_replaced, _len)
381
- val p = locate (i)
382
+ val p = predecessor (i)
382
383
removeAfter(p, math.min(n, _len - i))
383
384
insertAfter(p, fresh)
384
385
}
0 commit comments