using System;

namespace Unity.Burst.CompilerServices
{
    /// <summary>
    /// Can be used to specify that a parameter or return has a range assumption.
    /// Assumptions feed directly into the optimizer and allow better codegen.
    ///
    /// Only usable on values of type scalar integer.
    ///
    /// The range is a closed interval [min..max] - EG. the attributed value
    /// is greater-than-or-equal-to min and less-than-or-equal-to max.
    /// </summary>
    [AttributeUsage(AttributeTargets.ReturnValue | AttributeTargets.Parameter)]
    public class AssumeRangeAttribute : Attribute
    {
        /// <summary>
        /// Assume that an integer is in the signed closed interval [min..max].
        /// </summary>
        /// <param name="min">The inclusive minimum value.</param>
        /// <param name="max">The inclusive maximum value.</param>
        public AssumeRangeAttribute(long min, long max) { }

        /// <summary>
        /// Assume that an integer is in the unsigned closed interval [min..max].
        /// </summary>
        /// <param name="min">The inclusive minimum value.</param>
        /// <param name="max">The inclusive maximum value.</param>
        public AssumeRangeAttribute(ulong min, ulong max) { }
    }
}