namespace AssetStudio
{
    public static class PrimitiveExtensions
    {
        public static int ParseDigit(this char _this)
        {
            return _this - '0';
        }

        public static string ToHexString(this byte _this)
        {
            return _this.ToString("x2");
        }

        public static string ToHexString(this short _this)
        {
            ushort value = unchecked((ushort)_this);
            return ToHexString(value);
        }

        public static string ToHexString(this ushort _this)
        {
            ushort reverse = unchecked((ushort)(((0xFF00 & _this) >> 8) | ((0x00FF & _this) << 8)));
            return reverse.ToString("x4");
        }

        public static string ToHexString(this int _this)
        {
            uint value = unchecked((uint)_this);
            return ToHexString(value);
        }

        public static string ToHexString(this uint _this)
        {
            uint reverse = ((0xFF000000 & _this) >> 24) | ((0x00FF0000 & _this) >> 8) | ((0x0000FF00 & _this) << 8) | ((0x000000FF & _this) << 24);
            return reverse.ToString("x8");
        }

        public static string ToHexString(this long _this)
        {
            ulong value = unchecked((ulong)_this);
            return ToHexString(value);
        }

        public static string ToHexString(this ulong _this)
        {
            ulong reverse = (_this & 0x00000000000000FFUL) << 56 | (_this & 0x000000000000FF00UL) << 40 |
                    (_this & 0x0000000000FF0000UL) << 24 | (_this & 0x00000000FF000000UL) << 8 |
                    (_this & 0x000000FF00000000UL) >> 8 | (_this & 0x0000FF0000000000UL) >> 24 |
                    (_this & 0x00FF000000000000UL) >> 40 | (_this & 0xFF00000000000000UL) >> 56;
            return reverse.ToString("x16");
        }

        public static string ToHexString(this float _this)
        {
            uint value = BitConverterExtensions.ToUInt32(_this);
            return ToHexString(value);
        }

        public static string ToHexString(this double _this)
        {
            ulong value = BitConverterExtensions.ToUInt64(_this);
            return ToHexString(value);
        }

        public static int ToClosestInt(this long _this)
        {
            if (_this > int.MaxValue)
            {
                return int.MaxValue;
            }
            if (_this < int.MinValue)
            {
                return int.MinValue;
            }
            return unchecked((int)_this);
        }
    }
}
