From 663631f0456fcc245dd835889f86541d75161c53 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Thu, 28 Aug 2014 20:52:43 +0400 Subject: java-decompiler: post-import cleanup (classes moved) --- .../java/decompiler/util/SFormsFastMapOld.java | 270 +++++++++++++++++++++ 1 file changed, 270 insertions(+) create mode 100644 src/org/jetbrains/java/decompiler/util/SFormsFastMapOld.java (limited to 'src/org/jetbrains/java/decompiler/util/SFormsFastMapOld.java') diff --git a/src/org/jetbrains/java/decompiler/util/SFormsFastMapOld.java b/src/org/jetbrains/java/decompiler/util/SFormsFastMapOld.java new file mode 100644 index 0000000..be3e7b7 --- /dev/null +++ b/src/org/jetbrains/java/decompiler/util/SFormsFastMapOld.java @@ -0,0 +1,270 @@ +package org.jetbrains.java.decompiler.util; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map.Entry; + +import org.jetbrains.java.decompiler.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!"); +// } +// +// } + +} -- cgit v1.2.3