/* * Copyright (c) 2015 Twitter, Inc. All rights reserved. * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 */ package com.twitter.whiskey.util; import java.util.Collection; import java.util.Collections; import java.util.ConcurrentModificationException; import java.util.Deque; /** * Abstract class for building a {@link MultiMap} with a {@link Deque} as the * mapped collection type. * * @author Michael Schore */ public abstract class DequeMultiMap<K, V> extends AbstractMultiMap<K, V, Collection<V>, Deque<V>> { public DequeMultiMap() { } @Override public V getFirst(K key) { Deque<V> values = map.get(key); return values == null ? null : values.peekFirst(); } @Override public V getLast(K key) { Deque<V> values = map.get(key); return values == null ? null : values.peekLast(); } @Override public V removeFirst(Object key) { int sentinel = mutations; Deque<V> values = map.get(key); if (values == null) return null; V value = values.pollFirst(); size--; if (values.isEmpty()) map.remove(key); if (sentinel != mutations++) throw new ConcurrentModificationException(); return value; } @Override public Collection<V> wrap(Deque<V> deque) { return deque != null ? Collections.unmodifiableCollection(deque) : Collections.<V>emptyList(); } }