01: package javaparser;
02:
03: import javaparser.javacc_gen.Token;
04: import java.util.*;
05:
06: /** Reuse last milion nodes...
07: * Quicker ? yes.
08: * Less mem ?
09: */
10: public final class RAWParserTreeNodeFactory {
11: private final Queue<RAWParserTreeNode> freedNodes = new ArrayDeque<RAWParserTreeNode>();
12: private int maxSize = 1000000; // 1 000 000 (approx 30MB)
13:
14: // stats
15: private long reused = 0;
16: private long created = 0;
17:
18: private RAWParserTreeNodeFactory() {
19: }
20:
21: private static RAWParserTreeNodeFactory instance = null;
22:
23: public static synchronized RAWParserTreeNodeFactory getInstance() {
24: if (instance == null) {
25: instance = new RAWParserTreeNodeFactory();
26: }
27: return instance;
28: }
29:
30: public synchronized void liberateResources() {
31: freedNodes.clear();
32: }
33:
34: public synchronized RAWParserTreeNode create(Token t) {
35: //return new RAWParserTreeNode(t);
36:
37: if (freedNodes.size() > 0) {
38: RAWParserTreeNode nn = freedNodes.remove();
39: reused++;
40: nn.t = t;
41: return nn;
42: }
43: created++;
44: return new RAWParserTreeNode(t);
45: }
46:
47: public synchronized RAWParserTreeNode create(String t) {
48: //return new RAWParserTreeNode(t);
49:
50: if (freedNodes.size() > 0) {
51: RAWParserTreeNode nn = freedNodes.remove();
52: reused++;
53: nn.name = t;
54: return nn;
55: }
56: created++;
57: return new RAWParserTreeNode(t);
58: }
59:
60: public synchronized void addFreed(RAWParserTreeNode rp) {
61: freedNodes.add(rp);
62: }
63:
64: public static synchronized void terminateRecurse(
65: RAWParserTreeNode root) {
66: if (root == null)
67: return;
68:
69: for (RAWParserTreeNode ci : root.childs) {
70: terminateRecurse(ci);
71: }
72: root.terminateAndOfferReuse();
73: }
74:
75: @Override
76: public final String toString() {
77: return "RAWParserTreeNodeFactory: " + freedNodes.size()
78: + " free, " + reused + " already reused, " + created
79: + " created";
80: }
81:
82: }
|