/*******************************************************************************
 * Copyright 2014 Trevor Robinson
 * 
 * Licensed 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 com.scurrilous.circe;

import java.nio.ByteBuffer;

/**
 * Interface implemented by stateless hash functions with an output length of 4
 * bytes or less.
 */
public interface StatelessIntHash extends StatelessHash {

    /**
     * Returns a new instance of stateful version of this hash function.
     * 
     * @return the stateful version of this hash function
     */
    @Override
    StatefulIntHash createStateful();

    /**
     * Evaluates this hash function for the entire given input array.
     * 
     * @param input the input array
     * @return the output of the hash function
     */
    int calculate(byte[] input);

    /**
     * Evaluates this hash function for the given range of the given input
     * array.
     * 
     * @param input the input array
     * @param index the starting index of the first input byte
     * @param length the length of the input range
     * @return the output of the hash function
     * @throws IndexOutOfBoundsException if index is negative or
     *             {@code index + length} is greater than the array length
     */
    int calculate(byte[] input, int index, int length);

    /**
     * Evaluates this hash function with the remaining contents of the given
     * input buffer. This method leaves the buffer position at the limit.
     * 
     * @param input the input buffer
     * @return the output of the hash function
     */
    int calculate(ByteBuffer input);

    /**
     * Evaluates this hash function for the memory with the given address and
     * length. The arguments are generally not checked in any way and will
     * likely lead to a VM crash or undefined results if invalid.
     * 
     * @param address the base address of the input
     * @param length the length of the input
     * @return the output of the hash function
     * @throws UnsupportedOperationException if this function does not support
     *             unsafe memory access
     * @see #supportsUnsafe()
     */
    int calculate(long address, long length);
}
