65 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
	
		
			1.8 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.network.chat;
 | |
| 
 | |
| import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
 | |
| import java.util.ArrayDeque;
 | |
| import java.util.List;
 | |
| import java.util.Set;
 | |
| import org.jetbrains.annotations.Nullable;
 | |
| import org.jetbrains.annotations.VisibleForTesting;
 | |
| 
 | |
| public class MessageSignatureCache {
 | |
| 	public static final int NOT_FOUND = -1;
 | |
| 	private static final int DEFAULT_CAPACITY = 128;
 | |
| 	private final MessageSignature[] entries;
 | |
| 
 | |
| 	public MessageSignatureCache(int size) {
 | |
| 		this.entries = new MessageSignature[size];
 | |
| 	}
 | |
| 
 | |
| 	public static MessageSignatureCache createDefault() {
 | |
| 		return new MessageSignatureCache(128);
 | |
| 	}
 | |
| 
 | |
| 	public int pack(MessageSignature signature) {
 | |
| 		for (int i = 0; i < this.entries.length; i++) {
 | |
| 			if (signature.equals(this.entries[i])) {
 | |
| 				return i;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return -1;
 | |
| 	}
 | |
| 
 | |
| 	@Nullable
 | |
| 	public MessageSignature unpack(int index) {
 | |
| 		return this.entries[index];
 | |
| 	}
 | |
| 
 | |
| 	public void push(SignedMessageBody signedMessageBody, @Nullable MessageSignature signature) {
 | |
| 		List<MessageSignature> list = signedMessageBody.lastSeen().entries();
 | |
| 		ArrayDeque<MessageSignature> arrayDeque = new ArrayDeque(list.size() + 1);
 | |
| 		arrayDeque.addAll(list);
 | |
| 		if (signature != null) {
 | |
| 			arrayDeque.add(signature);
 | |
| 		}
 | |
| 
 | |
| 		this.push(arrayDeque);
 | |
| 	}
 | |
| 
 | |
| 	@VisibleForTesting
 | |
| 	void push(List<MessageSignature> chatMessages) {
 | |
| 		this.push(new ArrayDeque(chatMessages));
 | |
| 	}
 | |
| 
 | |
| 	private void push(ArrayDeque<MessageSignature> deque) {
 | |
| 		Set<MessageSignature> set = new ObjectOpenHashSet<>(deque);
 | |
| 
 | |
| 		for (int i = 0; !deque.isEmpty() && i < this.entries.length; i++) {
 | |
| 			MessageSignature messageSignature = this.entries[i];
 | |
| 			this.entries[i] = (MessageSignature)deque.removeLast();
 | |
| 			if (messageSignature != null && !set.contains(messageSignature)) {
 | |
| 				deque.addFirst(messageSignature);
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |