|
1 | 1 | package com.cleanroommc.modularui.value.sync; |
2 | 2 |
|
| 3 | +import com.cleanroommc.modularui.utils.ICopy; |
3 | 4 | import com.cleanroommc.modularui.utils.ObjectList; |
4 | | -import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; |
| 5 | + |
5 | 6 | import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; |
6 | 7 | import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer; |
7 | 8 | import com.cleanroommc.modularui.utils.serialization.IEquals; |
|
12 | 13 | import org.jetbrains.annotations.Nullable; |
13 | 14 |
|
14 | 15 | import java.io.IOException; |
| 16 | +import java.util.Arrays; |
15 | 17 | import java.util.Collections; |
16 | 18 | import java.util.List; |
17 | | -import java.util.Objects; |
18 | 19 | import java.util.function.Consumer; |
| 20 | +import java.util.function.IntFunction; |
19 | 21 | import java.util.function.Supplier; |
20 | 22 |
|
21 | | -public class GenericListSyncHandler<T> extends ValueSyncHandler<List<T>> { |
| 23 | +public class GenericListSyncHandler<T> extends GenericCollectionSyncHandler<T, List<T>> { |
22 | 24 |
|
23 | | - private final Supplier<List<T>> getter; |
24 | | - private final Consumer<List<T>> setter; |
25 | | - private final IByteBufDeserializer<T> deserializer; |
26 | | - private final IByteBufSerializer<T> serializer; |
27 | | - private final IEquals<T> equals; |
28 | 25 | private final ObjectList<T> cache = ObjectList.create(); |
29 | 26 |
|
30 | | - public GenericListSyncHandler(@NotNull Supplier<List<T>> getter, |
31 | | - @Nullable Consumer<List<T>> setter, |
32 | | - @NotNull IByteBufAdapter<T> adapter) { |
33 | | - this(getter, setter, adapter, adapter, adapter); |
34 | | - } |
35 | | - |
36 | | - public GenericListSyncHandler(@NotNull Supplier<List<T>> getter, |
37 | | - @Nullable Consumer<List<T>> setter, |
38 | | - @NotNull IByteBufDeserializer<T> deserializer, |
39 | | - @NotNull IByteBufSerializer<T> serializer) { |
40 | | - this(getter, setter, deserializer, serializer, null); |
41 | | - } |
42 | | - |
43 | | - public GenericListSyncHandler(@NotNull Supplier<List<T>> getter, |
44 | | - @NotNull IByteBufAdapter<T> adapter) { |
45 | | - this(getter, null, adapter, adapter, adapter); |
46 | | - } |
47 | | - |
48 | | - public GenericListSyncHandler(@NotNull Supplier<List<T>> getter, |
49 | | - @NotNull IByteBufDeserializer<T> deserializer, |
50 | | - @NotNull IByteBufSerializer<T> serializer) { |
51 | | - this(getter, null, deserializer, serializer, null); |
52 | | - } |
53 | | - |
54 | | - public GenericListSyncHandler(@NotNull Supplier<List<T>> getter, |
55 | | - @Nullable Consumer<List<T>> setter, |
56 | | - @NotNull IByteBufDeserializer<T> deserializer, |
57 | | - @NotNull IByteBufSerializer<T> serializer, |
58 | | - @Nullable IEquals<T> equals) { |
59 | | - this.getter = Objects.requireNonNull(getter); |
60 | | - this.cache.addAll(getter.get()); |
61 | | - this.setter = setter; |
62 | | - this.deserializer = deserializer; |
63 | | - this.serializer = serializer; |
64 | | - this.equals = equals != null ? IEquals.wrapNullSafe(equals) : Objects::equals; |
| 27 | + public GenericListSyncHandler(@NotNull Supplier<List<T>> getter, @Nullable Consumer<List<T>> setter, @NotNull IByteBufDeserializer<T> deserializer, @NotNull IByteBufSerializer<T> serializer, @Nullable IEquals<T> equals, @Nullable ICopy<T> copy) { |
| 28 | + super(getter, setter, deserializer, serializer, equals, copy); |
65 | 29 | } |
66 | 30 |
|
67 | 31 | @Override |
68 | | - public void setValue(List<T> value, boolean setSource, boolean sync) { |
| 32 | + protected void setCache(List<T> value) { |
69 | 33 | this.cache.clear(); |
70 | | - this.cache.addAll(value); |
71 | | - if (setSource && this.setter != null) { |
72 | | - this.setter.accept(value); |
73 | | - } |
74 | | - if (sync) { |
75 | | - sync(0, this::write); |
| 34 | + for (T item : value) { |
| 35 | + this.cache.add(copyValue(item)); |
76 | 36 | } |
77 | 37 | } |
78 | 38 |
|
79 | 39 | @Override |
80 | | - public boolean updateCacheFromSource(boolean isFirstSync) { |
81 | | - List<T> i = this.getter.get(); |
82 | | - if (isFirstSync || didValuesChange(i)) { |
83 | | - setValue(i, false, false); |
84 | | - return true; |
85 | | - } |
86 | | - return false; |
87 | | - } |
88 | | - |
89 | | - private boolean didValuesChange(List<T> newValues) { |
| 40 | + protected boolean didValuesChange(List<T> newValues) { |
90 | 41 | if (this.cache.size() != newValues.size()) return true; |
91 | | - for (int i = 0, n = newValues.size(); i < n; i++) { |
92 | | - if (!this.equals.areEqual(this.cache.get(i), newValues.get(i))) { |
93 | | - return true; |
94 | | - } |
| 42 | + for (int i = 0; i < this.cache.size(); i++) { |
| 43 | + if (!areValuesEqual(this.cache.get(i), newValues.get(i))) return true; |
95 | 44 | } |
96 | 45 | return false; |
97 | 46 | } |
98 | 47 |
|
99 | 48 | @Override |
100 | | - public void write(PacketBuffer buffer) throws IOException { |
101 | | - buffer.writeVarInt(this.cache.size()); |
102 | | - for (T t : this.cache) { |
103 | | - this.serializer.serialize(buffer, t); |
104 | | - } |
| 49 | + public List<T> getValue() { |
| 50 | + return Collections.unmodifiableList(this.cache); |
105 | 51 | } |
106 | 52 |
|
107 | 53 | @Override |
108 | 54 | public void read(PacketBuffer buffer) throws IOException { |
109 | 55 | this.cache.clear(); |
110 | | - for (int i = 0, n = buffer.readVarInt(); i < n; i++) { |
111 | | - this.cache.add(this.deserializer.deserialize(buffer)); |
| 56 | + for (int i = 0; i < buffer.readVarInt(); i++) { |
| 57 | + this.cache.add(deserializeValue(buffer)); |
112 | 58 | } |
| 59 | + onSetCache(getValue(), true, false); |
113 | 60 | } |
114 | 61 |
|
115 | | - @Override |
116 | | - public List<T> getValue() { |
117 | | - return Collections.unmodifiableList(this.cache); |
| 62 | + public static <T> Builder<T> builder() { |
| 63 | + return new Builder<>(); |
| 64 | + } |
| 65 | + |
| 66 | + public static class Builder<T> extends GenericCollectionSyncHandler.Builder<T, List<T>, Builder<T>> { |
| 67 | + |
| 68 | + public Builder<T> getterArray(Supplier<T[]> getter) { |
| 69 | + getter(() -> Arrays.asList(getter.get())); |
| 70 | + return this; |
| 71 | + } |
| 72 | + |
| 73 | + public Builder<T> setterArray(Consumer<T[]> setter, IntFunction<T[]> arrayFactory) { |
| 74 | + setter(c -> setter.accept(c.toArray(arrayFactory.apply(c.size())))); |
| 75 | + return this; |
| 76 | + } |
| 77 | + |
| 78 | + @Override |
| 79 | + public Builder<T> equals(IEquals<T> equals) { |
| 80 | + super.equals(equals); |
| 81 | + return this; |
| 82 | + } |
| 83 | + |
| 84 | + public GenericListSyncHandler<T> build() { |
| 85 | + if (this.getter == null) throw new NullPointerException("Getter in GenericListSyncHandler must not be null"); |
| 86 | + if (this.deserializer == null) throw new NullPointerException("Deserializer in GenericListSyncHandler must not be null"); |
| 87 | + if (this.serializer == null) throw new NullPointerException("Serializer in GenericListSyncHandler must not be null"); |
| 88 | + return new GenericListSyncHandler<>(this.getter, this.setter, this.deserializer, this.serializer, this.equals, this.copy); |
| 89 | + } |
118 | 90 | } |
119 | 91 | } |
0 commit comments