1 32 package net.sf.retrotranslator.runtime.impl; 33 34 import java.util.*; 35 36 39 public abstract class LazyList<I, R> { 40 41 private List<I> inputs; 42 private R[] results; 43 44 public void add(I input) { 45 if (inputs == null) inputs = new ArrayList<I>(); 46 inputs.add(input); 47 } 48 49 public I getLast() { 50 return inputs.get(inputs.size() - 1); 51 } 52 53 public I get(int index) { 54 return inputs == null || inputs.size() <= index ? null : inputs.get(index); 55 } 56 57 public void set(int index, I element) { 58 if (inputs == null) inputs = new ArrayList<I>(); 59 while (inputs.size() <= index) { 60 inputs.add(null); 61 } 62 inputs.set(index, element); 63 } 64 65 public final synchronized R[] getLive() { 66 if (results == null) { 67 if (inputs == null) { 68 results = newArray(0); 69 for (int i = 0; i < results.length; i++) { 70 results[i] = resolve(null); 71 } 72 } else { 73 results = newArray(inputs.size()); 74 Iterator<I> iterator = inputs.iterator(); 75 for (int i = 0; i < results.length; i++) { 76 results[i] = resolve(iterator.hasNext() ? iterator.next() : null); 77 } 78 } 79 } 80 return results; 81 } 82 83 public final R[] getClone() { 84 R[] live = getLive(); 85 return live.length == 0 ? live : live.clone(); 86 } 87 88 protected abstract R resolve(I input); 89 90 protected abstract R[] newArray(int size); 91 92 } 93 | Popular Tags |