Fix extra list implementation for MultiSortedList

This commit is contained in:
Gabriel Tofvesson 2021-09-24 02:23:43 +02:00
parent b25f91c3e3
commit b5e431c7f6
2 changed files with 23 additions and 6 deletions

View File

@ -1,20 +1,36 @@
import java.util.*
import kotlin.Comparator
import kotlin.collections.ArrayList
class MultiSortedList<E> constructor(
underlying: MutableList<E>,
generator: () -> MutableList<E>,
comparator: Comparator<in E>,
vararg extraComparators: Comparator<in E>
): SortedList<E>(underlying, comparator) {
companion object {
fun <T: Comparable<T>> ofComparable(
underlying: MutableList<T> = ArrayList(),
underlying: MutableList<T>,
generator: () -> MutableList<T> = ::ArrayList,
comparator: Comparator<in T> = Comparator { a, b -> a.compareTo(b) },
vararg extraComparators: Comparator<in T>
) = MultiSortedList(underlying, comparator, *extraComparators)
) = MultiSortedList(underlying, generator, comparator, *extraComparators)
fun <T: Comparable<T>> ofComparable(
generator: () -> MutableList<T> = ::ArrayList,
comparator: Comparator<in T> = Comparator { a, b -> a.compareTo(b) },
vararg extraComparators: Comparator<in T>
) = MultiSortedList(generator(), generator, comparator, *extraComparators)
}
private var extraLists = extraComparators.associateWith { SortedList(underlying.subList(0, underlying.size), it) }
constructor(generator: () -> MutableList<E>, comparator: Comparator<in E>, vararg extraComparators: Comparator<in E>):
this(generator(), generator, comparator, *extraComparators)
private var extraLists = extraComparators.associateWith {
val list = generator()
Collections.copy(list, underlying)
SortedList(list, it)
}
override fun add(element: E): Boolean {
extraLists.values.forEach {

View File

@ -24,8 +24,8 @@ private const val DEFAULT_COOLDOWN_MIN = 5L
class PortalManager(private val data: ConfigurationSection, private val config: () -> ConfigurationSection): Listener {
private val players = PlayerMapper(data, PATH_DATA_PLAYERS)
private val worlds = WorldMapper(data, PATH_DATA_WORLDS)
private var portals = MultiSortedList(ArrayList(), COMPARATOR_PORTAL_LOCATION_OWNER, COMPARATOR_PORTAL_UID, COMPARATOR_PORTAL_OWNER_NAME, COMPARATOR_PORTAL_LINKS)
private var invitations = MultiSortedList(ArrayList(), COMPARATOR_INVITE_RECIPIENT, COMPARATOR_INVITE_PORTAL)
private var portals = MultiSortedList(::ArrayList, COMPARATOR_PORTAL_LOCATION_OWNER, COMPARATOR_PORTAL_UID, COMPARATOR_PORTAL_OWNER_NAME, COMPARATOR_PORTAL_LINKS)
private var invitations = MultiSortedList(::ArrayList, COMPARATOR_INVITE_RECIPIENT, COMPARATOR_INVITE_PORTAL)
private val cooldowns = LinkedList<Pair<OfflinePlayer, Long>>()
private val cooldownsLookup = SortedList<OfflinePlayer>(ArrayList(), COMPARATOR_PLAYER)
@ -92,7 +92,7 @@ class PortalManager(private val data: ConfigurationSection, private val config:
if (portal.id >= nextUUID)
nextUUID = portal.id + 1UL
}
portals = MultiSortedList(portalList, COMPARATOR_PORTAL_LOCATION_OWNER, COMPARATOR_PORTAL_UID)
portals = MultiSortedList(portalList, ::ArrayList, COMPARATOR_PORTAL_LOCATION_OWNER, COMPARATOR_PORTAL_UID)
if(portals.isEmpty()) nextUUID = UUID(0, 0)
else {
@ -105,6 +105,7 @@ class PortalManager(private val data: ConfigurationSection, private val config:
invitations = MultiSortedList(
data.getStringList(PATH_DATA_INVITES).mapTo(ArrayList(), ::Invite),
::ArrayList,
COMPARATOR_INVITE_RECIPIENT,
COMPARATOR_INVITE_PORTAL
)