From abf7a4c5ac653b8cc7174a6f61dc44bd4e080036 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 21 Dec 2021 18:57:06 +0300 Subject: [PATCH] Introduce ConcurrentMapBasedCache --- .../collections/ConcurrentNullableMap.kt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/collections/ConcurrentNullableMap.kt diff --git a/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/collections/ConcurrentNullableMap.kt b/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/collections/ConcurrentNullableMap.kt new file mode 100644 index 00000000000..0d099555e2a --- /dev/null +++ b/analysis/analysis-internal-utils/src/org/jetbrains/kotlin/analysis/utils/collections/ConcurrentNullableMap.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.utils.collections + +import java.util.concurrent.ConcurrentMap + +public class ConcurrentMapBasedCache(public val map: ConcurrentMap) { + public inline fun getOrPut( + key: K, + crossinline compute: (K) -> V? + ): V { + val value = map.getOrPut(key) { compute(key) ?: NullValue } + return value.nullValueToNull() + } +} + +public object NullValue + +@Suppress("NOTHING_TO_INLINE", "UNCHECKED_CAST") +public fun Any.nullValueToNull(): V = when (this) { + NullValue -> null + else -> this +} as V +