using System;
namespace SharpPcap.Util
{
///
/// NumberRange
///
public abstract class NumberRange
{
virtual public long CurrentNumber
{
get
{
return current;
}
set
{
this.current = checkBoundries(value);
}
}
virtual public long Max
{
get
{
return max;
}
set
{
this.max = checkTotalBoundries(value);
if (current > value)
current = this.max;
}
}
/// Sets the minimum value of this Range. This also sets the current value to the minimum.
/// the minimum value
///
virtual public long Min
{
get
{
return min;
}
set
{
this.min = checkTotalBoundries(value);
current = this.min;
}
}
private long min;
private long max;
private long current;
private long step = 1;
private bool isRandom_Renamed_Field = true;
//protected internal Rand random = Rand.Instance;
protected Random random = new Random(Rand.Instance.GetInt());
private long _totalMin = System.Int64.MinValue;
private long _totalMax = System.Int64.MaxValue;
protected internal NumberRange(long min, long max, long step, long totalMin, long totalMax)
{
//random = Rand.Instance;
_totalMin = totalMin;
_totalMax = totalMax;
if (min > max)
{
long tmp = min;
min = max;
max = tmp;
}
this.Min = min;
this.Max = max;
this.step = step;
this.isRandom_Renamed_Field = false;
}
protected internal NumberRange(long min, long max, bool isRandom, long totalMin, long totalMax)
{
//random = Rand.Instance;
_totalMin = totalMin;
_totalMax = totalMax;
if (min > max)
{
long tmp = min;
min = max;
max = tmp;
}
this.Min = min;
this.Max = max;
this.isRandom_Renamed_Field = isRandom;
}
public virtual long size()
{
return max - min + 1;
}
public virtual System.Object next()
{
return nextNumber();
}
public virtual sbyte nextByte()
{
return (sbyte) nextNumber();
}
public virtual short nextShort()
{
return (short) nextNumber();
}
public virtual int nextInt()
{
return (int) nextNumber();
}
public virtual long nextLong()
{
return (long) nextNumber();
}
bool first = true;
public virtual long nextNumber()
{
if (isRandom())
{
current=nextRandom();
return current;
}
if(first)
{
first = false;
return current;
}
//long _res = current;
if (current + step > max)
current = min + (max - current);
else if (current + step < min)
current = max - (current - min);
else
current += step;
return current;
}
public virtual long nextRandom()
{
double _min = min;
double _max = max;
double dif = (_max - _min + 1);
double final = ((random.NextDouble() * dif) + _min);
return (long) final;
}
protected internal virtual long checkBoundries(long num)
{
return checkBoundries(num, min, max);
}
protected internal virtual long checkTotalBoundries(long num)
{
return checkBoundries(num, _totalMin, _totalMax);
}
protected internal virtual long checkBoundries(long num, long _min, long _max)
{
if (num > _max)
return _max;
if (num < _min)
return _min;
return num;
}
public virtual long getStep()
{
return step;
}
public virtual void setStep(long step)
{
this.step = step;
}
public virtual bool isRandom()
{
return isRandom_Renamed_Field;
}
public virtual void setRandom(bool isRandom)
{
this.isRandom_Renamed_Field = isRandom;
}
public static Int64Range int64Range()
{
return new Int64Range();
}
public static Int64Range uint32Range()
{
return new Int64Range(0, 0xffffffffL);
}
public static Int64Range uint16Range()
{
return new Int64Range(0, 0xffff);
}
public static Int64Range ubyteRange()
{
return new Int64Range(0, 0xff);
}
}
}