001/* 002 * Copyright (c) 2016-2018 Daniel Ennis (Aikar) - MIT License 003 * 004 * Permission is hereby granted, free of charge, to any person obtaining 005 * a copy of this software and associated documentation files (the 006 * "Software"), to deal in the Software without restriction, including 007 * without limitation the rights to use, copy, modify, merge, publish, 008 * distribute, sublicense, and/or sell copies of the Software, and to 009 * permit persons to whom the Software is furnished to do so, subject to 010 * the following conditions: 011 * 012 * The above copyright notice and this permission notice shall be 013 * included in all copies or substantial portions of the Software. 014 * 015 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 016 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 017 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 018 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 019 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 020 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 021 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 022 */ 023 024package co.aikar.util; 025 026import org.jetbrains.annotations.NotNull; 027import org.jetbrains.annotations.Nullable; 028 029import java.util.Collection; 030import java.util.Map; 031import java.util.Set; 032import java.util.function.BiConsumer; 033import java.util.function.BiFunction; 034import java.util.function.Function; 035 036public interface DelegatingMap <K, V> extends Map<K, V> { 037 Map<K, V> delegate(boolean isReadOnly); 038 039 @Override 040 default int size() { 041 return delegate(true).size(); 042 } 043 044 @Override 045 default boolean isEmpty() { 046 return delegate(true).isEmpty(); 047 } 048 049 @Override 050 default boolean containsKey(Object key) { 051 return delegate(true).containsKey(key); 052 } 053 054 @Override 055 default boolean containsValue(Object value) { 056 return delegate(true).containsValue(value); 057 } 058 059 @Override 060 default V get(Object key) { 061 return delegate(true).get(key); 062 } 063 064 @Nullable 065 @Override 066 default V put(K key, V value) { 067 return delegate(false).put(key, value); 068 } 069 070 @Override 071 default V remove(Object key) { 072 return delegate(false).remove(key); 073 } 074 075 @Override 076 default void putAll(@NotNull Map<? extends K, ? extends V> m) { 077 delegate(false).putAll(m); 078 } 079 080 @Override 081 default void clear() { 082 delegate(false).clear(); 083 } 084 085 @NotNull 086 @Override 087 default Set<K> keySet() { 088 return delegate(false).keySet(); 089 } 090 091 @NotNull 092 @Override 093 default Collection<V> values() { 094 return delegate(false).values(); 095 } 096 097 @NotNull 098 @Override 099 default Set<Entry<K, V>> entrySet() { 100 return delegate(false).entrySet(); 101 } 102 103 @Override 104 default V getOrDefault(Object key, V defaultValue) { 105 return delegate(true).getOrDefault(key, defaultValue); 106 } 107 108 @Override 109 default void forEach(BiConsumer<? super K, ? super V> action) { 110 delegate(true).forEach(action); 111 } 112 113 @Override 114 default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) { 115 delegate(false).replaceAll(function); 116 } 117 118 @Nullable 119 @Override 120 default V putIfAbsent(K key, V value) { 121 return delegate(false).putIfAbsent(key, value); 122 } 123 124 @Override 125 default boolean remove(Object key, Object value) { 126 return delegate(false).remove(key, value); 127 } 128 129 @Override 130 default boolean replace(K key, V oldValue, V newValue) { 131 return delegate(false).replace(key, oldValue, newValue); 132 } 133 134 @Nullable 135 @Override 136 default V replace(K key, V value) { 137 return delegate(false).replace(key, value); 138 } 139 140 @Override 141 default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) { 142 return delegate(false).computeIfAbsent(key, mappingFunction); 143 } 144 145 @Override 146 default V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) { 147 return delegate(false).computeIfPresent(key, remappingFunction); 148 } 149 150 @Override 151 default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) { 152 return delegate(false).compute(key, remappingFunction); 153 } 154 155 @Override 156 default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) { 157 return delegate(false).merge(key, value, remappingFunction); 158 } 159}