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

package it.unimi.dsi.fastutil.objects;

import it.unimi.dsi.fastutil.chars.CharIterator;
import it.unimi.dsi.fastutil.chars.AbstractCharCollection;
import java.util.SortedSet;
import java.util.Iterator;
import java.util.Comparator;
import java.util.Set;
import java.util.Collection;
import it.unimi.dsi.fastutil.chars.CharCollection;

public abstract class AbstractReference2CharSortedMap<K> extends AbstractReference2CharMap<K> implements Reference2CharSortedMap<K>
{
    private static final long serialVersionUID = -1773560792952436569L;
    
    protected AbstractReference2CharSortedMap() {
    }
    
    @Override
    public ReferenceSortedSet<K> keySet() {
        return new KeySet();
    }
    
    @Override
    public CharCollection values() {
        return new ValuesCollection();
    }
    
    protected class KeySet extends AbstractReferenceSortedSet<K>
    {
        @Override
        public boolean contains(final Object k) {
            return AbstractReference2CharSortedMap.this.containsKey(k);
        }
        
        @Override
        public int size() {
            return AbstractReference2CharSortedMap.this.size();
        }
        
        @Override
        public void clear() {
            AbstractReference2CharSortedMap.this.clear();
        }
        
        @Override
        public Comparator<? super K> comparator() {
            return AbstractReference2CharSortedMap.this.comparator();
        }
        
        @Override
        public K first() {
            return AbstractReference2CharSortedMap.this.firstKey();
        }
        
        @Override
        public K last() {
            return AbstractReference2CharSortedMap.this.lastKey();
        }
        
        @Override
        public ReferenceSortedSet<K> headSet(final K to) {
            return AbstractReference2CharSortedMap.this.headMap(to).keySet();
        }
        
        @Override
        public ReferenceSortedSet<K> tailSet(final K from) {
            return AbstractReference2CharSortedMap.this.tailMap(from).keySet();
        }
        
        @Override
        public ReferenceSortedSet<K> subSet(final K from, final K to) {
            return AbstractReference2CharSortedMap.this.subMap(from, to).keySet();
        }
        
        @Override
        public ObjectBidirectionalIterator<K> iterator(final K from) {
            return new KeySetIterator<K>((ObjectBidirectionalIterator<Reference2CharMap.Entry<K>>)AbstractReference2CharSortedMap.this.reference2CharEntrySet().iterator(new BasicEntry<Object>(from, '\0')));
        }
        
        @Override
        public ObjectBidirectionalIterator<K> iterator() {
            return new KeySetIterator<K>((ObjectBidirectionalIterator<Reference2CharMap.Entry<K>>)Reference2CharSortedMaps.fastIterator((Reference2CharSortedMap<K>)AbstractReference2CharSortedMap.this));
        }
    }
    
    protected static class KeySetIterator<K> implements ObjectBidirectionalIterator<K>
    {
        protected final ObjectBidirectionalIterator<Reference2CharMap.Entry<K>> i;
        
        public KeySetIterator(final ObjectBidirectionalIterator<Reference2CharMap.Entry<K>> i) {
            this.i = i;
        }
        
        @Override
        public K next() {
            return (K)this.i.next().getKey();
        }
        
        @Override
        public K previous() {
            return (K)this.i.previous().getKey();
        }
        
        @Override
        public boolean hasNext() {
            return this.i.hasNext();
        }
        
        @Override
        public boolean hasPrevious() {
            return this.i.hasPrevious();
        }
    }
    
    protected class ValuesCollection extends AbstractCharCollection
    {
        @Override
        public CharIterator iterator() {
            return new ValuesIterator<Object>((ObjectBidirectionalIterator<Reference2CharMap.Entry<?>>)Reference2CharSortedMaps.fastIterator((Reference2CharSortedMap<K>)AbstractReference2CharSortedMap.this));
        }
        
        @Override
        public boolean contains(final char k) {
            return AbstractReference2CharSortedMap.this.containsValue(k);
        }
        
        @Override
        public int size() {
            return AbstractReference2CharSortedMap.this.size();
        }
        
        @Override
        public void clear() {
            AbstractReference2CharSortedMap.this.clear();
        }
    }
    
    protected static class ValuesIterator<K> implements CharIterator
    {
        protected final ObjectBidirectionalIterator<Reference2CharMap.Entry<K>> i;
        
        public ValuesIterator(final ObjectBidirectionalIterator<Reference2CharMap.Entry<K>> i) {
            this.i = i;
        }
        
        @Override
        public char nextChar() {
            return this.i.next().getCharValue();
        }
        
        @Override
        public boolean hasNext() {
            return this.i.hasNext();
        }
    }
}
