using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using Newtonsoft.Json;
using System.Collections;
namespace Misc
{
///
/// int范围类,
///
public class Range : INotifyPropertyChanged, Misc.ISaveToXml
{
#region property
///
/// 开始
///
public int Begin { get; set; } = Misc.MyBase.NULL_VALUE;
///
/// 结束
///
public int End { get; set; } = Misc.MyBase.NULL_VALUE;
#endregion
#region just get property
///
/// 本范围 中心位置
///
[JsonIgnore]
public int Mid
{
get
{
if (Misc.MyBase.ISVALIDATA(Begin))
return (End + Begin) / 2;
else
return Misc.MyBase.NULL_VALUE;
}
}
///
/// 本范围宽度
///
[JsonIgnore]
public int Width
{
get
{
if (IsValid)
return End - Begin + 1;
else
return Misc.MyBase.NULL_VALUE;
}
}
///
/// 是否有效
///
[JsonIgnore]
public bool IsValid
{
get
{
if (Misc.MyBase.ISVALIDATA(Begin) && Misc.MyBase.ISVALIDATA(End))
return true;
else
return false;
}
}
#endregion
static Range()
{
Misc.SaveToXmlHepler.Regist(typeof(Range));
}
///
///
///
///
public RangeStruct ToStruct()
{
return new RangeStruct(Begin, End);
}
public Range(RangeStruct rangeStruct) {
Begin = rangeStruct.Begin;
End = rangeStruct.End;
}
///
/// 使用无效值初始化
///
public Range()
{
Reset();
}
#region methods
///
/// 范围 r 在 本范围内
///
///
///
public bool Contain(Range r)
{
if ((Begin <= r.Begin) && (r.End <= End))
return true;
else
return false;
}
///
/// 点 p 在 本范围内
///
///
///
public bool Contain(int p)
{
if ((Begin <= p) && (p <= End))
return true;
else
return false;
}
///
/// 平移
///
///
public void Move(int offset)
{
Begin += offset;
End += offset;
}
///
/// 复位为无效
///
public void Reset()
{
Begin = Misc.MyBase.NULL_VALUE;
End = Misc.MyBase.NULL_VALUE;
}
///
/// 转换为8个字节
///
///
public byte[] ToBytes()
{
List buf = new List();
buf.AddRange(BitConverter.GetBytes(Begin));
buf.AddRange(BitConverter.GetBytes(End));
return buf.ToArray();
}
///
/// 8个字节转换
///
///
///
///
public bool TryParse(byte[] value, int offset)
{
if (value.Length - offset < 8)
return false;
Begin = BitConverter.ToInt32(value, offset + 0);
End = BitConverter.ToInt32(value, offset + 4);
return true;
}
///
/// 范围并集
///
///
///
///
public static Range operator |(Range a, Range b)
{
return new Range()
{
Begin = (a.Begin < b.Begin) ? a.Begin : b.Begin,
End = (a.End > b.End) ? a.End : b.End
};
}
///
/// 范围交集
///
///
///
///
public static Range operator &(Range a, Range b)
{
Range r = new Range()
{
Begin = (a.Begin > b.Begin) ? a.Begin : b.Begin,
End = (a.End < b.End) ? a.End : b.End
};
if (r.End < r.Begin)
{
return new Range();
}
else
{
return r;
}
}
///
/// 范围 a小于b
///
///
///
///
public static bool operator <(Range a, Range b)
{
if (a.End < b.Begin)//[a.b,a.e] [b.b,b.e]
{
return true;
}
else
{
return false;
}
}
///
/// 范围 a大于b
///
///
///
///
public static bool operator >(Range a, Range b)
{
if (b.End < (a.Begin))// [b.b,b.e][a.b,a.e]
{
return true;
}
else
{
return false;
}
}
public static bool operator <(int p, Range r)
{
if (p < r.Begin)
{
return true;
}
else
{
return false;
}
}
public static bool operator >(int p, Range r)
{
if (p > r.End)
{
return true;
}
else
{
return false;
}
}
public static bool operator <(Range r, int p)
{
if (r.End < p)
{
return true;
}
else
{
return false;
}
}
public static bool operator >(Range r, int p)
{
if (r.Begin > p)
{
return true;
}
else
{
return false;
}
}
///
/// 是否有交集
///
///
///
public bool HasIntersection(Range r)
{
if (Contain(r.Begin))
return true;
if (Contain(r.End))
return true;
if (r.Contain(Begin))
return true;
if (r.Contain(End))
return true;
return false;
}
///
/// 可以合并
///
///
public bool CanUnion(Range r)
{
if (HasIntersection(r))
return true;
if (End == (r.Begin - 1))
return true;
if (Begin == (r.End + 1))
return true;
return false;
}
///
/// 复制 r 的值到 本范围内
///
///
public void Copy(Range r)
{
Begin = r.Begin;
End = r.End;
}
///
/// 克隆
///
///
public Range Clone()
{
Range r = new Range();
r.Copy(this);
return r;
}
#endregion
///
///
///
///
public override string ToString()
{
return "[" + Begin.ToString() + "," + End.ToString() + "]=" + Width.ToString();
}
#region INotifyPropertyChanged 成员
public event PropertyChangedEventHandler PropertyChanged;
#endregion
#region ISaveToXml 成员
public string[] GetSavePropertyNames()
{
return new string[]{
"Begin","End"
};
}
#endregion
}
///
/// Range 比较器
///
public class RangeEqualityComparer : IEqualityComparer
{
///
///
///
///
///
///
public bool Equals(Range x, Range y)
{
if (x == y)
return true;
else if (x == null || y == null)
return false;
if ((x.Begin == y.Begin) && (x.End == y.End))
{
return true;
}
else
return false;
}
///
///
///
///
///
public int GetHashCode(Range obj)
{
int hashCode = obj.Begin.GetHashCode();
int hashCode2 = obj.End.GetHashCode();
if (hashCode != hashCode2)
{
hashCode ^= hashCode2;
}
return hashCode;
}
}
///
/// Range 辅助类
///
public static class EListRange
{
///
/// rlist 必须是由小到大排列
///
///
///
public static void Union(this List rlist, Range r)
{
for (int i = 0; i < rlist.Count(); i++)
{
Range r_dest = rlist[i];
if (r < r_dest)//在 r_dest 前面
{
rlist.Insert(i, r);
return;//完成
}
else if (r.CanUnion(r_dest)) //r 与 r_dest 有交集
{
//r 与 r_dest 合体
r = r | r_dest;
rlist.RemoveAt(i);
i--;
//还需要继续判断
}
}
//r 在 rlist 的后面
rlist.Add(r);
}
///
/// 联合
///
///
///
public static void Union(this List rlist1, List rlist2)
{
for (int i = 0; i < rlist2.Count(); i++)
{
rlist1.Union(rlist2[i]);
}
}
}
}