1+ package mekanism .common .lib .collection ;
2+
3+ import java .util .AbstractMap ;
4+ import java .util .Collection ;
5+ import java .util .Collections ;
6+ import java .util .Map ;
7+ import java .util .Objects ;
8+ import java .util .SequencedCollection ;
9+ import java .util .SequencedMap ;
10+ import java .util .SequencedSet ;
11+ import java .util .Set ;
12+ import java .util .function .BiConsumer ;
13+ import java .util .function .BiFunction ;
14+ import java .util .function .Function ;
15+ import mekanism .api .annotations .NothingNullByDefault ;
16+ import org .jetbrains .annotations .Nullable ;
17+
18+ //Copy of Collections#emptyMap as EMPTY_NAVIGABLE_MAP does not short circuit checks, and also does an unchecked cast in get to Comparable
19+ @ NothingNullByDefault
20+ public class EmptySequencedMap <K , V > extends AbstractMap <K , V > implements SequencedMap <K , V > {
21+
22+ private static final SequencedMap <?, ?> EMPTY_MAP = new EmptySequencedMap <>();
23+
24+ @ SuppressWarnings ("unchecked" )
25+ public static <K , V > SequencedMap <K , V > emptyMap () {
26+ return (SequencedMap <K , V >) EMPTY_MAP ;
27+ }
28+
29+ private EmptySequencedMap () {
30+ }
31+
32+ @ Override
33+ public int size () {
34+ return 0 ;
35+ }
36+
37+ @ Override
38+ public boolean isEmpty () {
39+ return true ;
40+ }
41+
42+ @ Override
43+ public void clear () {
44+ }
45+
46+ @ Override
47+ public boolean containsKey (Object key ) {
48+ return false ;
49+ }
50+
51+ @ Override
52+ public boolean containsValue (Object value ) {
53+ return false ;
54+ }
55+
56+ @ Nullable
57+ @ Override
58+ public V get (Object key ) {
59+ return null ;
60+ }
61+
62+ @ Override
63+ public Set <K > keySet () {
64+ return Collections .emptySet ();
65+ }
66+
67+ @ Override
68+ public Collection <V > values () {
69+ return Collections .emptySet ();
70+ }
71+
72+ @ Override
73+ public Set <Map .Entry <K , V >> entrySet () {
74+ return Collections .emptySet ();
75+ }
76+
77+ @ Override
78+ public boolean equals (Object o ) {
79+ if (o == this ) {
80+ return true ;
81+ }
82+ return o instanceof SequencedMap <?,?> other && other .isEmpty ();
83+ }
84+
85+ @ Override
86+ public int hashCode () {
87+ return 0 ;
88+ }
89+
90+ // Override default methods in Map
91+ @ Override
92+ public V getOrDefault (Object k , V defaultValue ) {
93+ return defaultValue ;
94+ }
95+
96+ @ Override
97+ public void forEach (BiConsumer <? super K , ? super V > action ) {
98+ Objects .requireNonNull (action );
99+ }
100+
101+ @ Override
102+ public void replaceAll (BiFunction <? super K , ? super V , ? extends V > function ) {
103+ Objects .requireNonNull (function );
104+ }
105+
106+ @ Override
107+ public V putIfAbsent (K key , V value ) {
108+ throw new UnsupportedOperationException ();
109+ }
110+
111+ @ Override
112+ public boolean remove (Object key , Object value ) {
113+ throw new UnsupportedOperationException ();
114+ }
115+
116+ @ Override
117+ public boolean replace (K key , V oldValue , V newValue ) {
118+ throw new UnsupportedOperationException ();
119+ }
120+
121+ @ Override
122+ public V replace (K key , V value ) {
123+ throw new UnsupportedOperationException ();
124+ }
125+
126+ @ Override
127+ public V computeIfAbsent (K key ,
128+ Function <? super K , ? extends V > mappingFunction ) {
129+ throw new UnsupportedOperationException ();
130+ }
131+
132+ @ Override
133+ public V computeIfPresent (K key ,
134+ BiFunction <? super K , ? super V , ? extends V > remappingFunction ) {
135+ throw new UnsupportedOperationException ();
136+ }
137+
138+ @ Override
139+ public V compute (K key ,
140+ BiFunction <? super K , ? super V , ? extends V > remappingFunction ) {
141+ throw new UnsupportedOperationException ();
142+ }
143+
144+ @ Override
145+ public V merge (K key , V value ,
146+ BiFunction <? super V , ? super V , ? extends V > remappingFunction ) {
147+ throw new UnsupportedOperationException ();
148+ }
149+
150+ @ Override
151+ public SequencedMap <K , V > reversed () {
152+ //Don't need to reverse it as it is empty
153+ return this ;
154+ }
155+
156+ // Override default methods in SequencedMap
157+ @ Nullable
158+ @ Override
159+ public Entry <K , V > firstEntry () {
160+ return null ;
161+ }
162+
163+ @ Nullable
164+ @ Override
165+ public Entry <K , V > lastEntry () {
166+ return null ;
167+ }
168+
169+ @ Nullable
170+ @ Override
171+ public Entry <K , V > pollFirstEntry () {
172+ return null ;
173+ }
174+
175+ @ Nullable
176+ @ Override
177+ public Entry <K , V > pollLastEntry () {
178+ return null ;
179+ }
180+
181+ @ Override
182+ public SequencedSet <K > sequencedKeySet () {
183+ return Collections .emptySortedSet ();
184+ }
185+
186+ @ Override
187+ public SequencedCollection <V > sequencedValues () {
188+ return Collections .emptySortedSet ();
189+ }
190+
191+ @ Override
192+ public SequencedSet <Entry <K , V >> sequencedEntrySet () {
193+ return Collections .emptySortedSet ();
194+ }
195+ }
0 commit comments