예제 #1
0
        /// <summary>
        /// Reads the content of the BitFieldArray using the supplied reader
        /// </summary>
        /// <param name="reader"></param>
        public void Read(BinaryReader reader)
        {
            NumBits = reader.ReadInt32();

            if (NumBits == 0)
            {
                return;
            }

            AllocateBuffer();

            var bufferSize = NumStorageElements() * sizeof(ulong);

            byte[] buffer = GenericArrayPoolCacheHelper <byte> .Caches().Rent(bufferSize);

            try
            {
                reader.Read(buffer, 0, bufferSize);
                Buffer.BlockCopy(buffer, 0, Storage, 0, bufferSize);
            }
            finally
            {
                GenericArrayPoolCacheHelper <byte> .Caches().Return(ref buffer);
            }
        }
예제 #2
0
            public void GenericArrayPool_T_RentAndReturn_SingleItem()
            {
                for (int i = 0; i < 20; i++)
                {
                    byte[] b = GenericArrayPoolCacheHelper <byte> .Caches().Rent(1 << i + 1);

                    GenericArrayPoolCacheHelper <byte> .Caches().Return(ref b);
                }
            }
예제 #3
0
 public void Dispose()
 {
     if (!_disposed)
     {
         if (Storage != null)
         {
             GenericArrayPoolCacheHelper <ulong> .Caches().Return(ref Storage);
         }
         _disposed = true;
     }
 }
예제 #4
0
            public void GlobalSetup()
            {
                _arrayPool = ArrayPool <byte> .Shared;

                DIBuilder.New().AddLogging()
                .Add(x => x.AddSingleton <IGenericArrayPoolCaches <byte> >(new GenericArrayPoolCaches <byte>())).Build()
                .Complete();

                _genericArrayPoolIntf = GenericArrayPoolCacheHelper <byte> .Caches();

                _genericArrayPoolObj = GenericArrayPoolCacheHelper <byte> .Caches() as GenericArrayPoolCaches <byte>;
            }
예제 #5
0
            public void GenericArrayPool_T_RentAndReturn_MultipleItems()
            {
                for (int i = 0; i < 20; i++)
                {
                    byte[] b1 = GenericArrayPoolCacheHelper <byte> .Caches().Rent(1 << i + 1);

                    byte[] b2 = GenericArrayPoolCacheHelper <byte> .Caches().Rent(1 << i + 1);

                    GenericArrayPoolCacheHelper <byte> .Caches().Return(ref b1);

                    GenericArrayPoolCacheHelper <byte> .Caches().Return(ref b2);
                }
            }
예제 #6
0
        public void Read(BinaryReader reader)
        {
            segmentPassCount = reader.ReadInt32();

            var passCountBuffer = GenericArrayPoolCacheHelper <long> .Caches().Rent(SubGridTreeConsts.CellsPerSubGrid);

            try
            {
                var fieldDescriptor = new EncodedBitFieldDescriptor();
                fieldDescriptor.Read(reader);

                using (var bfa = new BitFieldArray())
                {
                    bfa.Read(reader);
                    int bitLocation = 0;
                    bfa.ReadBitFieldVector(ref bitLocation, fieldDescriptor, SubGridTreeConsts.CellsPerSubGrid, passCountBuffer);
                }

                var counter = 0;

                for (var i = 0; i < SubGridTreeConsts.SubGridTreeDimension; i++)
                {
                    for (var j = 0; j < SubGridTreeConsts.SubGridTreeDimension; j++)
                    {
                        var passCount = (int)passCountBuffer[counter++];

                        if (passCount > 0)
                        {
                            AllocatePasses(i, j, passCount);

                            _passData[i, j].Passes.Count = passCount;
                            var passes = _passData[i, j].Passes;
                            for (int cpi = passes.Offset, limit = passes.OffsetPlusCount; cpi < limit; cpi++)
                            {
                                passes.Elements[cpi].Read(reader);
                            }
                        }
                    }
                }
            }
            finally
            {
                GenericArrayPoolCacheHelper <long> .Caches().Return(ref passCountBuffer);
            }
        }
예제 #7
0
        /// <summary>
        /// Write the contents of the Items array using the supplied writer
        /// </summary>
        public override void Write(BinaryWriter writer)
        {
            base.Write(writer);

            const int BUFFER_SIZE = SubGridTreeConsts.SubGridTreeCellsPerSubGrid * sizeof(long);

            var buffer = GenericArrayPoolCacheHelper <byte> .Caches().Rent(BUFFER_SIZE);

            try
            {
                Buffer.BlockCopy(Times, 0, buffer, 0, BUFFER_SIZE);
                writer.Write(buffer, 0, BUFFER_SIZE);
            }
            finally
            {
                GenericArrayPoolCacheHelper <byte> .Caches().Return(ref buffer);
            }
        }
예제 #8
0
        /// <summary>
        /// Fill the items array by reading the binary representation using the provided reader.
        /// </summary>
        /// <param name="reader"></param>
        public override void Read(BinaryReader reader)
        {
            base.Read(reader);

            const int BUFFER_SIZE = SubGridTreeConsts.SubGridTreeCellsPerSubGrid * sizeof(long);

            var buffer = GenericArrayPoolCacheHelper <byte> .Caches().Rent(BUFFER_SIZE);

            try
            {
                reader.Read(buffer, 0, BUFFER_SIZE);
                Buffer.BlockCopy(buffer, 0, Times, 0, BUFFER_SIZE);
            }
            finally
            {
                GenericArrayPoolCacheHelper <byte> .Caches().Return(ref buffer);
            }
        }
