mirror of
https://github.com/DanilaFe/abacus
synced 2024-12-22 07:20:09 -08:00
Precompute all the transitions ahead of time.
This commit is contained in:
parent
7cd117dac1
commit
87529da15f
|
@ -37,21 +37,6 @@ class PromotionManager(val abacus: Abacus) : PluginListener {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* If a path between the given implementations has already been computed, uses
|
|
||||||
* the already calculated path. Otherwise, calls [computePathBetween] to compute a new
|
|
||||||
* path.
|
|
||||||
*
|
|
||||||
* @param from the implementation to start from.
|
|
||||||
* @param to the implementation to get to.
|
|
||||||
* @return the resulting promotion path, or null if it is not found
|
|
||||||
*/
|
|
||||||
fun getPathBetween(from: NumberImplementation, to: NumberImplementation): PromotionPath? {
|
|
||||||
return computePaths.computeIfAbsent(from to to, {
|
|
||||||
computePathBetween(it.first, it.second)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Promote all the numbers in the list to the same number implementation, to ensure
|
* Promote all the numbers in the list to the same number implementation, to ensure
|
||||||
* they can be used with each other. Finds the highest priority implementation
|
* they can be used with each other. Finds the highest priority implementation
|
||||||
|
@ -66,16 +51,26 @@ class PromotionManager(val abacus: Abacus) : PluginListener {
|
||||||
val highestPriority = implementations.sortedBy { it.priority }.last()
|
val highestPriority = implementations.sortedBy { it.priority }.last()
|
||||||
return PromotionResult(items = numbers.map {
|
return PromotionResult(items = numbers.map {
|
||||||
if(it.javaClass == highestPriority.implementation) it
|
if(it.javaClass == highestPriority.implementation) it
|
||||||
else getPathBetween(pluginManager.interfaceImplementationFor(it.javaClass), highestPriority)
|
else computePaths[pluginManager.interfaceImplementationFor(it.javaClass) to highestPriority]
|
||||||
?.promote(it) ?: return null
|
?.promote(it) ?: return null
|
||||||
}.toTypedArray(), promotedTo = highestPriority)
|
}.toTypedArray(), promotedTo = highestPriority)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onLoad(manager: PluginManager?) {
|
override fun onLoad(manager: PluginManager) {
|
||||||
|
val implementations = manager.allNumberImplementations.map { manager.numberImplementationFor(it) }
|
||||||
|
for((index, value) in implementations.withIndex()){
|
||||||
|
for(i in index until implementations.size){
|
||||||
|
val other = implementations[i]
|
||||||
|
|
||||||
|
val promoteFrom = if(other.priority > value.priority) value else other
|
||||||
|
val promoteTo = if(other.priority > value.priority) other else value
|
||||||
|
val path = computePathBetween(promoteFrom, promoteTo)
|
||||||
|
computePaths.put(promoteFrom to promoteTo, path)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onUnload(manager: PluginManager?) {
|
override fun onUnload(manager: PluginManager) {
|
||||||
computePaths.clear()
|
computePaths.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user