Подправим производительность
This commit is contained in:
parent
f751c126f6
commit
c7952ba53d
@ -8,24 +8,24 @@ import com.google.gson.JsonPrimitive
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap
|
||||
|
||||
private fun flattenJsonPrimitive(input: JsonPrimitive): Any {
|
||||
private fun flattenJsonPrimitive(input: JsonPrimitive, interner: (String) -> String = String::intern): Any {
|
||||
if (input.isNumber) {
|
||||
return input.asNumber
|
||||
} else if (input.isString) {
|
||||
return input.asString.intern()
|
||||
return interner(input.asString)
|
||||
} else {
|
||||
return input.asBoolean
|
||||
}
|
||||
}
|
||||
|
||||
private fun flattenJsonArray(input: JsonArray): ArrayList<Any> {
|
||||
private fun flattenJsonArray(input: JsonArray, interner: (String) -> String = String::intern): ArrayList<Any> {
|
||||
val flattened = ArrayList<Any>(input.size())
|
||||
|
||||
for (v in input) {
|
||||
when (v) {
|
||||
is JsonObject -> flattened.add(flattenJsonObject(v))
|
||||
is JsonArray -> flattened.add(flattenJsonArray(v))
|
||||
is JsonPrimitive -> flattened.add(flattenJsonPrimitive(v))
|
||||
is JsonObject -> flattened.add(flattenJsonObject(v, interner))
|
||||
is JsonArray -> flattened.add(flattenJsonArray(v, interner))
|
||||
is JsonPrimitive -> flattened.add(flattenJsonPrimitive(v, interner))
|
||||
// is JsonNull -> baked.add(null)
|
||||
}
|
||||
}
|
||||
@ -33,30 +33,30 @@ private fun flattenJsonArray(input: JsonArray): ArrayList<Any> {
|
||||
return flattened
|
||||
}
|
||||
|
||||
private fun flattenJsonObject(input: JsonObject): MutableMap<String, Any> {
|
||||
private fun flattenJsonObject(input: JsonObject, interner: (String) -> String = String::intern): MutableMap<String, Any> {
|
||||
val flattened = Object2ObjectOpenHashMap<String, Any>()
|
||||
|
||||
for ((k, v) in input.entrySet()) {
|
||||
when (v) {
|
||||
is JsonObject -> flattened[k] = flattenJsonObject(v)
|
||||
is JsonArray -> flattened[k] = flattenJsonArray(v)
|
||||
is JsonPrimitive -> flattened[k] = flattenJsonPrimitive(v)
|
||||
is JsonObject -> flattened[k] = flattenJsonObject(v, interner)
|
||||
is JsonArray -> flattened[k] = flattenJsonArray(v, interner)
|
||||
is JsonPrimitive -> flattened[k] = flattenJsonPrimitive(v, interner)
|
||||
}
|
||||
}
|
||||
|
||||
return flattened
|
||||
}
|
||||
|
||||
fun flattenJsonElement(input: JsonElement): Any? {
|
||||
fun flattenJsonElement(input: JsonElement, interner: (String) -> String = String::intern): Any? {
|
||||
return when (input) {
|
||||
is JsonObject -> flattenJsonObject(input)
|
||||
is JsonArray -> flattenJsonArray(input)
|
||||
is JsonPrimitive -> flattenJsonPrimitive(input)
|
||||
is JsonObject -> flattenJsonObject(input, interner)
|
||||
is JsonArray -> flattenJsonArray(input, interner)
|
||||
is JsonPrimitive -> flattenJsonPrimitive(input, interner)
|
||||
is JsonNull -> null
|
||||
else -> throw IllegalArgumentException("Unknown argument $input")
|
||||
}
|
||||
}
|
||||
|
||||
fun flattenJsonElement(input: JsonObject) = flattenJsonObject(input)
|
||||
fun flattenJsonElement(input: JsonArray) = flattenJsonArray(input)
|
||||
fun flattenJsonElement(input: JsonPrimitive) = flattenJsonPrimitive(input)
|
||||
fun flattenJsonElement(input: JsonObject, interner: (String) -> String = String::intern) = flattenJsonObject(input, interner)
|
||||
fun flattenJsonElement(input: JsonArray, interner: (String) -> String = String::intern) = flattenJsonArray(input, interner)
|
||||
fun flattenJsonElement(input: JsonPrimitive, interner: (String) -> String = String::intern) = flattenJsonPrimitive(input, interner)
|
||||
|
@ -2,6 +2,7 @@ package ru.dbotthepony.kstarbound.defs
|
||||
|
||||
import com.google.common.collect.ImmutableMap
|
||||
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap
|
||||
import ru.dbotthepony.kstarbound.Starbound
|
||||
import ru.dbotthepony.kstarbound.io.json.INativeJsonHolder
|
||||
|
||||
/**
|
||||
@ -15,7 +16,7 @@ import ru.dbotthepony.kstarbound.io.json.INativeJsonHolder
|
||||
*/
|
||||
abstract class RawPrototype<RAW : RawPrototype<RAW, ASSEMBLED>, ASSEMBLED : AssembledPrototype<ASSEMBLED, RAW>> : INativeJsonHolder {
|
||||
val json = Object2ObjectArrayMap<String, Any>()
|
||||
fun enroll() = enrollMap(json)
|
||||
fun enroll() = enrollMap(json, Starbound.assetStringInterner::intern)
|
||||
abstract fun assemble(directory: String = ""): ASSEMBLED
|
||||
|
||||
override fun acceptJson(json: MutableMap<String, Any>) {
|
||||
|
@ -13,6 +13,7 @@ import com.google.gson.stream.JsonWriter
|
||||
import it.unimi.dsi.fastutil.objects.ObjectArraySet
|
||||
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet
|
||||
import org.apache.logging.log4j.LogManager
|
||||
import ru.dbotthepony.kstarbound.Starbound
|
||||
import ru.dbotthepony.kstarbound.defs.flattenJsonElement
|
||||
import ru.dbotthepony.kstarbound.util.NotNullVar
|
||||
import kotlin.reflect.KClass
|
||||
@ -95,7 +96,12 @@ class BuilderAdapter<T : Any> private constructor(
|
||||
if (instance is IJsonHolder) {
|
||||
val obj = TypeAdapters.JSON_ELEMENT.read(reader)
|
||||
reader = JsonTreeReader(obj)
|
||||
instance.acceptJson(obj.asJsonObject)
|
||||
|
||||
if (instance is INativeJsonHolder) {
|
||||
instance.acceptJson(flattenJsonElement(obj.asJsonObject, Starbound.assetStringInterner::intern))
|
||||
} else {
|
||||
instance.acceptJson(obj.asJsonObject)
|
||||
}
|
||||
}
|
||||
|
||||
reader.beginObject()
|
||||
|
Loading…
Reference in New Issue
Block a user