예제 #9
0
        public int NumStorageElements() => MemorySize() % N_BYTES_TO_READ_AT_A_TIME == 0 ? MemorySize() / N_BYTES_TO_READ_AT_A_TIME : (MemorySize() / N_BYTES_TO_READ_AT_A_TIME) + 1; // FNumBits % N_BITS_TO_READ_AT_A_TIME == 0 ? FNumBits / N_BITS_TO_READ_AT_A_TIME : FNumBits / N_BITS_TO_READ_AT_A_TIME + 1;

        /// <summary>
        /// Allocates the storage array for storing the block that comprise the bit field array
        /// </summary>
        /// <returns></returns>
        private ulong[] NewStorage()
        {
            if (Storage != null)
            {
                GenericArrayPoolCacheHelper <ulong> .Caches().Return(ref Storage);
            }

            var numElements = NumStorageElements();
            var buffer      = GenericArrayPoolCacheHelper <ulong> .Caches().Rent(numElements);

            // Clear the buffer TODO: Move this logic to write side only
            for (int i = 0; i < numElements; i++)
            {
                buffer[i] = 0;
            }

            return(buffer);
        }
예제 #10
0
        /// <summary>
        /// Fill the items array by reading the binary representation using the provided reader.
        /// This is an unimplemented override; a generic BinaryReader based implementation is not provided.
        /// Override to implement if needed.
        /// </summary>
        /// <param name="reader"></param>
        public override void Read(BinaryReader reader)
        {
            base.Read(reader);

            const int bufferSize = SubGridTreeConsts.SubGridTreeCellsPerSubGrid * sizeof(ushort);

            var buffer = GenericArrayPoolCacheHelper <byte> .Caches().Rent(bufferSize);

            try
            {
                reader.Read(buffer, 0, bufferSize);
                Buffer.BlockCopy(buffer, 0, Cells, 0, bufferSize);
            }
            finally
            {
                GenericArrayPoolCacheHelper <byte> .Caches().Return(ref buffer);
            }
        }
예제 #11
0
        /// <summary>
        /// Write the contents of the Items array using the supplied writer
        /// This is an unimplemented override; a generic BinaryReader based implementation is not provided.
        /// Override to implement if needed.
        /// </summary>
        /// <param name="writer"></param>
        public override void Write(BinaryWriter writer)
        {
            base.Write(writer);

            const int bufferSize = SubGridTreeConsts.SubGridTreeCellsPerSubGrid * sizeof(ushort);

            var buffer = GenericArrayPoolCacheHelper <byte> .Caches().Rent(bufferSize);

            try
            {
                Buffer.BlockCopy(Cells, 0, buffer, 0, bufferSize);
                writer.Write(buffer, 0, bufferSize);
            }
            finally
            {
                GenericArrayPoolCacheHelper <byte> .Caches().Return(ref buffer);
            }
        }
예제 #12
0
        /// <summary>
        /// Add adds a value recorded at DateTime to the list. It is assumed
        /// that the date time of this item is after the date time
        /// of any previously added item in the list
        /// </summary>
        /// <param name="dateTime"></param>
        /// <param name="value"></param>
        public void Add(DateTime dateTime, T value)
        {
            if (dateTime.Kind != DateTimeKind.Utc)
            {
                throw new ArgumentException("Attribute time must be a UTC cell pass time", nameof(dateTime));
            }

            // If there are available entries to reuse, then reuse them...
            if (NumAttrs >= list.Length)
            {
                var newList = GenericArrayPoolCacheHelper <AccumulatedAttribute <T> > .Caches().Rent(list.Length + DEFAULT_ACCUMULATOR_LIST_SIZE_INCREMENT);

                Array.Copy(list, 0, newList, 0, list.Length);

                GenericArrayPoolCacheHelper <AccumulatedAttribute <T> > .Caches().Return(ref list);

                list = newList;
            }

            list[NumAttrs++].Set(dateTime, value);
        }
예제 #13
0
        /// <summary>
        /// Writes the content of the BitFieldArray using the supplied BinaryWriter
        /// </summary>
        /// <param name="writer"></param>
        public void Write(BinaryWriter writer)
        {
            writer.Write(NumBits);

            if (NumBits == 0)
            {
                return;
            }

            var bufferSize = NumStorageElements() * sizeof(ulong);

            byte[] buffer = GenericArrayPoolCacheHelper <byte> .Caches().Rent(bufferSize);

            try
            {
                Buffer.BlockCopy(Storage, 0, buffer, 0, bufferSize);
                writer.Write(buffer, 0, bufferSize);
            }
            finally
            {
                GenericArrayPoolCacheHelper <byte> .Caches().Return(ref buffer);
            }
        }
예제 #14
0
 public AccumulatedAttributes(int initialSize)
 {
     NumAttrs = 0;
     list     = GenericArrayPoolCacheHelper <AccumulatedAttribute <T> > .Caches().Rent(initialSize);
 }