using System;
namespace Wayne.Lib
{
    /// <summary>
    /// Array extension methods.
    /// </summary>
    public static class Arrays
    {
        #region Methods

        /// <summary>
        /// Compares two arrays to see if they are equal. (If both are null it also returns true.)
        /// </summary>
        /// <typeparam name="TDataType">The datatype of the array.</typeparam>
        /// <param name="array1">One of the arrays to compare.</param>
        /// <param name="array2">The other array to compare.</param>
        /// <returns></returns>
        public static bool Equal<TDataType>(TDataType[] array1, TDataType[] array2)
        {
            if ((array1 == null) && (array2 == null))
                return true;
            if ((array1 != null) && (array2 != null) && (array1.Length == array2.Length))
            {
                for (int i = 0; i < array1.Length; i++)
                    if (!array1[i].Equals(array2[i]))
                        return false;
                return true;
            }
            return false;
        }

        /// <summary>
        /// Fill an array with a certain value.
        /// </summary>
        /// <typeparam name="TDataType">The datatype of the array.</typeparam>
        /// <param name="array">The array to fill.</param>
        /// <param name="value">The value to fill with.</param>
        public static void Fill<TDataType>(TDataType[] array, TDataType value)
        {
            if ((array != null) && (array.Length > 0))
            {
                for (int i = 0; i < array.Length; i++)
                    array[i] = value;
            }
        }

        /// <summary>
        /// Get the hashcode of an array for comparision.
        /// </summary>
        /// <typeparam name="TDataType">The datatype of the array.</typeparam>
        /// <param name="array">The array to get the hashcode of.</param>
        public static int GetHashCode<TDataType>(TDataType[] array)
        {
            int hashCode = 0;
            if (array != null)
            {
                for (int i = 0; i < array.Length; i++)
                    hashCode ^= array[i].GetHashCode();
            }
            return hashCode;
        }

        #endregion
    }
}