/* XXL: The eXtensible and fleXible Library for data processing Copyright (C) 2000-2011 Prof. Dr. Bernhard Seeger Head of the Database Research Group Department of Mathematics and Computer Science University of Marburg Germany This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; If not, see <http://www.gnu.org/licenses/>. http://code.google.com/p/xxl/ */ package xxl.core.util; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Random; public class SignatureFactory { protected Map signatureMap; protected Map objectMap; protected int length; protected int lengthInBytes; protected int weight; protected Random random; protected int creationMisses; protected Signature nullSignature; public SignatureFactory(int length, int weight, Random random) { this.length = length; this.weight = weight; this.random = random; if (length<=0) throw new RuntimeException("length too small"); if (weight>length) throw new RuntimeException("weight too large"); lengthInBytes = (length+7)/8; signatureMap = new HashMap(); objectMap = new HashMap(); creationMisses = 0; nullSignature = new Signature(length); } public int getWeight() { return weight; } public int getLength() { return length; } public Signature getNullSignature() { return nullSignature; } public Signature getSignature(Object o) { return (Signature) objectMap.get(o); } public Signature getOrCreateSignature(Object o) { Signature newSignature = (Signature) objectMap.get(o); if (newSignature==null) return createSignature(o); else return newSignature; } public Signature createSignature(Object o) { Signature newSignature=null; while (true) { newSignature = Signature.createSignature(length, weight, random); if (signatureMap.get(newSignature)==null) { signatureMap.put(newSignature, o); objectMap.put(o, newSignature); break; } creationMisses++; } return newSignature; } public Iterator iterator() { return objectMap.entrySet().iterator(); } public String toString() { return "SignatureFactory, creationMisses: "+creationMisses; } }