private void Work() { var txoIn = TxoPack.Create(); var txoOut = TxoPack.Create(); // local array for capturing outpoints from inbox then sorting var outpoints = new Outpoint[Constants.MaxOutpointsCount]; // array of inbox messages headers var messageHeaders = new byte[Constants.MaxOutpointsCount][]; // array of inbox messages payloads // var payloads = new byte[MaxTxoCount][]; // not used in read request // provide index array for argsort var argsort = new int[Constants.MaxOutpointsCount]; int txoCount = 0; while (!_source.Token.IsCancellationRequested) { var message = _inbox.Peek(); if (message.Length > 0) { // parse current message and add txo to txopack var outpoint = Outpoint.CreateNaked( message.Slice(ClientServerMessage.PayloadStart, Outpoint.KeySizeInBytes)); outpoints[txoCount] = outpoint; messageHeaders[txoCount] = message.Slice(0, ClientServerMessage.PayloadStart).ToArray(); // payloads[messageCount] = message.Slice(ClientServerMessage.PayloadStart).ToArray(); // not used in read request argsort[txoCount] = txoCount; ++txoCount; Debug.Assert(txoCount <= Constants.MaxOutpointsCount, "MaxTxoCount reached when looping inbox messages."); _inbox.Next(message.Length); } else { // current round of inbox message picking is over Array.Sort(outpoints, argsort, 0, txoCount); // sort txopack ref var writer = ref txoIn.GetResetWriter(); // identify identical outpoint, and write querying txopack ref var previous = ref outpoints[argsort[0]]; writer.Write(in previous, ReadOnlySpan <byte> .Empty); for (ushort index = 1; index < txoCount; ++index) { ref var current = ref outpoints[argsort[index]]; if (previous != current) { previous = current; writer.Write(in previous, ReadOnlySpan <byte> .Empty); } }
public void AddWithoutMergeTest() { const int testSize = 5; var txoPack = MakeRandomTxoPack(testSize); var anotherTxoPack = MakeRandomTxoPack(testSize); var resultTxoPack = TxoPack.Create(2); txoPack.AddOrMerge(anotherTxoPack.GetForwardIterator(), resultTxoPack, null); // ensure number of outpoints Assert.True(testSize * 2 == resultTxoPack.Count, "Merged outpoints total number mismatch."); // ensure that merged TxoPack has sorted keys; var iter = resultTxoPack.GetForwardIterator(); ref var op = ref iter.Current;
/// <param name="config"></param> /// <param name="lineage"></param> /// <param name="store"></param> /// <param name="subTable"></param> public SozuTable(SozuConfig config, ILineage lineage, ISectorStore store, SozuTable subTable = null) { _config = config; _lineage = lineage; _store = store; _subTable = subTable; _residue = TxoPack.Create(); _rangeOutputs = TxoPack.Create(); _deserialized = TxoPack.Create(); _complement = TxoPack.Create(); _kept = TxoPack.Create(); _flowDown = TxoPack.Create(); _merged = TxoPack.Create(2); store.Initialize(); if (config.ImplicitSectors && !store.HasSectors()) { store.AllocateSectors(1 << config.SectorBitDepth); EnsurePersistence(); } }