001package com.fs.starfarer.api.util;
002
003import java.util.ArrayList;
004import java.util.LinkedHashMap;
005import java.util.List;
006import java.util.Map;
007import java.util.Set;
008import java.util.Map.Entry;
009
010public class TimeoutTrackerMap<K, V> {
011
012        public static class ItemData<K, V> {
013                public K key;
014                public V item;
015                public float remaining;
016        }
017        
018        private Map<K, ItemData<K, V>> items = new LinkedHashMap<K, ItemData<K, V>>();
019        public void add(K key, V item, float time) {
020                getData(key, item).remaining += time;
021        }
022        
023        public void add(K key, V item, float time, float limit) {
024                ItemData<K, V> d = getData(key, item);
025                if (time > 0 && d.remaining + time > limit) {
026                        time = Math.max(0, limit - d.remaining);
027                }
028                d.remaining += time;
029                if (d.remaining < 0) {
030                        d.remaining = 0;
031                }
032        }
033        
034        public void set(K key, V item, float time) {
035                getData(key, item).remaining = time;
036        }
037        
038        public float getRemaining(K key) {
039                return getData(key, null).remaining;
040        }
041        public V getItem(K key) {
042                return getData(key, null).item;
043        }
044        
045        public void remove(K key) {
046                items.remove(key);
047        }
048        
049        public void clear() {
050                items.clear();
051        }
052        
053        
054        private ItemData<K, V> getData(K key, V item) {
055                ItemData<K, V> data = items.get(key);
056                if (data == null) {
057                        data = new ItemData<K, V>();
058                        data.key = key;
059                        data.item = item;
060                        data.remaining = 0;
061                        items.put(key, data);
062                        
063                }
064                return data;
065        }
066        
067        public void advance(float amount) {
068                List<K> remove = new ArrayList<K>();
069                Set<Entry<K, ItemData<K, V>>> entrySet = items.entrySet();
070                for (Entry<K, ItemData<K, V>> entry : entrySet) {
071                        entry.getValue().remaining -= amount;
072                        if (entry.getValue().remaining <= 0) {
073                                remove.add(entry.getKey());
074                        }
075                }
076                for (K key : remove) {
077                        items.remove(key);
078                }
079        }
080
081        public boolean contains(K key) {
082                return items.containsKey(key);
083        }
084}
085
086
087
088
089
090
091