using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
+using System.IO;
+using System.Linq;
using System.Text;
namespace Novacoin
{
- public class COutPoint
+ public class COutPoint : IComparable<COutPoint>, IEquatable<COutPoint>, IEqualityComparer<COutPoint>
{
/// <summary>
/// Hash of parent transaction.
/// </summary>
- public Hash256 hash;
+ public uint256 hash;
/// <summary>
/// Parent input number.
public COutPoint()
{
- hash = new Hash256();
+ hash = new uint256();
n = uint.MaxValue;
}
- public COutPoint(Hash256 hashIn, uint nIn)
+ public COutPoint(uint256 hashIn, uint nIn)
{
hash = hashIn;
n = nIn;
public COutPoint(COutPoint o)
{
- hash = new Hash256(o.hash);
+ hash = o.hash;
n = o.n;
}
{
Contract.Requires<ArgumentException>(bytes.Length == 36, "Any valid outpoint reference data item is exactly 36 bytes long.");
- hash = new Hash256(bytes);
+ hash = bytes.Take(32).ToArray();
n = BitConverter.ToUInt32(bytes, 32);
}
public bool IsNull
{
- get { return hash.IsZero && n == uint.MaxValue; }
+ get { return !hash && n == uint.MaxValue; }
}
public static implicit operator byte[] (COutPoint o)
{
- var r = new List<byte>();
- r.AddRange((byte[])o.hash);
- r.AddRange(BitConverter.GetBytes(o.n));
+ var stream = new MemoryStream();
+ var writer = new BinaryWriter(stream);
- return r.ToArray();
+ writer.Write(o.hash);
+ writer.Write(o.n);
+
+ var outBytes = stream.ToArray();
+
+ writer.Close();
+
+ return outBytes;
+ }
+
+ public static implicit operator COutPoint(byte[] b)
+ {
+ return new COutPoint(b);
}
public override string ToString()
{
var sb = new StringBuilder();
- sb.AppendFormat("COutPoint({0}, {1})", hash.ToString(), n);
+ sb.AppendFormat("COutPoint({0}, {1})", hash, n);
return sb.ToString();
}
-
+ /// <summary>
+ /// Compare this outpoint with some other.
+ /// </summary>
+ /// <param name="o">Other outpoint.</param>
+ /// <returns>Result of comparison.</returns>
+ public int CompareTo(COutPoint o)
+ {
+ if (n > o.n)
+ {
+ return 1;
+ }
+ else if (n < o.n)
+ {
+ return -1;
+ }
+
+ return 0;
+
+ }
+
+ /// <summary>
+ /// Equality comparer for outpoints.
+ /// </summary>
+ /// <param name="o">Other outpoint.</param>
+ /// <returns>Result of comparison.</returns>
+ public bool Equals(COutPoint o)
+ {
+ if (object.ReferenceEquals(o, null))
+ {
+ return false;
+ }
+
+ return (o.n == n) && (o.hash == hash);
+ }
+
+ /// <summary>
+ /// Equality comparer for outpoints.
+ /// </summary>
+ /// <param name="x">First outpoint.</param>
+ /// <param name="y">Second outpoint.</param>
+ /// <returns>Result of comparison.</returns>
+ public bool Equals(COutPoint x, COutPoint y)
+ {
+ return (x.n == y.n) && (x.hash == y.hash);
+ }
+
+ public override int GetHashCode()
+ {
+ return n.GetHashCode() ^ hash.GetHashCode();
+ }
+
+ public int GetHashCode(COutPoint obj)
+ {
+ return obj.GetHashCode();
+ }
}
}