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