/* * Javolution - Java(TM) Solution for Real-Time and Embedded Systems * Copyright (C) 2012 - Javolution (http://javolution.org/) * All rights reserved. * * Permission to use, copy, modify, and distribute this software is * freely granted, provided that this notice is preserved. */ package javolution.util.internal.map.sorted; import java.io.Serializable; import java.util.Comparator; import java.util.Iterator; import javolution.util.function.Equality; import javolution.util.internal.table.sorted.FastSortedTableImpl; /** * A map view over a sorted table of entries. */ public class FastSortedMapImpl<K, V> extends SortedMapView<K,V> { private static final long serialVersionUID = 0x600L; // Version. private final FastSortedTableImpl<Entry<K,V>> table; private final Equality<? super K> keyComparator; private final Equality<? super V> valueComparator; private class TableComparator implements Comparator<Object>, Serializable { private static final long serialVersionUID = FastSortedMapImpl.serialVersionUID; @SuppressWarnings("unchecked") @Override public int compare(Object o1, Object o2) { if (o1 instanceof MapEntryImpl) { o1 = ((MapEntryImpl<K,V>)o1).getKey(); } if (o2 instanceof MapEntryImpl) { o2 = ((MapEntryImpl<K,V>)o2).getKey(); } return keyComparator.compare((K)o1, (K)o2); } } public FastSortedMapImpl(Equality<? super K> keyComparator, Equality<? super V> valueComparator) { super(null); this.keyComparator = keyComparator; this.valueComparator = valueComparator; table = new FastSortedTableImpl<Entry<K,V>>(new TableComparator()); } @Override public void clear() { table.clear(); } @Override public boolean containsKey(Object key) { return table.indexOf(key) >= 0; } @Override public K firstKey() { return table.getFirst().getKey(); } @Override public V get(Object key) { int i = table.indexOf(key); if (i < 0) return null; return table.get(i).getValue(); } @Override public boolean isEmpty() { return table.isEmpty(); } @Override public Iterator<Entry<K, V>> iterator() { return table.iterator(); } @Override public Equality<? super K> keyComparator() { return keyComparator; } @Override public K lastKey() { return table.getLast().getKey(); } @SuppressWarnings("unchecked") @Override public V put(K key, V value) { int i = ((FastSortedTableImpl<K>)table).positionOf(key); if (i >= 0) { // Entry found. Entry<K,V> entry = table.get(i); V previous = entry.getValue(); entry.setValue(value); return previous; } MapEntryImpl<K,V> entry = new MapEntryImpl<K,V>(key, value); table.add(-i-1, entry); return null; } @Override public V remove(Object key) { int i = table.indexOf(key); if (i < 0) return null; Entry<K,V> e = table.get(i); V previous = e.getValue(); table.remove(i); return previous; } @Override public int size() { return table.size(); } @Override public Equality<? super V> valueComparator() { return valueComparator; } }