FIR: Refactor CandidateCollector

This commit is contained in:
Denis Zharkov
2020-04-01 17:22:32 +03:00
parent b52dd8e680
commit 7fc0655849
@@ -17,49 +17,32 @@ open class CandidateCollector(
var currentApplicability = CandidateApplicability.HIDDEN var currentApplicability = CandidateApplicability.HIDDEN
private set private set
private var currentGroup = TowerGroup.Start private var bestGroup = TowerGroup.Last
fun newDataSet() { fun newDataSet() {
groupNumbers.clear() groupNumbers.clear()
candidates.clear() candidates.clear()
currentApplicability = CandidateApplicability.HIDDEN currentApplicability = CandidateApplicability.HIDDEN
bestGroup = TowerGroup.Last
} }
open fun consumeCandidate(group: TowerGroup, candidate: Candidate): CandidateApplicability { open fun consumeCandidate(group: TowerGroup, candidate: Candidate): CandidateApplicability {
val applicability = resolutionStageRunner.processCandidate(candidate) val applicability = resolutionStageRunner.processCandidate(candidate)
if (applicability > currentApplicability) { if (applicability > currentApplicability || (applicability == currentApplicability && group < bestGroup)) {
groupNumbers.clear()
candidates.clear() candidates.clear()
currentApplicability = applicability currentApplicability = applicability
currentGroup = group bestGroup = group
} }
if (applicability == currentApplicability) { if (applicability == currentApplicability && group == bestGroup) {
candidates.add(candidate) candidates.add(candidate)
groupNumbers.add(group)
} }
return applicability return applicability
} }
fun bestCandidates(): List<Candidate> { fun bestCandidates() = candidates
if (groupNumbers.isEmpty()) return emptyList()
if (groupNumbers.size == 1) return candidates
val result = mutableListOf<Candidate>()
var bestGroup = groupNumbers.first()
for ((index, candidate) in candidates.withIndex()) {
val group = groupNumbers[index]
if (bestGroup > group) {
bestGroup = group
result.clear()
}
if (bestGroup == group) {
result.add(candidate)
}
}
return result
}
fun isSuccess(): Boolean { fun isSuccess(): Boolean {
return currentApplicability >= CandidateApplicability.SYNTHETIC_RESOLVED return currentApplicability >= CandidateApplicability.SYNTHETIC_RESOLVED