/******************************************************************************* * Copyright (c) 2003-2005, 2013 Till Zoppke. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * Till Zoppke - initial API and implementation ******************************************************************************/ /* * Created on 26.10.2003 * * To change the template for this generated file go to * Window - Preferences - Java - Code Generation - Code and Comments */ package eniac.data; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import eniac.data.model.EData; /** * @author zoppke * * To change the template for this generated type comment go to Window - * Preferences - Java - Code Generation - Code and Comments */ public class IDManager { private static final int INITIAL_SIZE = 50; private static final float GROW_RATE = 1.5f; private EData[] _data = new EData[INITIAL_SIZE]; private List<EData> _invalids = new LinkedList<>(); private int _minFree = 0; // ============================== lifecycle // ================================= public IDManager() { // empty constructor } public void dispose() { Arrays.fill(_data, null); _data = null; _invalids.clear(); _invalids = null; } // ============================= methods // ==================================== public boolean containsID(int id) { return id < _data.length && _data[id] != null; } public boolean containsID(EData d) { return containsID(d.getID()); } public boolean put(EData d) { int id = d.getID(); if (containsID(id)) { _invalids.add(d); return false; } checkSize(id); _data[id] = d; return true; } public int getFreeID() { while (_minFree < _data.length) { if (_data[_minFree] == null) { return _minFree; } _minFree++; } return _minFree; } public EData get(int id) { return _data[id]; } public EData remove(int id) { // if id is out of range, return null. if (id >= _data.length) { return null; } // otherwise adjust minfree pointer and remove object. EData retour = _data[id]; _data[id] = null; _minFree = Math.min(_minFree, id); // return object return retour; } public boolean hasInvalids() { return _invalids.size() > 0; } public void integrateInvalids() { for (EData d : _invalids) { d.setID(getFreeID()); put(d); } _invalids.clear(); } public String toString() { String s = "IDManager: "; //$NON-NLS-1$ for (int i = 0; i < _data.length; ++i) { s = s + i + "=" + _data[i] + "; "; //$NON-NLS-1$ //$NON-NLS-2$ } return s; } // ========================== private methods // =============================== private void checkSize(int id) { int size = _data.length; while (size <= id) { size = (int) (size * GROW_RATE); } if (size > _data.length) { EData[] newData = new EData[size]; System.arraycopy(_data, 0, newData, 0, _data.length); _data = newData; } } }