-
Notifications
You must be signed in to change notification settings - Fork 302
/
IngredientSet.java
81 lines (69 loc) · 2 KB
/
IngredientSet.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package mezz.jei.util;
import mezz.jei.Internal;
import mezz.jei.api.ingredients.IIngredientHelper;
import mezz.jei.startup.StackHelper;
import net.minecraft.item.ItemStack;
import java.util.AbstractSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
public class IngredientSet<V> extends AbstractSet<V> {
public static <V> IngredientSet<V> create(Class<V> ingredientClass, final IIngredientHelper<V> ingredientHelper) {
final UidGenerator<V> uidGenerator;
if (ingredientClass == ItemStack.class) {
final StackHelper stackHelper = Internal.getStackHelper();
uidGenerator = new UidGenerator<V>() {
@Override
public String getUniqueId(V ingredient) {
return stackHelper.getUniqueIdentifierForStack((ItemStack) ingredient, StackHelper.UidMode.FULL);
}
};
} else {
uidGenerator = new UidGenerator<V>() {
@Override
public String getUniqueId(V ingredient) {
return ingredientHelper.getUniqueId(ingredient);
}
};
}
return new IngredientSet<V>(uidGenerator);
}
private interface UidGenerator<V> {
String getUniqueId(V ingredient);
}
private final UidGenerator<V> uidGenerator;
private final Map<String, V> ingredients;
private IngredientSet(UidGenerator<V> uidGenerator) {
this.uidGenerator = uidGenerator;
this.ingredients = new LinkedHashMap<String, V>();
}
@Override
public boolean add(V v) {
String uid = uidGenerator.getUniqueId(v);
return ingredients.put(uid, v) == null;
}
@Override
public boolean remove(Object o) {
//noinspection unchecked
String uid = uidGenerator.getUniqueId((V) o);
return ingredients.remove(uid) != null;
}
@Override
public boolean contains(Object o) {
//noinspection unchecked
String uid = uidGenerator.getUniqueId((V) o);
return ingredients.containsKey(uid);
}
@Override
public void clear() {
ingredients.clear();
}
@Override
public Iterator<V> iterator() {
return ingredients.values().iterator();
}
@Override
public int size() {
return ingredients.size();
}
}