content: ///////////////////////////////////////////////////////////////////////////////
  // Copyright (c) 2001, Eric D. Friedman All Rights Reserved.
  // Copyright (c) 2009, Rob Eden All Rights Reserved.
  // Copyright (c) 2009, Jeff Randall All Rights Reserved.
  //
  // 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 2.1 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 General Public License for more details.
  //
  // You should have received a copy of the GNU Lesser General Public
  // License along with this program; if not, write to the Free Software
  // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  ///////////////////////////////////////////////////////////////////////////////
  
  package gnu.trove.impl.hash;
  
  import gnu.trove.strategy.HashingStrategy;
  
  import java.io.IOException;
  import java.io.ObjectInput;
  import java.io.ObjectOutput;
  
  
  /**
   * An open addressed hashing implementation for Object types.
   *
   * @author Rob Eden
   * @author Eric D. Friedman
   * @author Jeff Randall
   * @version $Id: TObjectHash.java,v 1.1.2.6 2009/11/07 03:36:44 robeden Exp $
   */
  @SuppressWarnings( { "UnusedDeclaration" } )
  abstract public class TCustomObjectHash<T> extends TObjectHash<T> {
  	static final long serialVersionUID = 8766048185963756400L;
  
  	protected HashingStrategy<? super T> strategy;
  
  
  	/** FOR EXTERNALIZATION ONLY!!! */
  	public TCustomObjectHash() {}
  
  	
      /**
       * Creates a new <code>TManualObjectHash</code> instance with the
       * default capacity and load factor.
       */
      public TCustomObjectHash( HashingStrategy<? super T> strategy ) {
          super();
  
  		this.strategy = strategy;
      }
  
  
      /**
       * Creates a new <code>TManualObjectHash</code> instance whose capacity
       * is the next highest prime above <tt>initialCapacity + 1</tt>
       * unless that value is already prime.
       *
       * @param initialCapacity an <code>int</code> value
       */
      public TCustomObjectHash( HashingStrategy<? super T> strategy, int initialCapacity ) {
          super( initialCapacity );
  
  		this.strategy = strategy;
      }
  
  
      /**
       * Creates a new <code>TManualObjectHash</code> instance with a prime
       * value at or near the specified capacity and load factor.
       *
       * @param initialCapacity used to find a prime capacity for the table.
       * @param loadFactor      used to calculate the threshold over which
       *                        rehashing takes place.
       */
      public TCustomObjectHash( HashingStrategy<? super T> strategy, int initialCapacity,
  		float loadFactor ) {
  
          super( initialCapacity, loadFactor );
  
  		this.strategy = strategy;
      }
  
  
  	@Override
  	protected int hash( Object obj ) {
  		//noinspection unchecked
  		return strategy.computeHashCode( ( T ) obj );
  	}
  
  	@Override
  	protected boolean equals( Object one, Object two ) {
  		//noinspection unchecked
  		return two != REMOVED && strategy.equals( ( T ) one, ( T ) two );
  	}
  
  
  	@Override
      public void writeExternal( ObjectOutput out ) throws IOException {
  
          // VERSION
          out.writeByte( 0 );
  
          // SUPER
          super.writeExternal( out );
  
  	    // STRATEGY
  	    out.writeObject( strategy );
      }
  
  
      @Override
      public void readExternal( ObjectInput in )
              throws IOException, ClassNotFoundException {
  
          // VERSION
          in.readByte();
  
          // SUPER
          super.readExternal( in );
  
  	    // STRATEGY
  	    //noinspection unchecked
  	    strategy = ( HashingStrategy<T> ) in.readObject();
      }
  } // TCustomObjectHash
  