reduce ComponentRegistry memory use
#KT-13136 Fixed
This commit is contained in:
@@ -30,17 +30,44 @@ internal class ComponentRegistry {
|
|||||||
return registrationMap
|
return registrationMap
|
||||||
}
|
}
|
||||||
|
|
||||||
private var registrationMap = MultiMap.createLinkedSet<Type, ComponentDescriptor>()
|
private val registrationMap = hashMapOf<Type, Any>()
|
||||||
|
|
||||||
fun addAll(descriptors: Collection<ComponentDescriptor>) {
|
fun addAll(descriptors: Collection<ComponentDescriptor>) {
|
||||||
registrationMap.putAllValues(buildRegistrationMap(descriptors))
|
val newRegistrationMap = buildRegistrationMap(descriptors)
|
||||||
|
for (entry in newRegistrationMap.entrySet()) {
|
||||||
|
val oldEntries = registrationMap[entry.key]
|
||||||
|
if (oldEntries != null || entry.value.size > 1) {
|
||||||
|
val list = mutableListOf<ComponentDescriptor>()
|
||||||
|
if (oldEntries is Collection<*>) {
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
list.addAll(oldEntries as Collection<ComponentDescriptor>)
|
||||||
|
}
|
||||||
|
else if (oldEntries != null) {
|
||||||
|
list.add(oldEntries as ComponentDescriptor)
|
||||||
|
}
|
||||||
|
list.addAll(entry.value)
|
||||||
|
registrationMap[entry.key] = list.singleOrNull() ?: list
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
registrationMap[entry.key] = entry.value.single()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun tryGetEntry(request: Type): Collection<ComponentDescriptor> {
|
fun tryGetEntry(request: Type): Collection<ComponentDescriptor> {
|
||||||
return registrationMap.get(request)
|
val value = registrationMap[request]
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
return when(value) {
|
||||||
|
is Collection<*> -> value as Collection<ComponentDescriptor>
|
||||||
|
null -> emptyList()
|
||||||
|
else -> listOf(value as ComponentDescriptor)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun addAll(other: ComponentRegistry) {
|
fun addAll(other: ComponentRegistry) {
|
||||||
registrationMap.putAllValues(other.registrationMap)
|
if (!registrationMap.isEmpty()) {
|
||||||
|
throw IllegalStateException("Can only copy entries from another component registry into an empty component registry")
|
||||||
|
}
|
||||||
|
registrationMap += other.registrationMap
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user