@@ -51,7 +51,7 @@ class ListBuffer[A]
5151 private [this ] var aliased = false
5252 private [this ] var len = 0
5353
54- private type Predecessor [ A0 ] = :: [A0 ] /* | Null*/
54+ private type Predecessor = :: [A ] /* | Null*/
5555
5656 def iterator : Iterator [A ] = new MutationTracker .CheckedIterator (first.iterator, mutationCount)
5757
@@ -186,7 +186,8 @@ class ListBuffer[A]
186186 last0 = null
187187 }
188188
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 =
190191 if (i == 0 ) null
191192 else if (i == len) last0
192193 else {
@@ -196,10 +197,10 @@ class ListBuffer[A]
196197 p = p.tail
197198 j -= 1
198199 }
199- p.asInstanceOf [Predecessor [ A ] ]
200+ p.asInstanceOf [Predecessor ]
200201 }
201202
202- private def getNext (p : Predecessor [ A ] ): List [A ] =
203+ private def getNext (p : Predecessor ): List [A ] =
203204 if (p == null ) first else p.next
204205
205206 def update (idx : Int , elem : A ): Unit = {
@@ -213,7 +214,7 @@ class ListBuffer[A]
213214 first = newElem
214215 } else {
215216 // `p` can not be `null` because the case where `idx == 0` is handled above
216- val p = locate (idx)
217+ val p = predecessor (idx)
217218 val newElem = new :: (elem, p.tail.tail)
218219 if (last0 eq p.tail) {
219220 last0 = newElem
@@ -227,7 +228,7 @@ class ListBuffer[A]
227228 if (idx < 0 || idx > len) throw CommonErrors .indexOutOfBounds(index = idx, max = len - 1 )
228229 if (idx == len) addOne(elem)
229230 else {
230- val p = locate (idx)
231+ val p = predecessor (idx)
231232 val nx = elem :: getNext(p)
232233 if (p eq null ) first = nx else p.next = nx
233234 len += 1
@@ -240,7 +241,7 @@ class ListBuffer[A]
240241 }
241242
242243 // `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 = {
244245 if (! fresh.isEmpty) {
245246 val follow = getNext(prev)
246247 if (prev eq null ) first = fresh.first else prev.next = fresh.first
@@ -258,15 +259,15 @@ class ListBuffer[A]
258259 else {
259260 val fresh = new ListBuffer [A ].freshFrom(it)
260261 ensureUnaliased()
261- insertAfter(locate (idx), fresh)
262+ insertAfter(predecessor (idx), fresh)
262263 }
263264 }
264265 }
265266
266267 def remove (idx : Int ): A = {
267268 ensureUnaliased()
268269 if (idx < 0 || idx >= len) throw CommonErrors .indexOutOfBounds(index = idx, max = len - 1 )
269- val p = locate (idx)
270+ val p = predecessor (idx)
270271 val nx = getNext(p)
271272 if (p eq null ) {
272273 first = nx.tail
@@ -283,12 +284,12 @@ class ListBuffer[A]
283284 if (count > 0 ) {
284285 ensureUnaliased()
285286 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)
287288 } else if (count < 0 ) {
288289 throw new IllegalArgumentException (" removing negative number of elements: " + count)
289290 }
290291
291- private def removeAfter (prev : Predecessor [ A ] , n : Int ) = {
292+ private def removeAfter (prev : Predecessor , n : Int ) = {
292293 @ tailrec def ahead (p : List [A ], n : Int ): List [A ] =
293294 if (n == 0 ) p else ahead(p.tail, n - 1 )
294295 val nx = ahead(getNext(prev), n)
@@ -345,7 +346,7 @@ class ListBuffer[A]
345346 */
346347 def filterInPlace (p : A => Boolean ): this .type = {
347348 ensureUnaliased()
348- var prev : Predecessor [ A ] = null
349+ var prev : Predecessor = null
349350 var cur : List [A ] = first
350351 while (! cur.isEmpty) {
351352 val follow = cur.tail
@@ -354,7 +355,7 @@ class ListBuffer[A]
354355 else prev.next = follow
355356 len -= 1
356357 } else {
357- prev = cur.asInstanceOf [Predecessor [ A ] ]
358+ prev = cur.asInstanceOf [Predecessor ]
358359 }
359360 cur = follow
360361 }
@@ -378,7 +379,7 @@ class ListBuffer[A]
378379 ensureUnaliased()
379380 val i = math.min(_from, _len)
380381 val n = math.min(_replaced, _len)
381- val p = locate (i)
382+ val p = predecessor (i)
382383 removeAfter(p, math.min(n, _len - i))
383384 insertAfter(p, fresh)
384385 }
0 commit comments