Example #1
0
 public bool TrySerialize(TEnum element, Span <byte> output, out int actualSize)
 {
     return(serializer.TrySerialize(
                toFunc(element),
                output,
                out actualSize));
 }
Example #2
0
        public override DatabaseBuilder AddArray <T, TKey>(
            IConstSizeSerializer <T> serializer,
            Func <Database, IEnumerable <T> > elements,
            Func <T, TKey> selector,
            IComparer <TKey>?comparer)
        {
            try
            {
                var headerPosition = stream.Position;
                // write a dummy header
                var dummyHeaderBytes = new ArrayHeader(serializer).AsBytes();
                stream.Write(dummyHeaderBytes);
                var elementLength = serializer.ElementSize;
                Utility.EnsureArrayOfMinimalSize(ref buffer, elementLength);
                long elementCount       = 0;
                var  elementsEnumerable = elements(db);
                if (comparer != null)
                {
                    elementsEnumerable = elementsEnumerable.OrderBy(selector, comparer);
                }
                foreach (var element in elementsEnumerable)
                {
                    serializer.TrySerialize(element, buffer.AsSpan(), out _);
                    stream.Write(buffer, 0, elementLength);
                    elementCount++;
                }

                var pastEndPosition = stream.Position;
                stream.Seek(headerPosition, SeekOrigin.Begin);
                var arrayHeader = new ArrayHeader(serializer)
                {
                    OverallLength = elementLength * elementCount,
                    RecordCount   = elementCount,
                    StartsAt      = headerPosition + dummyHeaderBytes.Length,
                    EndsAt        = pastEndPosition,
                    Type          = 1
                };
                stream.Write(arrayHeader.AsBytes());
                stream.Seek(pastEndPosition, SeekOrigin.Begin);
                headers.Add(arrayHeader);
            }
            catch
            {
                stream.Dispose();
                db.Dispose();
                throw;
            }

            return(this);
        }