Exemplo n.º 1
0
        public async ValueTask <SignatureCollection <TRollingHashAlgorithm, TStrongHashAlgorithm> > ReadSignatures
        <TRollingHashAlgorithm, TStrongHashAlgorithm>
            (SignatureOptions options,
            CancellationToken ct)
            where TRollingHashAlgorithm : struct, IRollingHashAlgorithm
            where TStrongHashAlgorithm : IStrongHashAlgorithm
        {
            var       signatures    = new SignatureCollection <TRollingHashAlgorithm, TStrongHashAlgorithm>();
            const int maxSignatures = 1 << 22;

            for (int i = 0; i < maxSignatures; i++)
            {
                var sig = await _reader.Read
                          <BlockSignature <TRollingHashAlgorithm, TStrongHashAlgorithm>, SignatureOptions>
                              (options, ct).ConfigureAwait(false);

                if (!sig.HasValue)
                {
                    _reader.Complete();
                    return(signatures);
                }
                long start = options.BlockLength * i;
#if !NETSTANDARD2_0
                signatures.TryAdd(sig.Value, (ulong)start);
#else
                if (!signatures.ContainsKey(sig.Value))
                {
                    signatures.Add(sig.Value, (ulong)start);
                }
#endif
            }
            throw new FormatException($"too many signatures");
        }