Skip to content

Commit

Permalink
refactor how list are serialized/unserialized
Browse files Browse the repository at this point in the history
  • Loading branch information
NicolasDorier committed Nov 9, 2014
1 parent e661509 commit b4f313a
Show file tree
Hide file tree
Showing 5 changed files with 137 additions and 50 deletions.
107 changes: 84 additions & 23 deletions NBitcoin/BitcoinStream.Partial.cs
Original file line number Diff line number Diff line change
Expand Up @@ -176,75 +176,136 @@ private void ReadWriteArray(ref int[] data)



private void ReadWriteList<T>(ref List<T> data) where T : IBitcoinSerializable
{
var dataArray = data.ToArray();
ReadWriteArray(ref dataArray);
if(!Serializing)
data = dataArray.ToList();
}


private void ReadWriteList(ref List<ulong> data)
{
var dataArray = data.ToArray();
var dataArray = data == null ? null : data.ToArray();
if(Serializing && dataArray == null)
{
dataArray = new ulong[0];
}
ReadWriteArray(ref dataArray);
if(!Serializing)
data = dataArray.ToList();
{
if(data == null)
data = new List<ulong>();
else
data.Clear();
data.AddRange(dataArray);
}
}


private void ReadWriteList(ref List<ushort> data)
{
var dataArray = data.ToArray();
var dataArray = data == null ? null : data.ToArray();
if(Serializing && dataArray == null)
{
dataArray = new ushort[0];
}
ReadWriteArray(ref dataArray);
if(!Serializing)
data = dataArray.ToList();
{
if(data == null)
data = new List<ushort>();
else
data.Clear();
data.AddRange(dataArray);
}
}


private void ReadWriteList(ref List<uint> data)
{
var dataArray = data.ToArray();
var dataArray = data == null ? null : data.ToArray();
if(Serializing && dataArray == null)
{
dataArray = new uint[0];
}
ReadWriteArray(ref dataArray);
if(!Serializing)
data = dataArray.ToList();
{
if(data == null)
data = new List<uint>();
else
data.Clear();
data.AddRange(dataArray);
}
}


private void ReadWriteList(ref List<byte> data)
{
var dataArray = data.ToArray();
var dataArray = data == null ? null : data.ToArray();
if(Serializing && dataArray == null)
{
dataArray = new byte[0];
}
ReadWriteArray(ref dataArray);
if(!Serializing)
data = dataArray.ToList();
{
if(data == null)
data = new List<byte>();
else
data.Clear();
data.AddRange(dataArray);
}
}


private void ReadWriteList(ref List<long> data)
{
var dataArray = data.ToArray();
var dataArray = data == null ? null : data.ToArray();
if(Serializing && dataArray == null)
{
dataArray = new long[0];
}
ReadWriteArray(ref dataArray);
if(!Serializing)
data = dataArray.ToList();
{
if(data == null)
data = new List<long>();
else
data.Clear();
data.AddRange(dataArray);
}
}


private void ReadWriteList(ref List<short> data)
{
var dataArray = data.ToArray();
var dataArray = data == null ? null : data.ToArray();
if(Serializing && dataArray == null)
{
dataArray = new short[0];
}
ReadWriteArray(ref dataArray);
if(!Serializing)
data = dataArray.ToList();
{
if(data == null)
data = new List<short>();
else
data.Clear();
data.AddRange(dataArray);
}
}


private void ReadWriteList(ref List<int> data)
{
var dataArray = data.ToArray();
var dataArray = data == null ? null : data.ToArray();
if(Serializing && dataArray == null)
{
dataArray = new int[0];
}
ReadWriteArray(ref dataArray);
if(!Serializing)
data = dataArray.ToList();
{
if(data == null)
data = new List<int>();
else
data.Clear();
data.AddRange(dataArray);
}
}


Expand Down
33 changes: 21 additions & 12 deletions NBitcoin/BitcoinStream.Partial.tt
Original file line number Diff line number Diff line change
Expand Up @@ -53,24 +53,33 @@ namespace NBitcoin
<# } #>


<# foreach(String signature in new string[]
<# foreach(String type in new string[]
{
"<T>(ref List<T> data) where T : IBitcoinSerializable",
"(ref List<ulong> data)",
"(ref List<ushort> data)",
"(ref List<uint> data)",
"(ref List<byte> data)",
"(ref List<long> data)",
"(ref List<short> data)",
"(ref List<int> data)",
"ulong",
"ushort",
"uint",
"byte",
"long",
"short",
"int"
}){ #>

private void ReadWriteList<#= signature #>
private void ReadWriteList(ref List<<#= type #>> data)
{
var dataArray = data.ToArray();
var dataArray = data == null ? null : data.ToArray();
if(Serializing && dataArray == null)
{
dataArray = new <#= type #>[0];
}
ReadWriteArray(ref dataArray);
if(!Serializing)
data = dataArray.ToList();
{
if(data == null)
data = new List<<#= type #>>();
else
data.Clear();
data.AddRange(dataArray);
}
}

<# } #>
Expand Down
30 changes: 29 additions & 1 deletion NBitcoin/BitcoinStream.cs
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,36 @@ public void ReadWrite(ref bool data)

public void ReadWrite<T>(ref List<T> list) where T : IBitcoinSerializable, new()
{
ReadWriteList<T>(ref list);
ReadWriteList<List<T>, T>(ref list);
}

public void ReadWrite<TList, TItem>(ref TList list)
where TList : List<TItem>, new()
where TItem : IBitcoinSerializable, new()
{
ReadWriteList<TList, TItem>(ref list);
}

private void ReadWriteList<TList, TItem>(ref TList data)
where TList : List<TItem>, new()
where TItem : IBitcoinSerializable, new()
{
var dataArray = data == null ? null : data.ToArray();
if(Serializing && dataArray == null)
{
dataArray = new TItem[0];
}
ReadWriteArray(ref dataArray);
if(!Serializing)
{
if(data == null)
data = new TList();
else
data.Clear();
data.AddRange(dataArray);
}
}

public void ReadWrite(ref byte[] arr)
{
ReadWriteBytes(ref arr);
Expand Down
4 changes: 2 additions & 2 deletions NBitcoin/Transaction.cs
Original file line number Diff line number Diff line change
Expand Up @@ -743,8 +743,8 @@ public TxOutList Outputs
public void ReadWrite(BitcoinStream stream)
{
stream.ReadWrite(ref nVersion);
stream.ReadWrite(ref vin);
stream.ReadWrite(ref vout);
stream.ReadWrite<TxInList,TxIn>(ref vin);
stream.ReadWrite<TxOutList, TxOut>(ref vout);
stream.ReadWriteStruct(ref nLockTime);
}

Expand Down
13 changes: 1 addition & 12 deletions NBitcoin/UnsignedList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

namespace NBitcoin
{
public class UnsignedList<T>: List<T>, IBitcoinSerializable
public class UnsignedList<T>: List<T>
where T: IBitcoinSerializable, new()
{
public UnsignedList()
Expand All @@ -28,16 +28,5 @@ public UnsignedList(int capacity)
get { return base[(int)index]; }
set { base[(int)index] = value; }
}

public void ReadWrite(BitcoinStream stream)
{
var dataArray = this.ToArray();
stream.ReadWrite(ref dataArray);
if (!stream.Serializing)
{
this.Clear();
this.AddRange(dataArray);
}
}
}
}

0 comments on commit b4f313a

Please sign in to comment.