/* * JacORB - a free Java ORB * * Copyright (C) 1999-2014 Gerald Brose / The JacORB Team. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.jacorb.collection.util; /** * @author Gerald Brose */ public class ArrayFactory { private static final int MAX = 16; private static final int MIN_OFFSET = 4; private static final int THREASHOLD = 16; private static DynArray [] pool = new DynArray[ MAX ]; static { for( int i = MAX; i > 0;) { pool[--i]=new DynArray(); } } private final static int log2(int n){ int l =0; int nn = n-1; while( (nn >>l) != 0 ) { l++; } return l; } public static void release() { for( int i= MAX; i > 0; ) { i--; pool[i].removeAllElements(); } } public static synchronized Object [] get_array( int capacity ){ int log = 0; if( capacity != 0 ) { log = log2(capacity); } DynArray v= pool[log > MIN_OFFSET ? log-MIN_OFFSET : 0 ]; if( ! v.isEmpty() ) { Object o = v.lastElement(); v.removeElementAt(v.size()-1); return (Object [])o; } return new Object[log > MIN_OFFSET ? 1<<log : 1 << MIN_OFFSET ]; } public static synchronized void free_array( Object [] current ){ int log_curr = log2(current.length); if( log_curr-MIN_OFFSET < pool.length ) { clear_array( current ); DynArray v = pool[ log_curr-MIN_OFFSET ]; if( v.size() < THREASHOLD ) { v.addElement( current ); } } } private static void clear_array( Object [] current ){ for( int i=current.length;i>0;) { current[--i] = null; } } }