add equals to bitset512

master
Evan Hemsley 2019-12-28 21:16:14 -08:00
parent a5a80bd92f
commit 19092d4025
3 changed files with 104 additions and 16 deletions

View File

@ -1,4 +1,7 @@
namespace MoonTools.FastCollections using System;
using System.Collections.Generic;
namespace MoonTools.FastCollections
{ {
public static unsafe class MemoryHelper public static unsafe class MemoryHelper
{ {
@ -40,7 +43,7 @@
} }
} }
public unsafe struct BitSet512 public unsafe struct BitSet512 : IEquatable<BitSet512>
{ {
public static BitSet512 Zero { get; } = new BitSet512(0); public static BitSet512 Zero { get; } = new BitSet512(0);
public static BitSet512 Ones { get; } = new BitSet512(uint.MaxValue); public static BitSet512 Ones { get; } = new BitSet512(uint.MaxValue);
@ -80,6 +83,16 @@
return new BitSet512(tmp); return new BitSet512(tmp);
} }
public static bool operator ==(BitSet512 left, BitSet512 right)
{
return left.Equals(right);
}
public static bool operator !=(BitSet512 left, BitSet512 right)
{
return !(left == right);
}
public BitSet512 Set(int index) public BitSet512 Set(int index)
{ {
var tmp = stackalloc uint[_uintLength]; var tmp = stackalloc uint[_uintLength];
@ -98,27 +111,53 @@
public bool Get(int bitIndex) public bool Get(int bitIndex)
{ {
uint thing = _buffer[bitIndex / 32]; var bitInt = (uint)(1 << bitIndex % 32);
return (_buffer[bitIndex / 32] & (uint)(1 << bitIndex % 32)) == _buffer[bitIndex / 32]; return (_buffer[bitIndex / 32] & bitInt) == bitInt;
} }
public bool AllTrue() public bool AllTrue()
{ {
var tmp = stackalloc uint[_uintLength]; return this == Ones;
MemoryHelper.Fill(tmp, _uintLength, uint.MaxValue);
fixed (uint* p = _buffer) return MemoryHelper.Equal(p, tmp, _uintLength);
} }
public bool AllFalse() public bool AllFalse()
{ {
var tmp = stackalloc uint[_uintLength]; return this == Zero;
MemoryHelper.Fill(tmp, _uintLength, 0);
fixed (uint* p = _buffer) return MemoryHelper.Equal(p, tmp, _uintLength);
} }
public static BitSet512 BitwiseAnd(BitSet512 left, BitSet512 right) public static BitSet512 BitwiseAnd(BitSet512 left, BitSet512 right)
{ {
return left & right; return left & right;
} }
public static BitSet512 BitwiseOr(BitSet512 left, BitSet512 right)
{
return left | right;
}
public static BitSet512 OnesComplement(BitSet512 bitSet)
{
return ~bitSet;
}
public override bool Equals(object obj)
{
return obj is BitSet512 set && Equals(set);
}
public bool Equals(BitSet512 other)
{
fixed (uint* p = _buffer) return MemoryHelper.Equal(p, other._buffer, _uintLength);
}
public override int GetHashCode()
{
var hc = 0;
for (var i = 0; i < _uintLength; i++)
{
hc ^= _buffer[i].GetHashCode();
}
return hc;
}
} }
} }

View File

@ -3,8 +3,13 @@
<PropertyGroup> <PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFramework>netstandard2.0</TargetFramework>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<RootNamespace>MoonTools.Collections</RootNamespace> <RootNamespace>MoonTools.FastCollections</RootNamespace>
<AssemblyName>MoonTools.Collections</AssemblyName> <AssemblyName>MoonTools.FastCollections</AssemblyName>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Copyright>Evan Hemsley 2019</Copyright>
<Description>Fast collections using unsafe code.</Description>
<PackageProjectUrl>https://github.com/MoonsideGames/MoonTools.FastCollections</PackageProjectUrl>
<RepositoryUrl>https://github.com/MoonsideGames/MoonTools.FastCollections</RepositoryUrl>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>

View File

@ -44,17 +44,19 @@ namespace MoonTools.FastCollections.Test
[Test] [Test]
public void UnSet() public void UnSet()
{ {
var bitSet = BitSet512.Ones.UnSet(285); var bitSet = BitSet512.Ones.UnSet(285).UnSet(24).UnSet(69);
bitSet.Get(285).Should().BeFalse(); bitSet.Get(285).Should().BeFalse();
bitSet.Set(285).AllTrue().Should().BeTrue(); bitSet.Get(24).Should().BeFalse();
bitSet.Get(69).Should().BeFalse();
} }
[Test] [Test]
public void Get() public void Get()
{ {
var bitSet = BitSet512.Zero.Set(359); var bitSet = BitSet512.Zero.Set(359).Set(23).Set(63);
bitSet.Get(359).Should().BeTrue(); bitSet.Get(359).Should().BeTrue();
bitSet.UnSet(359).AllFalse().Should().BeTrue(); bitSet.Get(23).Should().BeTrue();
bitSet.Get(63).Should().BeTrue();
} }
[Test] [Test]
@ -63,5 +65,47 @@ namespace MoonTools.FastCollections.Test
var bitSet = ~BitSet512.Ones; var bitSet = ~BitSet512.Ones;
bitSet.AllFalse().Should().BeTrue(); bitSet.AllFalse().Should().BeTrue();
} }
[Test]
public void Or()
{
var a = BitSet512.Zero.Set(10);
var b = BitSet512.Zero.Set(35);
var or = a | b;
or.Get(10).Should().BeTrue();
or.Get(35).Should().BeTrue();
}
[Test]
public void And()
{
var a = BitSet512.Zero.Set(10).Set(15).Set(20);
var b = BitSet512.Zero.Set(10).Set(15).Set(18);
var and = a & b;
and.Get(10).Should().BeTrue();
and.Get(15).Should().BeTrue();
and.Get(18).Should().BeFalse();
}
[Test]
public void Equal()
{
var zeroes = BitSet512.Zero;
(zeroes == BitSet512.Zero).Should().BeTrue();
var ones = BitSet512.Ones;
(ones == BitSet512.Ones).Should().BeTrue();
(zeroes != ones).Should().BeTrue();
var a = BitSet512.Zero.Set(6);
var b = BitSet512.Zero.Set(6);
var c = BitSet512.Zero.Set(12);
(a == b).Should().BeTrue();
(a == c).Should().BeFalse();
}
} }
} }