Remove savedcountingmap as it is not used
This commit is contained in:
parent
fc675811be
commit
f922df53be
@ -1,143 +0,0 @@
|
||||
package ru.dbotthepony.mc.otm.saveddata
|
||||
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap
|
||||
import it.unimi.dsi.fastutil.ints.Int2ObjectFunction
|
||||
import net.minecraft.core.HolderLookup
|
||||
import net.minecraft.nbt.CompoundTag
|
||||
import net.minecraft.nbt.IntTag
|
||||
import net.minecraft.nbt.ListTag
|
||||
import net.minecraft.nbt.Tag
|
||||
import net.minecraft.world.level.saveddata.SavedData
|
||||
import org.apache.logging.log4j.LogManager
|
||||
import ru.dbotthepony.mc.otm.core.collect.ProxiedMap
|
||||
import ru.dbotthepony.mc.otm.core.nbt.set
|
||||
import ru.dbotthepony.mc.otm.core.util.WriteOnce
|
||||
|
||||
class SavedMapDelegate<V>(val parent: SavedCountingMap<SavedMapDelegate<V>>?, val index: Int, value: V) {
|
||||
constructor(value: V) : this(null, -1, value)
|
||||
|
||||
var value: V = value
|
||||
set(value) {
|
||||
if (field != value) {
|
||||
field = value
|
||||
parent?.isDirty = true
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun <V> makeMap(
|
||||
serializer: (value: V) -> Tag,
|
||||
deserializer: (nbt: Tag) -> V,
|
||||
defaultValue: V
|
||||
): SavedCountingMap<SavedMapDelegate<V>> {
|
||||
return SavedCountingMap(
|
||||
serializer = { _, value, _ -> serializer.invoke(value.value) },
|
||||
deserializer = { map, nbt, index -> SavedMapDelegate(map, index, deserializer.invoke(nbt)) },
|
||||
factory = { map, index -> SavedMapDelegate(map, index, defaultValue) }
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class ProxiedCountingMap<T> : ProxiedMap<Int, T>(Int2ObjectAVLTreeMap()) {
|
||||
var parent: SavedCountingMap<T> by WriteOnce()
|
||||
|
||||
override fun onClear() {
|
||||
parent.isDirty = true
|
||||
}
|
||||
|
||||
override fun onValueAdded(key: Int, value: T) {
|
||||
parent.isDirty = true
|
||||
}
|
||||
|
||||
override fun onValueRemoved(key: Int, value: T) {
|
||||
parent.isDirty = true
|
||||
}
|
||||
}
|
||||
|
||||
class SavedCountingMap<T> private constructor(
|
||||
val serializer: (map: SavedCountingMap<T>, value: T, index: Int) -> Tag,
|
||||
val deserializer: (map: SavedCountingMap<T>, nbt: Tag, index: Int) -> T,
|
||||
val factory: (map: SavedCountingMap<T>, index: Int) -> T,
|
||||
private val map: ProxiedCountingMap<T>
|
||||
) : SavedData(), MutableMap<Int, T> by map {
|
||||
constructor(
|
||||
serializer: (map: SavedCountingMap<T>, value: T, index: Int) -> Tag,
|
||||
deserializer: (map: SavedCountingMap<T>, nbt: Tag, index: Int) -> T,
|
||||
factory: (map: SavedCountingMap<T>, index: Int) -> T,
|
||||
) : this(serializer, deserializer, factory, ProxiedCountingMap())
|
||||
|
||||
init {
|
||||
map.parent = this
|
||||
}
|
||||
|
||||
var nextIndex = 0
|
||||
private set
|
||||
|
||||
fun computeIfAbsent(index: Int): T {
|
||||
return map.computeIfAbsent(index, Int2ObjectFunction {
|
||||
isDirty = true
|
||||
return@Int2ObjectFunction factory.invoke(this, it)
|
||||
})
|
||||
}
|
||||
|
||||
fun factorize(): T {
|
||||
return computeIfAbsent(nextIndex++)
|
||||
}
|
||||
|
||||
override fun save(output: CompoundTag, registry: HolderLookup.Provider): CompoundTag {
|
||||
output["map"] = ListTag().also {
|
||||
for ((key, value) in this.map) {
|
||||
val compound = CompoundTag()
|
||||
|
||||
try {
|
||||
compound["value"] = this.serializer.invoke(this, value, key)
|
||||
it.add(compound)
|
||||
} catch(err: Exception) {
|
||||
LOGGER.error("Unable to serialize $value at $key", err)
|
||||
continue
|
||||
}
|
||||
|
||||
compound["key"] = key
|
||||
}
|
||||
}
|
||||
|
||||
output["next_index"] = nextIndex
|
||||
|
||||
return output
|
||||
}
|
||||
|
||||
fun load(input: CompoundTag): SavedCountingMap<T> {
|
||||
this.map.clear()
|
||||
|
||||
val map = input["map"] as? ListTag ?: ListTag()
|
||||
var maximal = -1
|
||||
|
||||
for (value in map) {
|
||||
if (value !is CompoundTag) {
|
||||
continue
|
||||
}
|
||||
|
||||
val key = (value["key"] as IntTag?)?.asInt ?: continue
|
||||
val nbt = value["value"] ?: continue
|
||||
|
||||
try {
|
||||
val deserialized = this.deserializer.invoke(this, nbt, key)
|
||||
this.map.put(key, deserialized)
|
||||
} catch(err: Exception) {
|
||||
LOGGER.error("Unable to deserialize value in $this at $key", err)
|
||||
}
|
||||
|
||||
maximal = maximal.coerceAtLeast(key)
|
||||
}
|
||||
|
||||
nextIndex = (input["next_index"] as IntTag?)?.asInt ?: (maximal + 1)
|
||||
|
||||
isDirty = false
|
||||
return this
|
||||
}
|
||||
|
||||
companion object {
|
||||
private val LOGGER = LogManager.getLogger()
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user