Skip to content

Commit 395cc6a

Browse files
authored
Merge pull request scala/scala#11063 from lrytz/listBufferLocate
Comment on private ListBuffer.locate [ci: last-only]
2 parents 2139ce3 + 9d4c513 commit 395cc6a

File tree

1 file changed

+15
-14
lines changed

1 file changed

+15
-14
lines changed

library/src/scala/collection/mutable/ListBuffer.scala

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)