01: /***
02: * Retrotranslator: a Java bytecode transformer that translates Java classes
03: * compiled with JDK 5.0 into classes that can be run on JVM 1.4.
04: *
05: * Copyright (c) 2005 - 2008 Taras Puchko
06: * All rights reserved.
07: *
08: * Redistribution and use in source and binary forms, with or without
09: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: * 3. Neither the name of the copyright holders nor the names of its
17: * contributors may be used to endorse or promote products derived from
18: * this software without specific prior written permission.
19: *
20: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
30: * THE POSSIBILITY OF SUCH DAMAGE.
31: */package net.sf.retrotranslator.runtime.impl;
32:
33: import java.util.*;
34:
35: /**
36: * @author Taras Puchko
37: */
38: public abstract class LazyList<I, R> {
39:
40: private List<I> inputs;
41: private R[] results;
42:
43: public void add(I input) {
44: if (inputs == null)
45: 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
55: .get(index);
56: }
57:
58: public void set(int index, I element) {
59: if (inputs == null)
60: inputs = new ArrayList<I>();
61: while (inputs.size() <= index) {
62: inputs.add(null);
63: }
64: inputs.set(index, element);
65: }
66:
67: public final synchronized R[] getLive() {
68: if (results == null) {
69: if (inputs == null) {
70: results = newArray(0);
71: for (int i = 0; i < results.length; i++) {
72: results[i] = resolve(null);
73: }
74: } else {
75: results = newArray(inputs.size());
76: Iterator<I> iterator = inputs.iterator();
77: for (int i = 0; i < results.length; i++) {
78: results[i] = resolve(iterator.hasNext() ? iterator
79: .next() : null);
80: }
81: }
82: }
83: return results;
84: }
85:
86: public final R[] getClone() {
87: R[] live = getLive();
88: return live.length == 0 ? live : live.clone();
89: }
90:
91: protected abstract R resolve(I input);
92:
93: protected abstract R[] newArray(int size);
94:
95: }
|