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}