001package com.fs.starfarer.api.util;
002
003import java.util.ArrayList;
004import java.util.HashSet;
005import java.util.List;
006import java.util.Set;
007
008public class TimeoutTracker<T> {
009
010        public static class ItemData<T> {
011                public T item;
012                public float remaining;
013        }
014        
015        private List<ItemData<T>> items = new ArrayList<ItemData<T>>();
016        transient private Set<T> set = new HashSet<T>();
017        
018        Object readResolve() {
019                set = new HashSet<T>();
020                for (ItemData<T> item : items) {
021                        set.add(item.item);
022                }
023                return this;
024        }
025        
026        Object writeReplace() {
027                return this;
028        }
029        
030        public void add(T item, float time) {
031                getData(item).remaining += time;
032        }
033        
034        public void add(T item, float time, float limit) {
035                ItemData<T> d = getData(item);
036                if (time > 0 && d.remaining + time > limit) {
037                        time = Math.max(0, limit - d.remaining);
038                }
039                d.remaining += time;
040                if (d.remaining < 0) {
041                        d.remaining = 0;
042                }
043        }
044        
045        public void set(T item, float time) {
046                getData(item).remaining = time;
047        }
048        
049        public float getRemaining(T item) {
050                return getData(item).remaining;
051        }
052        
053        public void remove(T item) {
054                for (ItemData<T> d : items) {
055                        //if (d.item == item) {
056                        if (d.item.equals(item)) {
057                                items.remove(d);
058                                set.remove(item);
059                                return;
060                        }
061                }
062        }
063        
064        public List<T> getItems() {
065                List<T> list = new ArrayList<T>();
066                for (ItemData<T> d : items) {
067                        list.add(d.item);
068                }
069                return list;
070        }
071        
072        public void clear() {
073                items.clear();
074                set.clear();
075        }
076        
077        
078        private ItemData<T> getData(T item) {
079                for (ItemData<T> d : items) {
080                        //if (d.item == item) {
081                        if (d.item.equals(item)) {
082                                return d;
083                        }
084                }
085                ItemData<T> d = new ItemData<T>();
086                d.item = item;
087                d.remaining = 0;
088                items.add(d);
089                set.add(item);
090                return d;
091        }
092        
093        public void advance(float amount) {
094                List<ItemData<T>> remove = new ArrayList<ItemData<T>>();
095                for (ItemData<T> d : items) {
096//                      if (d.item instanceof CampaignEventListener) {
097//                              System.out.println("Remaining: " + d.remaining);
098//                      }
099                        d.remaining -= amount;
100                        if (d.remaining <= 0) {
101                                remove.add(d);
102                                set.remove(d.item);
103                        }
104                }
105                items.removeAll(remove);
106        }
107
108        public boolean contains(T item) {
109                return set.contains(item);
110//              for (ItemData d : items) {
111//                      if (d.item == item) {
112//                              return true;
113//                      }
114//              }
115//              return false;
116        }
117}
118
119
120
121
122
123
124