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