1 /* $RCSfile$
2  * $Author: hansonr $
3  * $Date: 2007-04-05 09:07:28 -0500 (Thu, 05 Apr 2007) $
4  * $Revision: 7326 $
5  *
6  * Copyright (C) 2003-2005  The Jmol Development Team
7  *
8  * Contact: jmol-developers@lists.sf.net
9  *
10  *  This library is free software; you can redistribute it and/or
11  *  modify it under the terms of the GNU Lesser General Public
12  *  License as published by the Free Software Foundation; either
13  *  version 2.1 of the License, or (at your option) any later version.
14  *
15  *  This library is distributed in the hope that it will be useful,
16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  *  Lesser General Public License for more details.
19  *
20  *  You should have received a copy of the GNU Lesser General Public
21  *  License along with this library; if not, write to the Free Software
22  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
23  */
24 package org.jmol.util;
25 
26 
27 import org.jmol.c.STR;
28 import org.jmol.script.T;
29 
30 import javajs.util.P3;
31 import javajs.util.P3i;
32 
33 public class TempArray {
34 
TempArray()35   public TempArray() {
36   }
37 
38 
clear()39   public void clear() {
40     clearTempPoints();
41     clearTempScreens();
42     //clearTempBooleans();
43   }
44 
findBestFit(int size, int[] lengths)45   private static int findBestFit(int size, int[] lengths) {
46     int iFit = -1;
47     int fitLength = Integer.MAX_VALUE;
48 
49     for (int i = lengths.length; --i >= 0;) {
50       int freeLength = lengths[i];
51       if (freeLength >= size && freeLength < fitLength) {
52         fitLength = freeLength;
53         iFit = i;
54       }
55     }
56     if (iFit >= 0)
57       lengths[iFit] = 0;
58     return iFit;
59   }
60 
findShorter(int size, int [] lengths)61   private static int findShorter(int size, int [] lengths) {
62     for (int i = lengths.length; --i >= 0;)
63       if (lengths[i] == 0) {
64         lengths[i] = size;
65         return i;
66       }
67     int iShortest = 0;
68     int shortest = lengths[0];
69     for (int i = lengths.length; --i > 0;)
70       if (lengths[i] < shortest) {
71         shortest = lengths[i];
72         iShortest = i;
73       }
74     if (shortest < size) {
75       lengths[iShortest] = size;
76       return iShortest;
77     }
78     return -1;
79   }
80 
81   ////////////////////////////////////////////////////////////////
82   // temp Points
83   ////////////////////////////////////////////////////////////////
84   private final static int freePointsSize = 6;
85   private final int[] lengthsFreePoints = new int[freePointsSize];
86   private final P3[][] freePoints = new P3[freePointsSize][];
87 
clearTempPoints()88   private void clearTempPoints() {
89     for (int i = 0; i < freePointsSize; i++) {
90       lengthsFreePoints[i] = 0;
91       freePoints[i] = null;
92     }
93   }
94 
allocTempPoints(int size)95   public P3[] allocTempPoints(int size) {
96     P3[] tempPoints;
97     int iFit = findBestFit(size, lengthsFreePoints);
98     if (iFit > 0) {
99       tempPoints = freePoints[iFit];
100     } else {
101       tempPoints = new P3[size];
102       for (int i = size; --i >= 0;)
103         tempPoints[i] = new P3();
104     }
105     return tempPoints;
106   }
107 
freeTempPoints(P3[] tempPoints)108   public void freeTempPoints(P3[] tempPoints) {
109     for (int i = 0; i < freePoints.length; i++)
110       if (freePoints[i] == tempPoints) {
111         lengthsFreePoints[i] = tempPoints.length;
112         return;
113       }
114     int iFree = findShorter(tempPoints.length, lengthsFreePoints);
115     if (iFree >= 0)
116       freePoints[iFree] = tempPoints;
117   }
118 
119   ////////////////////////////////////////////////////////////////
120   // temp Screens
121   ////////////////////////////////////////////////////////////////
122   private final static int freeScreensSize = 6;
123   private final int[] lengthsFreeScreens = new int[freeScreensSize];
124   private final P3i[][] freeScreens = new P3i[freeScreensSize][];
125 
clearTempScreens()126   private void clearTempScreens() {
127     for (int i = 0; i < freeScreensSize; i++) {
128       lengthsFreeScreens[i] = 0;
129       freeScreens[i] = null;
130     }
131   }
132 
allocTempScreens(int size)133   public P3i[] allocTempScreens(int size) {
134     P3i[] tempScreens;
135     int iFit = findBestFit(size, lengthsFreeScreens);
136     if (iFit > 0) {
137       tempScreens = freeScreens[iFit];
138     } else {
139       tempScreens = new P3i[size];
140       for (int i = size; --i >= 0;)
141         tempScreens[i] = new P3i();
142     }
143     return tempScreens;
144   }
145 
freeTempScreens(P3i[] tempScreens)146   public void freeTempScreens(P3i[] tempScreens) {
147     for (int i = 0; i < freeScreens.length; i++)
148       if (freeScreens[i] == tempScreens) {
149         lengthsFreeScreens[i] = tempScreens.length;
150         return;
151       }
152     int iFree = findShorter(tempScreens.length, lengthsFreeScreens);
153     if (iFree >= 0)
154       freeScreens[iFree] = tempScreens;
155   }
156 
157   ////////////////////////////////////////////////////////////////
158   // temp EnumProteinStructure
159   ////////////////////////////////////////////////////////////////
160   private final static int freeEnumSize = 2;
161   private final int[] lengthsFreeEnum = new int[freeEnumSize];
162   private final STR[][] freeEnum = new STR[freeEnumSize][];
163 
allocTempEnum(int size)164   public STR[] allocTempEnum(int size) {
165     STR[] tempEnum;
166     int iFit = findBestFit(size, lengthsFreeEnum);
167     if (iFit > 0) {
168       tempEnum = freeEnum[iFit];
169     } else {
170       tempEnum = new STR[size];
171     }
172     return tempEnum;
173   }
174 
freeTempEnum(STR[] tempEnum)175   public void freeTempEnum(STR[] tempEnum) {
176     for (int i = 0; i < freeEnum.length; i++)
177       if (freeEnum[i] == tempEnum) {
178         lengthsFreeEnum[i] = tempEnum.length;
179         return;
180       }
181     int iFree = findShorter(tempEnum.length, lengthsFreeEnum);
182     if (iFree >= 0)
183       freeEnum[iFree] = tempEnum;
184   }
185 
186 
187   // admittedly an odd place for these two; just avoidng making a new class just for them.
188 
getSlabWithinRange(float min, float max)189   public static Object[] getSlabWithinRange(float min, float max) {
190     return new Object[] { Integer.valueOf(T.range),
191         new Float[] {Float.valueOf(min), Float.valueOf(max)}, Boolean.FALSE, null };
192   }
193 
getSlabObjectType(int tok, Object data, boolean isCap, Object colorData)194   public static Object[] getSlabObjectType(int tok, Object data, boolean isCap, Object colorData) {
195     return new Object[] { Integer.valueOf(tok), data, Boolean.valueOf(isCap), colorData };
196   }
197 }
198