📄 setasbitvector.cs
字号:
namespace Opus6
{
using System;
using System.Collections;
[Version("$Id: SetAsBitVector.cs,v 1.5 2001/10/28 19:50:09 brpreiss Exp $"), Copyright("Copyright (c) 2001 by Bruno R. Preiss, P.Eng.")]
public class SetAsBitVector : AbstractSet, Set, SearchableContainer, Container, IComparable, IEnumerable
{
public SetAsBitVector(int n) : base(n)
{
this.vector = new int[((n + 0x20) - 1) / 0x20];
for (int num1 = 0; num1 < this.vector.Length; num1++)
{
this.vector[num1] = 0;
}
}
public override void Accept(Visitor visitor)
{
for (int num1 = 0; num1 < base.universeSize; num1++)
{
if (this.IsMember(num1))
{
visitor.Visit(num1);
}
}
}
public override int CompareTo(object arg)
{
throw new MethodNotImplementedException();
}
public virtual Set Difference(Set set)
{
SetAsBitVector vector1 = (SetAsBitVector) set;
if (base.universeSize != vector1.universeSize)
{
throw new ArgumentException("mismatched sets");
}
SetAsBitVector vector2 = new SetAsBitVector(base.universeSize);
for (int num1 = 0; num1 < this.vector.Length; num1++)
{
vector2.vector[num1] = this.vector[num1] & ~vector1.vector[num1];
}
return vector2;
}
public virtual bool Equals(Set set)
{
SetAsBitVector vector1 = (SetAsBitVector) set;
if (base.universeSize != vector1.universeSize)
{
throw new ArgumentException("mismatched sets");
}
for (int num1 = 0; num1 < this.vector.Length; num1++)
{
if (this.vector[num1] != vector1.vector[num1])
{
return false;
}
}
return true;
}
public override IEnumerator GetEnumerator()
{
return new Opus6.SetAsBitVector.Enumerator(this);
}
public override void Insert(int item)
{
int[] numArray1;
int num1;
(numArray1 = this.vector)[num1 = item / 0x20] = numArray1[num1] | (1 << ((item % 0x20) & 0x1f));
}
public virtual Set Intersection(Set set)
{
SetAsBitVector vector1 = (SetAsBitVector) set;
if (base.universeSize != vector1.universeSize)
{
throw new ArgumentException("mismatched sets");
}
SetAsBitVector vector2 = new SetAsBitVector(base.universeSize);
for (int num1 = 0; num1 < this.vector.Length; num1++)
{
vector2.vector[num1] = this.vector[num1] & vector1.vector[num1];
}
return vector2;
}
public override bool IsMember(int item)
{
return ((this.vector[item / 0x20] & (1 << ((item % 0x20) & 0x1f))) != 0);
}
public virtual bool IsSubset(Set set)
{
SetAsBitVector vector1 = (SetAsBitVector) set;
if (base.universeSize != vector1.universeSize)
{
throw new ArgumentException("mismatched sets");
}
for (int num1 = 0; num1 < this.vector.Length; num1++)
{
if ((this.vector[num1] & ~vector1.vector[num1]) != 0)
{
return false;
}
}
return true;
}
public static void Main()
{
AbstractSet.TestSet(new SetAsBitVector(0x20), new SetAsBitVector(0x20), new SetAsBitVector(0x20));
}
public override void Purge()
{
for (int num1 = 0; num1 < this.vector.Length; num1++)
{
this.vector[num1] = 0;
}
}
public virtual Set Union(Set set)
{
SetAsBitVector vector1 = (SetAsBitVector) set;
if (base.universeSize != vector1.universeSize)
{
throw new ArgumentException("mismatched sets");
}
SetAsBitVector vector2 = new SetAsBitVector(base.universeSize);
for (int num1 = 0; num1 < this.vector.Length; num1++)
{
vector2.vector[num1] = this.vector[num1] | vector1.vector[num1];
}
return vector2;
}
public override void Withdraw(int item)
{
int[] numArray1;
int num1;
(numArray1 = this.vector)[num1 = item / 0x20] = numArray1[num1] & ~(1 << ((item % 0x20) & 0x1f));
}
public override int Count
{
get
{
int num1 = 0;
for (int num2 = 0; num2 < base.universeSize; num2++)
{
if (this.IsMember(num2))
{
num1++;
}
}
return num1;
}
}
public override bool IsEmpty
{
get
{
for (int num1 = 0; num1 < base.universeSize; num1++)
{
if (this.IsMember(num1))
{
return false;
}
}
return true;
}
}
public override bool IsFull
{
get
{
for (int num1 = 0; num1 < base.universeSize; num1++)
{
if (!this.IsMember(num1))
{
return false;
}
}
return true;
}
}
protected const int BITS = 0x20;
protected int[] vector;
private class Enumerator : IEnumerator
{
internal Enumerator(SetAsBitVector set)
{
this.item = -1;
this.set = set;
}
public bool MoveNext()
{
this.item++;
while (this.item < this.set.UniverseSize)
{
if (this.set.IsMember(this.item))
{
break;
}
this.item++;
}
if (this.item == this.set.UniverseSize)
{
this.item = -1;
}
return (this.item >= 0);
}
public void Reset()
{
this.item = -1;
}
public object Current
{
get
{
if (this.item < 0)
{
return new InvalidOperationException();
}
return this.item;
}
}
private int item;
private SetAsBitVector set;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -