コード例 #1
0
        public void WriteValues <T>(Memory <T> memory)
        {
            var values      = memory.Span;
            var buffer      = _bufferOwner.Memory;
            var isPrimitive = PrimitiveTypes.Primitives.Contains(typeof(T));
            var sizeOfElem  = isPrimitive ? _sizing.SizeOf <T>() : 0;

            if (!isPrimitive) // no size check bc it's checked on write calls from cache
            {
                foreach (var value in values)
                {
                    BinaryCache <T> .WriteValue(this, value);
                }
                return;
            }

            var sizeOf = sizeOfElem * values.Length;

            if (Remaining < sizeOf)
            {
                throw new ArgumentOutOfRangeException(nameof(Remaining),
                                                      $"Not enough bytes remaining in the buffer to write {typeof(T).Name} array. " +
                                                      $"Position : {Position}, Length : {Count}, Remaining : {Remaining}, SizeOf : {sizeOf}.");
            }

            var offset = Position;

            for (var i = 0; i < values.Length; i++, offset += sizeOfElem)
            {
                var dst = buffer.Slice(offset, sizeOfElem);
                PrimitiveBinaryCache <T> .WriteValue(dst.Span, values[i]);
            }
            Advance(sizeOf);
        }
コード例 #2
0
        public void WriteValue <T>(T value)
        {
            var isPrimitive = PrimitiveTypes.Primitives.Contains(typeof(T));
            var sizeOf      = isPrimitive ? _sizing.SizeOf <T>() : _sizing.SizeOf(value);

            if (Remaining < sizeOf)
            {
                throw new ArgumentOutOfRangeException(nameof(Remaining),
                                                      $"Not enough bytes remaining in the buffer to write {typeof(T).Name}. " +
                                                      $"Position : {Position}, Length : {Count}, Remaining : {Remaining}, SizeOf : {sizeOf}.");
            }

            if (!isPrimitive)
            {
                BinaryCache <T> .WriteValue(this, value);

                return;
            }

            var dst = _bufferOwner.Memory.Slice(Position, sizeOf);

            PrimitiveBinaryCache <T> .WriteValue(dst.Span, value);

            Advance(sizeOf);
        }
コード例 #3
0
        public T[] ReadValues <T>(int count)
        {
            if (count == 0)
            {
                return(Array.Empty <T>());
            }

            var value = new T[count];

            if (!PrimitiveTypes.Primitives.Contains(typeof(T)))
            {
                for (var i = 0; i < count; i++)
                {
                    value[i] = BinaryCache <T> .ReadValue(this);
                }
                return(value);
            }

            var sizeOfElem  = PrimitiveBinaryCache <T> .SizeOf;
            var sizeOfArray = sizeOfElem * count;

            if (Remaining < sizeOfArray)
            {
                throw new ArgumentOutOfRangeException(nameof(Remaining),
                                                      $"Not enough bytes remaining in the buffer to read {typeof(T).Name} array with elements count : {count}. " +
                                                      $"Position : {Position}, Length : {Count}, Remaining : {Remaining}, SizeOf : {sizeOfArray}.");
            }

            var offset = Position;

            for (var i = 0; i < count; i++, offset += sizeOfElem)
            {
                var src = _buffer.Slice(offset, sizeOfElem);
                value[i] = PrimitiveBinaryCache <T> .ReadValue(src.Span);
            }

            Advance(sizeOfArray);
            return(value);
        }
コード例 #4
0
        public T ReadValue <T>()
        {
            if (!PrimitiveTypes.Primitives.Contains(typeof(T)))
            {
                return(BinaryCache <T> .ReadValue(this));
            }

            var sizeOfT = PrimitiveBinaryCache <T> .SizeOf;

            if (Remaining < sizeOfT)
            {
                throw new ArgumentOutOfRangeException(nameof(Remaining),
                                                      $"Not enough bytes remaining in the buffer to read {typeof(T).Name}. " +
                                                      $"Position : {Position}, Length : {Count}, Remaining : {Remaining}, SizeOf : {sizeOfT}.");
            }

            var src   = _buffer.Slice(Position, sizeOfT);
            var value = PrimitiveBinaryCache <T> .ReadValue(src.Span);

            Advance(sizeOfT);
            return(value);
        }