| // *************************************************************************************************************************** |
| // * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file * |
| // * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file * |
| // * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance * |
| // * with the License. You may obtain a copy of the License at * |
| // * * |
| // * http://www.apache.org/licenses/LICENSE-2.0 * |
| // * * |
| // * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an * |
| // * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * |
| // * specific language governing permissions and limitations under the License. * |
| // *************************************************************************************************************************** |
| package org.apache.juneau.internal; |
| |
| /** |
| * Utility class for generating integer hash codes. |
| * |
| * <p> |
| * General usage: |
| * <p class='bcode w800'> |
| * int hashCode = new HashCode().add("foobar").add(myobject).add(123).get(); |
| * </p> |
| */ |
| public class HashCode { |
| |
| private int hashCode = 1; |
| |
| /** |
| * Create a new HashCode object. |
| * |
| * @return A new HashCode object. |
| */ |
| public static final HashCode create() { |
| return new HashCode(); |
| } |
| |
| /** |
| * Hashes the hashcode of the specified object into this object. |
| * |
| * @param o The object whose hashcode will be hashed with this object. |
| * @return This object (for method chaining). |
| */ |
| public HashCode add(Object o) { |
| o = unswap(o); |
| add(o == null ? 1 : o.hashCode()); |
| return this; |
| } |
| |
| /** |
| * Hashes the hashcode into this object. |
| * |
| * <p> |
| * The formula is simply <c>hashCode = 31*hashCode + i;</c> |
| * |
| * @param i The hashcode to hash into this object's hashcode. |
| * @return This object (for method chaining). |
| */ |
| public HashCode add(int i) { |
| hashCode = 31*hashCode + i; |
| return this; |
| } |
| |
| /** |
| * Return the calculated hashcode value. |
| * |
| * @return The calculated hashcode. |
| */ |
| public int get() { |
| return hashCode; |
| } |
| |
| /** |
| * Converts the object to a normalized form before grabbing it's hashcode. |
| * |
| * <p> |
| * Subclasses can override this method to provide specialized handling (e.g. converting numbers to strings so that |
| * <c>123</c> and <js>"123"</js> end up creating the same hashcode.) |
| * |
| * <p> |
| * Default implementation does nothing. |
| * |
| * @param o The object to normalize before getting it's hashcode. |
| * @return The normalized object. |
| */ |
| protected Object unswap(Object o) { |
| return o; |
| } |
| } |