Implemented store and load methods
This commit is contained in:
		
							parent
							
								
									42b7d4349d
								
							
						
					
					
						commit
						0d6c719148
					
				@ -1,5 +1,8 @@
 | 
				
			|||||||
using System;
 | 
					using System;
 | 
				
			||||||
using System.Collections.Generic;
 | 
					using System.Collections.Generic;
 | 
				
			||||||
 | 
					using System.IO;
 | 
				
			||||||
 | 
					using System.Runtime.Serialization;
 | 
				
			||||||
 | 
					using System.Runtime.Serialization.Formatters.Binary;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Exa
 | 
					namespace Exa
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -8,7 +11,8 @@ namespace Exa
 | 
				
			|||||||
    /// to 4.6 quintillion (4,607,183,514,018,780,000) or 4.6 exa elements. 
 | 
					    /// to 4.6 quintillion (4,607,183,514,018,780,000) or 4.6 exa elements. 
 | 
				
			||||||
    /// </summary>
 | 
					    /// </summary>
 | 
				
			||||||
    /// <typeparam name="T">The desired type to use, e.g. byte, int, etc.</typeparam>
 | 
					    /// <typeparam name="T">The desired type to use, e.g. byte, int, etc.</typeparam>
 | 
				
			||||||
    public sealed partial class ExaArray1D<T>
 | 
					    [Serializable]
 | 
				
			||||||
 | 
					    public sealed partial class ExaArray1D<T> : ISerializable
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// Unfortunately, this seems to be the maximal number of entries an
 | 
					        /// Unfortunately, this seems to be the maximal number of entries an
 | 
				
			||||||
@ -218,5 +222,64 @@ namespace Exa
 | 
				
			|||||||
            for (ulong n = 0; n < this.Length; n++)
 | 
					            for (ulong n = 0; n < this.Length; n++)
 | 
				
			||||||
                yield return this[n];
 | 
					                yield return this[n];
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #region Store and load
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Stores the exa array into a stream.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <remarks>
 | 
				
			||||||
 | 
					        /// This method does not dispose the stream.
 | 
				
			||||||
 | 
					        /// </remarks>
 | 
				
			||||||
 | 
					        public void Store(Stream outputStream)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var formatter = new BinaryFormatter();
 | 
				
			||||||
 | 
					            formatter.Serialize(outputStream, this);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// Restores an exa array from the given stream.
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <remarks>
 | 
				
			||||||
 | 
					        /// This method does not dispose the stream.
 | 
				
			||||||
 | 
					        /// </remarks>
 | 
				
			||||||
 | 
					        public static ExaArray1D<T> Restore(Stream inputStream)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var formatter = new BinaryFormatter();
 | 
				
			||||||
 | 
					            return formatter.Deserialize(inputStream) as ExaArray1D<T>;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #region Serialization
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// This method serves for the serialization process. Do not call it manually. 
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        public void GetObjectData(SerializationInfo info, StreamingContext context)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            info.AddValue("version", "v1");
 | 
				
			||||||
 | 
					            info.AddValue("strategy", this.OptimizationStrategy, typeof(Strategy));
 | 
				
			||||||
 | 
					            info.AddValue("length", this.Length);
 | 
				
			||||||
 | 
					            info.AddValue("chunks", this.chunks, typeof(T[][]));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        private ExaArray1D(SerializationInfo info, StreamingContext context)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            switch (info.GetString("version"))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                case "v1":
 | 
				
			||||||
 | 
					                    this.Length = info.GetUInt64("length");
 | 
				
			||||||
 | 
					                    this.chunks = info.GetValue("chunks", typeof(T[][])) as T[][];
 | 
				
			||||||
 | 
					                    this.OptimizationStrategy = (Strategy) info.GetValue("strategy", typeof(Strategy));
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            this.chunks[0] ??= new T[0];
 | 
				
			||||||
 | 
					            this.maxElements = this.OptimizationStrategy == Strategy.MAX_PERFORMANCE ? MAX_NUMBER_ELEMENTS_PERFORMANCE : MAX_NUMBER_ELEMENTS;
 | 
				
			||||||
 | 
					            this.maxArrayCapacity = this.OptimizationStrategy == Strategy.MAX_PERFORMANCE ? MAX_CAPACITY_ARRAY_PERFORMANCE : MAX_CAPACITY_ARRAY;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        #endregion
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -2,6 +2,7 @@ using System;
 | 
				
			|||||||
