cgma
|
00001 /* 00002 * 00003 * 00004 * Copyright (C) 2004 Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 00005 * with Sandia Corporation, the U.S. Government retains certain rights in this software. 00006 * 00007 * This file is part of facetbool--contact via [email protected] 00008 * 00009 * This library is free software; you can redistribute it and/or 00010 * modify it under the terms of the GNU Lesser General Public 00011 * License as published by the Free Software Foundation; either 00012 * version 2.1 of the License, or (at your option) any later version. 00013 * 00014 * This library is distributed in the hope that it will be useful, 00015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00017 * Lesser General Public License for more details. 00018 * 00019 * You should have received a copy of the GNU Lesser General Public 00020 * License along with this library; if not, write to the Free Software 00021 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00022 * 00023 * 00024 * 00025 */ 00026 00027 #include "IntegerHash.hpp" 00028 00029 IntegerHash::IntegerHash(int numBins, int binSizeIncr) 00030 { 00031 int i; 00032 00033 numberofBins = numBins; 00034 binSizeIncrement = binSizeIncr; 00035 binSize = new int[numberofBins]; 00036 maxBinSize = new int[numberofBins]; 00037 binArray = new int *[numberofBins]; 00038 00039 for ( i = 0; i < numberofBins; i++ ) { 00040 maxBinSize[i] = binSizeIncrement; 00041 binSize[i] = 0; 00042 binArray[i] = new int[maxBinSize[i]]; 00043 } 00044 } 00045 00046 IntegerHash::~IntegerHash() 00047 { 00048 int i; 00049 00050 if ( binSize) delete[] binSize; 00051 if ( maxBinSize) delete[] maxBinSize; 00052 for ( i = 0; i < numberofBins; i++ ) { 00053 if ( binArray[i] ) delete[] binArray[i]; 00054 } 00055 if ( binArray ) delete [] binArray; 00056 } 00057 00058 void IntegerHash::getNumberofBins(int *numBins) const 00059 { 00060 *numBins = numberofBins; 00061 } 00062 00063 int *IntegerHash::getHashBin(int hashValue, int *binnSize) 00064 { 00065 hashIndex = hashValue%numberofBins; 00066 *binnSize = binSize[hashIndex]; 00067 return binArray[hashIndex]; 00068 } 00069 00070 void IntegerHash::addtoHashList(int hashValue, int value) 00071 { 00072 int i; 00073 hashIndex = hashValue%numberofBins; 00074 // Is it already there? 00075 for ( i = 0; i < binSize[hashIndex]; i++ ) { 00076 if ( binArray[hashIndex][i] == value ) return; 00077 } 00078 if ( binSize[hashIndex] > maxBinSize[hashIndex] - 1 ) { 00079 // Add more memory to this bin. 00080 allocateMoreHash(hashIndex); 00081 } 00082 00083 binArray[hashIndex][binSize[hashIndex]] = value; 00084 binSize[hashIndex] += 1; 00085 00086 } 00087 00088 void IntegerHash::allocateMoreHash(int index) 00089 { 00090 int *itemp; 00091 00092 maxBinSize[hashIndex] += binSizeIncrement; 00093 itemp = new int[maxBinSize[hashIndex]]; 00094 memcpy(itemp,binArray[index],binSize[hashIndex]*sizeof(int)); 00095 delete [] binArray[index]; 00096 binArray[index] = itemp; 00097 } 00098