From ec98c6970c38d0d3436567222756674f2d51e58f Mon Sep 17 00:00:00 2001 From: DBotThePony <dbotthepony@yandex.ru> Date: Fri, 30 Dec 2022 11:40:30 +0700 Subject: [PATCH] =?UTF-8?q?=D0=A1=D1=82=D1=80=D0=BE=D0=BA=D0=BE=D0=B2?= =?UTF-8?q?=D1=8B=D0=B9=20=D0=B8=D0=BD=D1=82=D0=B5=D1=80=D0=BD=D0=B5=D1=80?= =?UTF-8?q?=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D1=91=D0=BC=20=D1=81=D1=80?= =?UTF-8?q?=D0=B0=D0=B7=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/dbotthepony/kstarbound/Starbound.kt | 2 -- .../kstarbound/io/KConcreteTypeAdapter.kt | 33 ++++++++----------- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt index 80cb3a6d..a4f76c81 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/Starbound.kt @@ -447,7 +447,5 @@ object Starbound { } } } - - items.values.forEach { println(it) } } } diff --git a/src/main/kotlin/ru/dbotthepony/kstarbound/io/KConcreteTypeAdapter.kt b/src/main/kotlin/ru/dbotthepony/kstarbound/io/KConcreteTypeAdapter.kt index b2b6f326..e3b6cbdc 100644 --- a/src/main/kotlin/ru/dbotthepony/kstarbound/io/KConcreteTypeAdapter.kt +++ b/src/main/kotlin/ru/dbotthepony/kstarbound/io/KConcreteTypeAdapter.kt @@ -18,7 +18,6 @@ import ru.dbotthepony.kstarbound.getValue import ru.dbotthepony.kstarbound.setValue import java.lang.reflect.Constructor import kotlin.jvm.internal.DefaultConstructorMarker -import kotlin.properties.Delegates import kotlin.reflect.* import kotlin.reflect.full.isSuperclassOf import kotlin.reflect.full.isSupertypeOf @@ -113,7 +112,7 @@ private class MapAdapter<K, V>(private val boundKey: Class<K>, private val bound } } -private class StringMapAdapter<V>(private val bound: Class<V>, private val stringAdapter: TypeAdapter<String>, private val interner: () -> Interner<String>) : TypeAdapter<Map<String, V>?>() { +private class StringMapAdapter<V>(private val bound: Class<V>, private val stringAdapter: TypeAdapter<String>, private val interner: Interner<String>) : TypeAdapter<Map<String, V>?>() { private val resolvedBound by lazy { resolveBound(bound, stringAdapter) } override fun write(out: JsonWriter, value: Map<String, V>?) { @@ -139,7 +138,7 @@ private class StringMapAdapter<V>(private val bound: Class<V>, private val strin val resolvedBound = resolvedBound while (reader.peek() != JsonToken.END_OBJECT) { - builder.put(interner.invoke().intern(reader.nextName()), resolvedBound.read(reader)) + builder.put(interner.intern(reader.nextName()), resolvedBound.read(reader)) } reader.endObject() @@ -174,10 +173,10 @@ private data class PackedProperty<Clazz : Any, T>( class KConcreteTypeAdapter<T : Any> private constructor( val bound: KClass<T>, private val types: ImmutableList<PackedProperty<T, *>>, - private val asJsonArray: Boolean = false + private val asJsonArray: Boolean = false, + private val stringInterner: Interner<String> ) : TypeAdapter<T>() { private val mapped = Object2IntArrayMap<String>() - private val internedStrings = Interners.newWeakInterner<String>() private val loggedMisses = ObjectArraySet<String>() var currentSymbolicName by ThreadLocal<String>() @@ -347,13 +346,6 @@ class KConcreteTypeAdapter<T : Any> private constructor( } } - // intern'им строки для более быстрой работы сравнения последних - for (i in readValues.indices) { - if (readValues[i] is String) { - readValues[i] = internedStrings.intern(readValues[i] as String) - } - } - if (asJsonArray) { reader.endArray() } else { @@ -442,7 +434,7 @@ class KConcreteTypeAdapter<T : Any> private constructor( */ class Builder<T : Any>(val clazz: KClass<T>) { private val types = ArrayList<PackedProperty<T, *>>() - private var interner by Delegates.notNull<Interner<String>>() + private val stringInterner = Interners.newWeakInterner<String>() private val internedStringAdapter: TypeAdapter<String> = object : TypeAdapter<String>() { override fun write(out: JsonWriter, value: String) { @@ -450,7 +442,7 @@ class KConcreteTypeAdapter<T : Any> private constructor( } override fun read(`in`: JsonReader): String { - return interner.intern(TypeAdapters.STRING.read(`in`)) + return stringInterner.intern(TypeAdapters.STRING.read(`in`)) } } @@ -559,7 +551,7 @@ class KConcreteTypeAdapter<T : Any> private constructor( * Таблица неизменяема (создаётся объект [ImmutableMap]) */ fun <V> map(field: KProperty1<T, Map<String, V>?>, valueType: Class<V>): Builder<T> { - types.add(PackedProperty(field, StringMapAdapter(valueType, internedStringAdapter, ::interner))) + types.add(PackedProperty(field, StringMapAdapter(valueType, internedStringAdapter, stringInterner))) return this } @@ -569,14 +561,17 @@ class KConcreteTypeAdapter<T : Any> private constructor( * Таблица неизменяема (создаётся объект [ImmutableMap]) */ fun <V : Any> map(field: KProperty1<T, Map<String, V>?>, valueType: KClass<V>): Builder<T> { - types.add(PackedProperty(field, StringMapAdapter(valueType.java, internedStringAdapter, ::interner))) + types.add(PackedProperty(field, StringMapAdapter(valueType.java, internedStringAdapter, stringInterner))) return this } fun build(asList: Boolean = false): KConcreteTypeAdapter<T> { - return KConcreteTypeAdapter(clazz, ImmutableList.copyOf(types), asJsonArray = asList).also { - interner = it.internedStrings - } + return KConcreteTypeAdapter( + bound = clazz, + types = ImmutableList.copyOf(types), + asJsonArray = asList, + stringInterner = stringInterner + ) } }