// 
// Decompiled by Procyon v0.6.0
// 

package it.unimi.dsi.fastutil.floats;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.function.DoubleFunction;
import java.util.Objects;
import java.util.function.Function;

public final class Float2ReferenceFunctions
{
    public static final EmptyFunction EMPTY_FUNCTION;
    
    private Float2ReferenceFunctions() {
    }
    
    public static <V> Float2ReferenceFunction<V> singleton(final float key, final V value) {
        return new Singleton<V>(key, value);
    }
    
    public static <V> Float2ReferenceFunction<V> singleton(final Float key, final V value) {
        return new Singleton<V>(key, value);
    }
    
    public static <V> Float2ReferenceFunction<V> synchronize(final Float2ReferenceFunction<V> f) {
        return new SynchronizedFunction<V>(f);
    }
    
    public static <V> Float2ReferenceFunction<V> synchronize(final Float2ReferenceFunction<V> f, final Object sync) {
        return new SynchronizedFunction<V>(f, sync);
    }
    
    public static <V> Float2ReferenceFunction<V> unmodifiable(final Float2ReferenceFunction<? extends V> f) {
        return new UnmodifiableFunction<V>(f);
    }
    
    public static <V> Float2ReferenceFunction<V> primitive(final Function<? super Float, ? extends V> f) {
        Objects.requireNonNull(f);
        if (f instanceof Float2ReferenceFunction) {
            return (Float2ReferenceFunction)f;
        }
        if (f instanceof DoubleFunction) {
            final DoubleFunction obj = (DoubleFunction)f;
            Objects.requireNonNull(obj);
            return (Float2ReferenceFunction<V>)obj::apply;
        }
        return new PrimitiveFunction<V>(f);
    }
    
    static {
        EMPTY_FUNCTION = new EmptyFunction();
    }
    
    public static class EmptyFunction<V> extends AbstractFloat2ReferenceFunction<V> implements Serializable, Cloneable
    {
        private static final long serialVersionUID = -7046029254386353129L;
        
        protected EmptyFunction() {
        }
        
        @Override
        public V get(final float k) {
            return null;
        }
        
        @Override
        public V getOrDefault(final float k, final V defaultValue) {
            return defaultValue;
        }
        
        @Override
        public boolean containsKey(final float k) {
            return false;
        }
        
        @Override
        public V defaultReturnValue() {
            return null;
        }
        
        @Override
        public void defaultReturnValue(final V defRetValue) {
            throw new UnsupportedOperationException();
        }
        
        @Override
        public int size() {
            return 0;
        }
        
        @Override
        public void clear() {
        }
        
        public Object clone() {
            return Float2ReferenceFunctions.EMPTY_FUNCTION;
        }
        
        @Override
        public int hashCode() {
            return 0;
        }
        
        @Override
        public boolean equals(final Object o) {
            return o instanceof Function && ((Function)o).size() == 0;
        }
        
        @Override
        public String toString() {
            return "{}";
        }
        
        private Object readResolve() {
            return Float2ReferenceFunctions.EMPTY_FUNCTION;
        }
    }
    
    public static class Singleton<V> extends AbstractFloat2ReferenceFunction<V> implements Serializable, Cloneable
    {
        private static final long serialVersionUID = -7046029254386353129L;
        protected final float key;
        protected final V value;
        
        protected Singleton(final float key, final V value) {
            this.key = key;
            this.value = value;
        }
        
        @Override
        public boolean containsKey(final float k) {
            return Float.floatToIntBits(this.key) == Float.floatToIntBits(k);
        }
        
        @Override
        public V get(final float k) {
            return (Float.floatToIntBits(this.key) == Float.floatToIntBits(k)) ? this.value : this.defRetValue;
        }
        
        @Override
        public V getOrDefault(final float k, final V defaultValue) {
            return (Float.floatToIntBits(this.key) == Float.floatToIntBits(k)) ? this.value : defaultValue;
        }
        
        @Override
        public int size() {
            return 1;
        }
        
        public Object clone() {
            return this;
        }
    }
    
    public static class SynchronizedFunction<V> implements Float2ReferenceFunction<V>, Serializable
    {
        private static final long serialVersionUID = -7046029254386353129L;
        protected final Float2ReferenceFunction<V> function;
        protected final Object sync;
        
        protected SynchronizedFunction(final Float2ReferenceFunction<V> f, final Object sync) {
            if (f == null) {
                throw new NullPointerException();
            }
            this.function = f;
            this.sync = sync;
        }
        
        protected SynchronizedFunction(final Float2ReferenceFunction<V> f) {
            if (f == null) {
                throw new NullPointerException();
            }
            this.function = f;
            this.sync = this;
        }
        
        @Deprecated
        @Override
        public V apply(final double operand) {
            synchronized (this.sync) {
                return this.function.apply(operand);
            }
        }
        
        @Deprecated
        @Override
        public V apply(final Float key) {
            synchronized (this.sync) {
                return this.function.apply(key);
            }
        }
        
        @Override
        public int size() {
            synchronized (this.sync) {
                return this.function.size();
            }
        }
        
        @Override
        public V defaultReturnValue() {
            synchronized (this.sync) {
                return this.function.defaultReturnValue();
            }
        }
        
        @Override
        public void defaultReturnValue(final V defRetValue) {
            synchronized (this.sync) {
                this.function.defaultReturnValue(defRetValue);
            }
        }
        
        @Override
        public boolean containsKey(final float k) {
            synchronized (this.sync) {
                return this.function.containsKey(k);
            }
        }
        
