Skip to content

Instantly share code, notes, and snippets.

@hikaMaeng
Created February 23, 2025 05:32
Show Gist options
  • Save hikaMaeng/702c1ff251854b7aa81521cd76fdd2fb to your computer and use it in GitHub Desktop.
Save hikaMaeng/702c1ff251854b7aa81521cd76fdd2fb to your computer and use it in GitHub Desktop.
@file:Suppress("UNCHECKED_CAST", "NOTHING_TO_INLINE", "OVERRIDE_BY_INLINE")
package kore.savable
class ArrayMap(@PublishedApi internal val keyList:List<String>, @PublishedApi internal val valueList:List<Any?>):Map<String, Any?>{
class KeySet(val keyList:List<String>):Set<String>{
override inline val size:Int get() = keyList.size
override inline fun isEmpty():Boolean = keyList.isEmpty()
override inline fun contains(element:String):Boolean = keyList.indexOf(element) != -1
override inline fun iterator():Iterator<String> = keyList.iterator()
override inline fun containsAll(elements:Collection<String>):Boolean = elements.all{contains(it)}
}
class EntrySet(val keyList:List<String>, val valueList:List<Any?>):Set<Map.Entry<String, Any?>>{
class Entry(override val key:String, override val value:Any?):Map.Entry<String, Any?>
@PublishedApi internal var _entryList:List<Map.Entry<String, Any?>>? = null
@PublishedApi internal inline val entryList:List<Map.Entry<String, Any?>> get() = _entryList ?: ArrayList<Map.Entry<String, Any?>>(size).also{list->
var i = 0
while(i < size){
list.add(Entry(keyList[i], valueList[i]))
i++
}
_entryList = list
}
override inline val size:Int get() = keyList.size
override inline fun isEmpty():Boolean = keyList.isEmpty()
override inline fun contains(element:Map.Entry<String, Any?>):Boolean = entryList.indexOf(element) != -1
override inline fun iterator():Iterator<Map.Entry<String, Any?>> = entryList.iterator()
override inline fun containsAll(elements:Collection<Map.Entry<String, Any?>>):Boolean = elements.all{contains(it)}
}
override inline val size:Int get() = keyList.size
override val keys:Set<String> = KeySet(keyList)
override val values:Collection<Any?> = valueList
@PublishedApi internal var _entrySet:EntrySet? = null
override inline val entries:Set<Map.Entry<String, Any?>> get() = _entrySet ?: EntrySet(keyList, valueList).also{_entrySet = it}
override fun isEmpty():Boolean = size == 0
override fun containsKey(key:String):Boolean = keyList.indexOf(key) != -1
override fun containsValue(value:Any?):Boolean = valueList.indexOf(value) != -1
override fun get(key:String):Any?{
val i = keyList.indexOf(key)
return if(i == -1) null else valueList[i]
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment