X-Git-Url: https://git.novaco.in/?a=blobdiff_plain;f=Novacoin%2Fbase_uint.cs;h=83ef1edd101d95e5236794344f40c691357cd3d8;hb=80b9c15a0c2d1b87180824a36948e37894cebaca;hp=b7eb7f90ab48913b3be3ac3389e385ee974ed22a;hpb=534af8e0f785ed0854becde62732e9fcc0a36fe4;p=NovacoinLibrary.git diff --git a/Novacoin/base_uint.cs b/Novacoin/base_uint.cs index b7eb7f9..83ef1ed 100644 --- a/Novacoin/base_uint.cs +++ b/Novacoin/base_uint.cs @@ -18,9 +18,13 @@ using System; +using System.Diagnostics.Contracts; namespace Novacoin { + /// + /// Base class for uint256 and uint160. + /// public class base_uint : IComparable, IEquatable { protected int nWidth; @@ -58,7 +62,6 @@ namespace Novacoin } } - public static bool operator !(base_uint a) { for (int i = 0; i < a.nWidth; i++) @@ -71,98 +74,6 @@ namespace Novacoin return true; } - public static base_uint operator ~(base_uint a) - { - var ret = new base_uint(); - for (int i = 0; i < a.nWidth; i++) - { - ret.pn[i] = ~a.pn[i]; - } - return ret; - } - - public static base_uint operator -(base_uint a) - { - var ret = new base_uint(); - for (int i = 0; i < a.nWidth; i++) - { - ret.pn[i] = ~a.pn[i]; - } - ret++; - return ret; - } - - - public static base_uint operator ++(base_uint a) - { - int i = 0; - while (++a.pn[i] == 0 && i < a.nWidth - 1) - { - i++; - } - return a; - } - - public static base_uint operator --(base_uint a) - { - int i = 0; - while (--a.pn[i] == uint.MaxValue && i < a.nWidth - 1) - { - i++; - } - return a; - } - - public static base_uint operator ^(base_uint a, base_uint b) - { - var result = new base_uint(); - result.pn = new uint[a.nWidth]; - for (int i = 0; i < result.nWidth; i++) - { - result.pn[i] = a.pn[i] ^ b.pn[i]; - } - return result; - } - - public static base_uint operator +(base_uint a, base_uint b) - { - var result = new base_uint(); - ulong carry = 0; - for (int i = 0; i < result.nWidth; i++) - { - ulong n = carry + a.pn[i] + b.pn[i]; - result.pn[i] = (uint)(n & 0xffffffff); - carry = n >> 32; - } - return result; - } - - public static base_uint operator -(base_uint a, base_uint b) - { - return a + (-b); - } - - public static base_uint operator &(base_uint a, base_uint b) - { - var result = new base_uint(); - result.pn = new uint[a.nWidth]; - for (int i = 0; i < result.nWidth; i++) - { - result.pn[i] = a.pn[i] & b.pn[i]; - } - return result; - } - - public static base_uint operator |(base_uint a, base_uint b) - { - var result = new base_uint(); - result.pn = new uint[a.nWidth]; - for (int i = 0; i < result.nWidth; i++) - { - result.pn[i] = a.pn[i] | b.pn[i]; - } - return result; - } public static bool operator <(base_uint a, base_uint b) { @@ -251,10 +162,12 @@ namespace Novacoin { return false; } + if (a.pn[1] != (uint)(b >> 32)) { return false; } + for (int i = 2; i < a.nWidth; i++) { if (a.pn[i] != 0) @@ -287,20 +200,13 @@ namespace Novacoin public static implicit operator byte[] (base_uint a) { - var result = new byte[a.nWidth]; - for (int i = 0; i < a.nWidth; i++) - { - Buffer.BlockCopy(BitConverter.GetBytes(a.pn[i]), 0, result, 4 * i, 4); - } - return result; + return Interop.LEBytes(a.pn); } private static bool ArraysEqual(uint[] a, uint[] b) { - if (a.Length != b.Length) - { - return false; - } + Contract.Requires(a.Length == b.Length, "Array length mismatch."); + for (int i = 0; i < a.Length; i++) { if (a[i] != b[i]) @@ -352,5 +258,10 @@ namespace Novacoin { return Equals(o as base_uint); } + + public override string ToString() + { + return Interop.ToHex(Interop.ReverseBytes(this)); + } } }