using System.Collections.Generic;
 | 
					using System.Collections.Generic;
 | 
				
			||||||
using System.Diagnostics;
 | 
					using System.Diagnostics;
 | 
				
			||||||
using System.Diagnostics.CodeAnalysis;
 | 
					using System.Diagnostics.CodeAnalysis;
 | 
				
			||||||
 | 
					using System.IO;
 | 
				
			||||||
using System.Linq;
 | 
					using System.Linq;
 | 
				
			||||||
using System.Threading.Tasks;
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
using Exa;
 | 
					using Exa;
 | 
				
			||||||
@ -12,6 +13,7 @@ namespace ExaArrayTests
 | 
				
			|||||||
    [ExcludeFromCodeCoverage]
 | 
					    [ExcludeFromCodeCoverage]
 | 
				
			||||||
    public class ExaArray1DTests
 | 
					    public class ExaArray1DTests
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        [Serializable]
 | 
				
			||||||
        private class TestClass
 | 
					        private class TestClass
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            public int Age { get; set; }
 | 
					            public int Age { get; set; }
 | 
				
			||||||
@ -734,5 +736,62 @@ namespace ExaArrayTests
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            TestContext.WriteLine($"Performing 100M assignments took {t2Times.Average()} ms (average) by means of the max. performance strategy (min={t2Times.Min()} ms, max={t2Times.Max()} ms)");
 | 
					            TestContext.WriteLine($"Performing 100M assignments took {t2Times.Average()} ms (average) by means of the max. performance strategy (min={t2Times.Min()} ms, max={t2Times.Max()} ms)");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        [Test]
 | 
				
			||||||
 | 
					        [Category("cover")]
 | 
				
			||||||
 | 
					        [Category("normal")]
 | 
				
			||||||
 | 
					        public void StoreAndLoad01()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var exaA = new ExaArray1D<byte>();
 | 
				
			||||||
 | 
					            exaA.Extend(5_000_000);
 | 
				
			||||||
 | 
					            exaA[4_483_124] = 0xff;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var filename = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
 | 
				
			||||||
 | 
					            using (var file = File.OpenWrite(filename))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                exaA.Store(file);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            using (var file = File.OpenRead(filename))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var exaB = ExaArray1D<byte>.Restore(file);
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                Assert.That(exaA.Length, Is.EqualTo(exaB.Length));
 | 
				
			||||||
 | 
					                Assert.That(exaA[4_483_124], Is.EqualTo(0xff));
 | 
				
			||||||
 | 
					                Assert.That(exaB[4_483_124], Is.EqualTo(0xff));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            File.Delete(filename);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        [Test]
 | 
				
			||||||
 | 
					        [Category("cover")]
 | 
				
			||||||
 | 
					        [Category("normal")]
 | 
				
			||||||
 | 
					        public void StoreAndLoad02()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var exaA = new ExaArray1D<TestClass>();
 | 
				
			||||||
 | 
					            exaA.Extend(100);
 | 
				
			||||||
 | 
					            exaA[66] = new TestClass
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Age = 55,
 | 
				
			||||||
 | 
					            };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var filename = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
 | 
				
			||||||
 | 
					            using (var file = File.OpenWrite(filename))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                exaA.Store(file);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            using (var file = File.OpenRead(filename))
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                var exaB = ExaArray1D<TestClass>.Restore(file);
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
 | 
					                Assert.That(exaA.Length, Is.EqualTo(exaB.Length));
 | 
				
			||||||
 | 
					                Assert.That(exaA[66].Age, Is.EqualTo(55));
 | 
				
			||||||
 | 
					                Assert.That(exaB[66].Age, Is.EqualTo(55));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            File.Delete(filename);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user