@@ -10,12 +10,6 @@ open class UniqueMap() {
10
10
// 750 including deprecated, and EnumMap creates a N-sized array where N is the number of objects in the enum
11
11
private val typedUniqueMap = EnumMap <UniqueType , ArrayList <Unique >>(UniqueType ::class .java)
12
12
13
- // Another memory-speed tradeoff - enumset is super fast and also super cheap, but it's not nothing
14
- // This is used to speed up triggered uniques - in other words, when we want to find all uniques with a certain modifier.
15
- // Rather than mapping all uniques thus triggered, this just stores whether any unique has that trigger -
16
- // because most of the time is spent iterating on uniques, in uniquemaps that have no such trigger in the first place!
17
- private val triggerEnumSet = EnumSet .noneOf(UniqueType ::class .java)
18
-
19
13
constructor (uniques: Sequence <Unique >) : this () {
20
14
addUniques(uniques.asIterable())
21
15
}
@@ -27,11 +21,10 @@ open class UniqueMap() {
27
21
val existingArrayList = innerUniqueMap[unique.placeholderText]
28
22
if (existingArrayList != null ) existingArrayList.add(unique)
29
23
else innerUniqueMap[unique.placeholderText] = arrayListOf (unique)
30
-
24
+
31
25
if (unique.type == null ) return
32
26
if (typedUniqueMap[unique.type] != null ) return
33
27
typedUniqueMap[unique.type] = innerUniqueMap[unique.placeholderText]
34
- triggerEnumSet.add(unique.type)
35
28
}
36
29
37
30
/* * Calls [addUnique] on each item from [uniques] */
@@ -43,20 +36,20 @@ open class UniqueMap() {
43
36
val existingArrayList = innerUniqueMap[unique.placeholderText]
44
37
existingArrayList?.remove(unique)
45
38
}
46
-
39
+
47
40
fun clear () {
48
41
innerUniqueMap.clear()
49
42
typedUniqueMap.clear()
50
43
}
51
-
44
+
52
45
// Pure functions
53
-
46
+
54
47
fun hasUnique (uniqueType : UniqueType , state : StateForConditionals = StateForConditionals .EmptyState ) =
55
48
getUniques(uniqueType).any { it.conditionalsApply(state) && ! it.isTimedTriggerable }
56
49
57
50
fun hasUnique (uniqueTag : String , state : StateForConditionals = StateForConditionals .EmptyState ) =
58
51
getUniques(uniqueTag).any { it.conditionalsApply(state) && ! it.isTimedTriggerable }
59
-
52
+
60
53
fun hasTagUnique (tagUnique : String ) =
61
54
innerUniqueMap.containsKey(tagUnique)
62
55
@@ -69,7 +62,7 @@ open class UniqueMap() {
69
62
?.asSequence()
70
63
? : emptySequence()
71
64
72
- fun getMatchingUniques (uniqueType : UniqueType , state : StateForConditionals = StateForConditionals .EmptyState ) =
65
+ fun getMatchingUniques (uniqueType : UniqueType , state : StateForConditionals = StateForConditionals .EmptyState ) =
73
66
getUniques(uniqueType)
74
67
// Same as .filter | .flatMap, but more cpu/mem performant (7.7 GB vs ?? for test)
75
68
.flatMap {
@@ -90,8 +83,8 @@ open class UniqueMap() {
90
83
else -> it.getMultiplied(state)
91
84
}
92
85
}
93
-
94
- fun hasMatchingUnique (uniqueType : UniqueType , state : StateForConditionals = StateForConditionals .EmptyState ) =
86
+
87
+ fun hasMatchingUnique (uniqueType : UniqueType , state : StateForConditionals = StateForConditionals .EmptyState ) =
95
88
getUniques(uniqueType).any { it.conditionalsApply(state) }
96
89
97
90
fun hasMatchingUnique (uniqueTag : String , state : StateForConditionals = StateForConditionals .EmptyState ) =
@@ -102,12 +95,11 @@ open class UniqueMap() {
102
95
103
96
fun getTriggeredUniques (trigger : UniqueType , stateForConditionals : StateForConditionals ,
104
97
triggerFilter : (Unique ) -> Boolean = { true }): Sequence <Unique > {
105
- if (! triggerEnumSet.contains(trigger)) return emptySequence() // Common case - no such unique exists
106
98
return getAllUniques().filter { unique ->
107
99
unique.getModifiers(trigger).any(triggerFilter) && unique.conditionalsApply(stateForConditionals)
108
100
}.flatMap { it.getMultiplied(stateForConditionals) }
109
101
}
110
-
102
+
111
103
companion object {
112
104
val EMPTY = UniqueMap ()
113
105
}
0 commit comments