Skip to content

Commit 7696e71

Browse files
committed
core: rework linked list iteration for better lookahead access
Signed-off-by: Eloi Charpentier <[email protected]>
1 parent 2c90995 commit 7696e71

File tree

2 files changed

+26
-28
lines changed

2 files changed

+26
-28
lines changed

core/kt-osrd-utils/src/main/kotlin/fr/sncf/osrd/utils/AppendOnlyLinkedList.kt

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,7 @@ class AppendOnlyLinkedList<T>(private var lastNode: Node<T>? = null, var size: I
2020
*/
2121
operator fun get(index: Int): T {
2222
if (index >= size || index < 0) throw IndexOutOfBoundsException()
23-
var node = lastNode!!
24-
while (node.currentIndex != index) {
25-
node = node.prev!!
26-
}
27-
return node.element
23+
return iterateNodesBackwards().first { it.currentIndex == index }.element
2824
}
2925

3026
fun isEmpty(): Boolean {
@@ -57,24 +53,12 @@ class AppendOnlyLinkedList<T>(private var lastNode: Node<T>? = null, var size: I
5753
* calls on elements that aren't near the end.
5854
*/
5955
fun toList(): List<T> {
60-
val res = mutableListOf<T>()
61-
var node = lastNode
62-
while (node != null) {
63-
res.add(node.element)
64-
node = node.prev
65-
}
66-
return res.reversed()
56+
return iterateBackwards().toList().reversed()
6757
}
6858

6959
/** Converts the linked list into a set. */
7060
fun toSet(): Set<T> {
71-
val res = mutableSetOf<T>()
72-
var node = lastNode
73-
while (node != null) {
74-
res.add(node.element)
75-
node = node.prev
76-
}
77-
return res
61+
return iterateBackwards().toSet()
7862
}
7963

8064
/** Returns the last element of the list */
@@ -102,18 +86,29 @@ class AppendOnlyLinkedList<T>(private var lastNode: Node<T>? = null, var size: I
10286
* Iterate over the list backwards, returning the first seen element that fits the predicate.
10387
*/
10488
fun findLast(predicate: (T) -> Boolean): T? {
105-
var node = lastNode
106-
while (node != null) {
107-
if (predicate.invoke(node.element)) return node.element
108-
node = node.prev
109-
}
110-
return null
89+
return iterateBackwards().firstOrNull(predicate)
11190
}
11291

11392
/** Utility function for debugger views. */
11493
override fun toString(): String {
11594
return toList().toString()
11695
}
96+
97+
private fun iterateBackwards(): Sequence<T> {
98+
return iterateNodesBackwards().map { it.element }
99+
}
100+
101+
fun iterateIndexedBackwards(): Sequence<IndexedValue<T>> {
102+
return iterateNodesBackwards().map { IndexedValue(it.currentIndex, it.element) }
103+
}
104+
105+
private fun iterateNodesBackwards(): Sequence<Node<T>> = sequence {
106+
var node = lastNode
107+
while (node != null) {
108+
yield(node)
109+
node = node.prev
110+
}
111+
}
117112
}
118113

119114
/** Returns a new empty list */

core/src/main/kotlin/fr/sncf/osrd/stdcm/infra_exploration/InfraExplorer.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -263,9 +263,12 @@ private class InfraExplorerImpl(
263263
}
264264

265265
override fun getLookahead(): List<BlockRange> {
266-
val res = mutableListOf<BlockRange>()
267-
for (i in currentIndex + 1..<blockRanges.size) res.add(blockRanges[i])
268-
return res
266+
return blockRanges
267+
.iterateIndexedBackwards()
268+
.takeWhile { it.index > currentIndex }
269+
.map { it.value }
270+
.toList()
271+
.reversed()
269272
}
270273

271274
override fun clone(): InfraExplorer {

0 commit comments

Comments
 (0)