        @Deprecated
        @Override
        public boolean containsKey(final Object k) {
            synchronized (this.sync) {
                return this.function.containsKey(k);
            }
        }
        
        @Override
        public V put(final float k, final V v) {
            synchronized (this.sync) {
                return this.function.put(k, v);
            }
        }
        
        @Override
        public V get(final float k) {
            synchronized (this.sync) {
                return this.function.get(k);
            }
        }
        
        @Override
        public V getOrDefault(final float k, final V defaultValue) {
            synchronized (this.sync) {
                return this.function.getOrDefault(k, defaultValue);
            }
        }
        
        @Override
        public V remove(final float k) {
            synchronized (this.sync) {
                return this.function.remove(k);
            }
        }
        
        @Override
        public void clear() {
            synchronized (this.sync) {
                this.function.clear();
            }
        }
        
        @Deprecated
        @Override
        public V put(final Float k, final V v) {
            synchronized (this.sync) {
                return this.function.put(k, v);
            }
        }
        
        @Deprecated
        @Override
        public V get(final Object k) {
            synchronized (this.sync) {
                return this.function.get(k);
            }
        }
        
        @Deprecated
        @Override
        public V getOrDefault(final Object k, final V defaultValue) {
            synchronized (this.sync) {
                return this.function.getOrDefault(k, defaultValue);
            }
        }
        
        @Deprecated
        @Override
        public V remove(final Object k) {
            synchronized (this.sync) {
                return this.function.remove(k);
            }
        }
        
        @Override
        public int hashCode() {
            synchronized (this.sync) {
                return this.function.hashCode();
            }
        }
        
        @Override
        public boolean equals(final Object o) {
            if (o == this) {
                return true;
            }
            synchronized (this.sync) {
                return this.function.equals(o);
            }
        }
        
        @Override
        public String toString() {
            synchronized (this.sync) {
                return this.function.toString();
            }
        }
        
        private void writeObject(final ObjectOutputStream s) throws IOException {
            synchronized (this.sync) {
                s.defaultWriteObject();
            }
        }
    }
    
    public static class UnmodifiableFunction<V> extends AbstractFloat2ReferenceFunction<V> implements Serializable
    {
        private static final long serialVersionUID = -7046029254386353129L;
        protected final Float2ReferenceFunction<? extends V> function;
        
        protected UnmodifiableFunction(final Float2ReferenceFunction<? extends V> f) {
            if (f == null) {
                throw new NullPointerException();
            }
            this.function = f;
        }
        
        @Override
        public int size() {
            return this.function.size();
        }
        
        @Override
        public V defaultReturnValue() {
            return (V)this.function.defaultReturnValue();
        }
        
        @Override
        public void defaultReturnValue(final V defRetValue) {
            throw new UnsupportedOperationException();
        }
        
        @Override
        public boolean containsKey(final float k) {
            return this.function.containsKey(k);
        }
        
        @Override
        public V put(final float k, final V v) {
            throw new UnsupportedOperationException();
        }
        
        @Override
        public V get(final float k) {
            return (V)this.function.get(k);
        }
        
        @Override
        public V getOrDefault(final float k, final V defaultValue) {
            return (V)this.function.getOrDefault(k, (V)defaultValue);
        }
        
        @Override
        public V remove(final float k) {
            throw new UnsupportedOperationException();
        }
        
        @Override
        public void clear() {
            throw new UnsupportedOperationException();
        }
        
        @Deprecated
        @Override
        public V put(final Float k, final V v) {
            throw new UnsupportedOperationException();
        }
        
        @Deprecated
        @Override
        public V get(final Object k) {
            return (V)this.function.get(k);
        }
        
        @Deprecated
        @Override
        public V getOrDefault(final Object k, final V defaultValue) {
            return (V)this.function.getOrDefault(k, (V)defaultValue);
        }
        
        @Deprecated
        @Override
        public V remove(final Object k) {
            throw new UnsupportedOperationException();
        }
        
        @Override
        public int hashCode() {
            return this.function.hashCode();
        }
        
        @Override
        public boolean equals(final Object o) {
            return o == this || this.function.equals(o);
        }
        
        @Override
        public String toString() {
            return this.function.toString();
        }
    }
    
    public static class PrimitiveFunction<V> implements Float2ReferenceFunction<V>
    {
        protected final java.util.function.Function<? super Float, ? extends V> function;
        
        protected PrimitiveFunction(final java.util.function.Function<? super Float, ? extends V> function) {
            this.function = function;
        }
        
        @Override
        public boolean containsKey(final float key) {
            return this.function.apply(key) != null;
        }
        
        @Deprecated
        @Override
        public boolean containsKey(final Object key) {
            return key != null && this.function.apply((Float)key) != null;
        }
        
        @Override
        public V get(final float key) {
            final V v = (V)this.function.apply(key);
            if (v == null) {
                return null;
            }
            return v;
        }
        
        @Override
        public V getOrDefault(final float key, final V defaultValue) {
            final V v = (V)this.function.apply(key);
            if (v == null) {
                return defaultValue;
            }
            return v;
        }
        
        @Deprecated
        @Override
        public V get(final Object key) {
            if (key == null) {
                return null;
            }
            return (V)this.function.apply((Float)key);
        }
        
        @Deprecated
        @Override
        public V getOrDefault(final Object key, final V defaultValue) {
            if (key == null) {
                return defaultValue;
            }
            final V v;
            return ((v = (V)this.function.apply((Float)key)) == null) ? defaultValue : v;
        }
        
        @Deprecated
        @Override
        public V put(final Float key, final V value) {
            throw new UnsupportedOperationException();
        }
    }
}
