package de.fernflower.util; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; import de.fernflower.modules.decompiler.exps.VarExprent; public class SFormsFastMapOld { private List>> lstElements = new ArrayList>>(3); { lstElements.add(new ArrayList>()); lstElements.add(new ArrayList>()); lstElements.add(new ArrayList>()); } public SFormsFastMapOld() {} public SFormsFastMapOld(SFormsFastMapOld map) { for(int i=2;i>=0;i--) { lstElements.set(i, new ArrayList>(map.lstElements.get(i))); } } public int size() { int size = 0; for(int i=2;i>=0;i--) { size += lstElements.get(i).size(); } return size; } public boolean isEmpty() { for(int i=2;i>=0;i--) { if(!lstElements.get(i).isEmpty()) { return false; } } return true; } public void put(int key, E value) { putInternal(key, value, false); } public void remove(int key) { putInternal(key, null, true); } public void removeAllFields() { lstElements.get(2).clear(); } public void putInternal(final int key, final E value, boolean remove) { int index = 0; int ikey = key; if(ikey < 0) { index = 2; ikey = -ikey; } else if(ikey >= VarExprent.STACK_BASE) { index = 1; ikey -= VarExprent.STACK_BASE; } ArrayList> lst = lstElements.get(index); if(ikey >= lst.size()) { if(remove) { return; } else { ensureCapacity(lst, ikey+1, false); } } lst.set(ikey, value==null?null:new Entry() { private Integer var = key; private E val = value; public Integer getKey() { return var; } public E getValue() { return val; } public E setValue(E newvalue) { val = newvalue; return null; }}); } public boolean containsKey(int key) { return get(key) != null; } public E get(int key) { int index = 0; if(key < 0) { index = 2; key = -key; } else if(key >= VarExprent.STACK_BASE) { index = 1; key -= VarExprent.STACK_BASE; } ArrayList> lst = lstElements.get(index); Entry ent; if(key < lst.size() && (ent = lst.get(key)) != null) { return ent.getValue(); } return null; } public void union(SFormsFastMapOld map, IElementsUnion union) { for(int i=2;i>=0;i--) { ArrayList> lstOwn = lstElements.get(i); ArrayList> lstExtern = map.lstElements.get(i); int ownsize = lstOwn.size(); int externsize = lstExtern.size(); int minsize = ownsize>externsize?externsize:ownsize; for(int j=minsize-1;j>=0;j--) { Entry second = lstExtern.get(j); if(second != null) { Entry first = lstOwn.get(j); if(first == null) { putInternal(second.getKey(), union.copy(second.getValue()), false); } else { first.setValue(union.union(first.getValue(), second.getValue())); } } } if(externsize > minsize) { // ensureCapacity(lstOwn, externsize, true); // lstOwn.addAll(lstExtern.subList(minsize, externsize)); for(int j=minsize;j second = lstExtern.get(j); // if(first != null) { // first.setValue(union.copy(first.getValue())); // } if(second != null) { putInternal(second.getKey(), union.copy(second.getValue()), false); } // lstOwn.add(lstExtern.get(j)); } } } } public List> entryList() { List> list = new ArrayList>(); for(int i=2;i>=0;i--) { for(Entry ent : lstElements.get(i)) { if(ent != null) { list.add(ent); } } } return list; } // public SFormsFastMapIterator iterator() { // return new SFormsFastMapIterator(); // } private void ensureCapacity(ArrayList> lst, int size, boolean exact) { if(!exact) { int minsize = 2*lst.size()/3 +1; if(minsize > size) { size = minsize; } } lst.ensureCapacity(size); for(int i=size-lst.size();i>0;i--) { lst.add(null); } } public static interface IElementsUnion { public E union(E first, E second); public E copy(E element); } // public class SFormsFastMapIterator implements Iterator> { // // private int[] pointer = new int[]{0, -1}; // private int[] next_pointer = null; // // private int[] getNextIndex(int list, int index) { // // while(list < 3) { // ArrayList lst = lstElements.get(list); // // while(++index < lst.size()) { // E element = lst.get(index); // if(element != null) { // return new int[] {list, index}; // } // } // // index = -1; // list++; // } // // return null; // } // // public boolean hasNext() { // next_pointer = getNextIndex(pointer[0], pointer[1]); // return (next_pointer != null); // } // // public Entry next() { // if(next_pointer != null) { // pointer = next_pointer; // } else { // int[] nextpointer = getNextIndex(pointer[0], pointer[1]); // if(nextpointer != null) { // pointer = nextpointer; // } else { // return null; // } // } // // next_pointer = null; // // return new Entry() { // public Integer getKey() { // return null; // } // // public E getValue() { // return null; // } // // public E setValue(E value) { // throw new RuntimeException("not implemented!"); // } // }; // //lstElements.get(pointer[0]).get(pointer[1]); // } // // public void remove() { // throw new RuntimeException("not implemented!"); // } // // } }