diff --git a/src/main/kotlin/com/github/pemistahl/lingua/internal/util/KeyIndexer.kt b/src/main/kotlin/com/github/pemistahl/lingua/internal/util/KeyIndexer.kt index a548f074..7cdae816 100644 --- a/src/main/kotlin/com/github/pemistahl/lingua/internal/util/KeyIndexer.kt +++ b/src/main/kotlin/com/github/pemistahl/lingua/internal/util/KeyIndexer.kt @@ -24,13 +24,14 @@ internal interface KeyIndexer { const val NO_INDEX = -1 private fun Collection.asSet() = (this as? Set) ?: this.toSet() - fun > fromEnumConstants(constants: Collection) = fromEnumConstants(constants.asSet()) + inline fun > fromEnumConstants(constants: Collection) = + fromEnumConstants(constants.asSet()) /** Creates an indexer for a subset of all enum constants. */ - fun > fromEnumConstants(constants: Set): KeyIndexer { - val enumClass = constants.first().declaringJavaClass - val allConstants = enumClass.enumConstants - if (allConstants.size == constants.size) return forAllEnumConstants(enumClass) + inline fun > fromEnumConstants(constants: Set): KeyIndexer { + require(constants.isNotEmpty()) + val allConstants = E::class.java.enumConstants + if (allConstants.size == constants.size) return forAllEnumConstants() val ordinalToIndex = IntArray(allConstants.size) { NO_INDEX } @@ -40,26 +41,24 @@ internal interface KeyIndexer { index++ } - val indexToConstant = arrayOfNulls(index) + val indexToConstant = arrayOfNulls(index) constants.forEach { indexToConstant[ordinalToIndex[it.ordinal]] = it } + val indicesCount = index return object : KeyIndexer { - override fun indicesCount() = index + override fun indicesCount() = indicesCount override fun keyToIndex(key: E) = ordinalToIndex[key.ordinal] - @Suppress("UNCHECKED_CAST") - override fun indexToKey(index: Int) = indexToConstant[index] as E + // Using `!!` is fine here, assuming KeyIndexer is used correctly and only valid indices are used + override fun indexToKey(index: Int) = indexToConstant[index]!! } } - inline fun > forAllEnumConstants() = forAllEnumConstants(E::class.java) - - @JvmStatic - fun > forAllEnumConstants(enumClass: Class): KeyIndexer { - val enumConstants = enumClass.enumConstants + inline fun > forAllEnumConstants(): KeyIndexer { + val enumConstants = E::class.java.enumConstants return object : KeyIndexer { override fun indicesCount() = enumConstants.size