aboutsummaryrefslogtreecommitdiff
path: root/common-util
diff options
context:
space:
mode:
authorJiaxiang Chen <jiaxiang@google.com>2022-02-08 23:50:09 -0800
committerJiaxiang Chen <roaringacw@gmail.com>2022-02-09 14:22:47 -0800
commit51fcfb8de383a1e2469f6786dc6fdbec0baddaa3 (patch)
tree850eaee6f0f15c51c41cb7ac65eaa98030c543a4 /common-util
parentf26de8f0566c9e3fee9210828b5c69ea608da584 (diff)
downloadksp-51fcfb8de383a1e2469f6786dc6fdbec0baddaa3.tar.gz
use index to track memoized sequence iterator status
Diffstat (limited to 'common-util')
-rw-r--r--common-util/src/main/kotlin/com/google/devtools/ksp/MemoizedSequence.kt18
-rw-r--r--common-util/src/test/kotlin/com/google/devtools/ksp/MemoizedSequenceTest.kt27
2 files changed, 36 insertions, 9 deletions
diff --git a/common-util/src/main/kotlin/com/google/devtools/ksp/MemoizedSequence.kt b/common-util/src/main/kotlin/com/google/devtools/ksp/MemoizedSequence.kt
index 49bfcecc..9fa09323 100644
--- a/common-util/src/main/kotlin/com/google/devtools/ksp/MemoizedSequence.kt
+++ b/common-util/src/main/kotlin/com/google/devtools/ksp/MemoizedSequence.kt
@@ -3,29 +3,29 @@ package com.google.devtools.ksp
// TODO: garbage collect underlying sequence after exhaust.
class MemoizedSequence<T>(sequence: Sequence<T>) : Sequence<T> {
- private val cache = mutableListOf<T>()
+ private val cache = arrayListOf<T>()
private val iter: Iterator<T> by lazy {
sequence.iterator()
}
- private inner class CachedIterator(val iterCache: Iterator<T>, var buffer: Int) : Iterator<T> {
+ private inner class CachedIterator() : Iterator<T> {
+ var idx = 0
override fun hasNext(): Boolean {
- return buffer > 0 || iter.hasNext()
+ return idx < cache.size || iter.hasNext()
}
override fun next(): T {
- if (buffer > 0) {
- buffer --
- return iterCache.next()
+ if (idx == cache.size) {
+ cache.add(iter.next())
}
- val value = iter.next()
- cache.add(value)
+ val value = cache[idx]
+ idx += 1
return value
}
}
override fun iterator(): Iterator<T> {
- return CachedIterator(cache.iterator(), cache.size)
+ return CachedIterator()
}
}
diff --git a/common-util/src/test/kotlin/com/google/devtools/ksp/MemoizedSequenceTest.kt b/common-util/src/test/kotlin/com/google/devtools/ksp/MemoizedSequenceTest.kt
new file mode 100644
index 00000000..52ac4b2a
--- /dev/null
+++ b/common-util/src/test/kotlin/com/google/devtools/ksp/MemoizedSequenceTest.kt
@@ -0,0 +1,27 @@
+package com.google.devtools.ksp
+
+import org.junit.Assert
+import org.junit.Test
+
+class MemoizedSequenceTest {
+ @Test
+ fun testConcurrentRead() {
+ val memoized = MemoizedSequence(
+ sequenceOf(1, 2, 3, 4, 5, 6)
+ )
+ val s1 = memoized.iterator()
+ val s2 = memoized.iterator()
+ val s1read = mutableListOf<Int>()
+ val s2read = mutableListOf<Int>()
+ while (s1.hasNext() || s2.hasNext()) {
+ if (s1.hasNext()) {
+ s1read.add(s1.next())
+ }
+ if (s2.hasNext()) {
+ s2read.add(s2.next())
+ }
+ }
+ Assert.assertEquals(listOf(1, 2, 3, 4, 5, 6), s1read)
+ Assert.assertEquals(listOf(1, 2, 3, 4, 5, 6), s2read)
+ }
+}