public unsafe void EqualityTest1() { bool *sample = stackalloc bool[4]; int checksum = 0; int address1 = (int)sample; Console.WriteLine("Original Address: {0:X}", address1); checksum += address1; IntPtr address2 = new IntPtr(sample); Console.WriteLine("IntPtr Address: {0:X}", address2.ToInt32()); checksum += address2.ToInt32(); BooleanPointer address3 = new BooleanPointer(address2); Console.WriteLine("BooleanPointer Address (from IntPtr): {0:X}", address3.ToInt32()); checksum += address3.ToInt32(); BooleanPointer address4 = new BooleanPointer(address1); Console.WriteLine("BooleanPointer Address (from Int32): {0:X}", address4.ToInt32()); checksum += address4.ToInt32(); int checksumDigest = checksum / 4; Assert.AreEqual(checksumDigest, address1); Assert.AreEqual(checksumDigest, address2.ToInt32()); Assert.AreEqual(checksumDigest, address3.ToInt32()); Assert.AreEqual(checksumDigest, address4.ToInt32()); }
public unsafe void AddressTest1() { bool * sample = stackalloc bool[4]; BooleanPointer a = new BooleanPointer(sample); BooleanPointer b = (a + 1); Console.WriteLine("Address offset: {0}", b.ToInt32() - a.ToInt32()); // note: low-level memory size is 1 byte. (Marshal.SizeOf(bool) returns 4 bytes) Assert.AreEqual(sizeof(bool), b.ToInt32() - a.ToInt32()); Assert.False(Object.ReferenceEquals(a, b)); // xPlatform's typed pointers are value type. BooleanPointer c = new BooleanPointer(sample + 1); BooleanPointer d = (++c); Console.WriteLine("Address offset: {0}", d.ToInt32() - c.ToInt32()); Assert.AreEqual(0, d.ToInt32() - c.ToInt32()); Assert.False(Object.ReferenceEquals(c, d)); }
public unsafe void StackallocTest3() { const int bufferSize = 4; bool * sample = stackalloc bool[bufferSize]; BooleanPointer pointer = new BooleanPointer(sample); bool[] results = new bool[bufferSize]; results[0] = *sample = true; for (int i = 1; i < bufferSize; i++) { results[i] = *(sample + i) = !*(sample + i - 1); } // Pointer conversion test for (int i = 0; i < bufferSize; i++) { object x = results[i]; object y = *(bool *)(pointer + i); Console.WriteLine("[{0}] <Left: {1}> {2} <Right: {3}>", i, x, x.Equals(y) ? "==" : "<>", y); Assert.AreEqual(x, y); } }
public unsafe void StackallocTest2() { const int bufferSize = 4; bool * sample = stackalloc bool[bufferSize]; BooleanPointer pointer = new BooleanPointer(sample); bool[] results = new bool[bufferSize]; results[0] = *sample = false; for (int i = 1; i < bufferSize; i++) { results[i] = *(sample + i) = !*(sample + i - 1); } // Indexer based memory navigation for (int i = 0; i < bufferSize; i++) { object x = results[i]; object y = pointer[i]; Console.WriteLine("[{0}] <Left: {1}> {2} <Right: {3}>", i, x, x.Equals(y) ? "==" : "<>", y); Assert.AreEqual(x, y); } }
public unsafe void StackallocTest4() { const int bufferSize = 4; bool * sample = stackalloc bool[bufferSize]; BooleanPointer pointer = new BooleanPointer(sample); bool[] results = new bool[bufferSize]; // SetData method pointer.SetData(results[0] = true); for (int i = 1; i < bufferSize; i++) { pointer.SetData(results[i] = !pointer.GetData(i - 1), i); } // GetData method for (int i = 0; i < bufferSize; i++) { object x = results[i]; object y = pointer.GetData(i); Console.WriteLine("[{0}] <Left: {1}> {2} <Right: {3}>", i, x, x.Equals(y) ? "==" : "<>", y); Assert.AreEqual(x, y); } }