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