Example #1
0
        // Public
        #region Constructors

        public MutableObjectClusterTable(IEnumerable <int> clusterAddresses, int elementSize, Func <int, ArrayCluster <T> > clusterFactory)
        {
            _clusterAddresses = clusterAddresses.ToList();

            _elementSize        = elementSize;
            _elementsPerCluster = ArrayCluster.CalculateElementCount(elementSize + sizeof(bool));

            _isModified             = new List <bool>(_elementsPerCluster * _clusterAddresses.Count);
            _notifyChangedDelegates = new List <ChangedEventHandler>(_elementsPerCluster * _clusterAddresses.Count);

            _elements = new List <T>(_elementsPerCluster * _clusterAddresses.Count);

            for (int i = 0; i < _elementsPerCluster * _clusterAddresses.Count; i++)
            {
                _elements.Add(default(T));
            }

            for (int i = 0; i < _clusterAddresses.Count; i++)
            {
                _isModified.Add(true);
                int clusterLogicalNumber = i;
                _notifyChangedDelegates.Add((sender) => { _isModified[clusterLogicalNumber] = true; });
            }

            _clusterFactory = clusterFactory;
        }
Example #2
0
 public void Load(IClusterIO io)
 {
     for (int i = 0; i < _clusterAddresses.Count; i++)
     {
         ArrayCluster <T> c = _clusterFactory(_clusterAddresses[i]);
         io.Load(c);
         for (int j = 0; j < _elementsPerCluster; j++)
         {
             int index = i * _elementsPerCluster + j;
             _elements[index] = c[j];
         }
         _isModified[i] = false;
     }
 }
Example #3
0
 public void Flush(IClusterIO io)
 {
     for (int i = 0; i < _clusterAddresses.Count; i++)
     {
         if (_isModified[i])
         {
             ArrayCluster <T> c = _clusterFactory(_clusterAddresses[i]);
             c.NextClusterAddress = (i == _clusterAddresses.Count - 1) ? Constants.NoAddress : _clusterAddresses[i + 1];
             for (int j = 0; j < _elementsPerCluster; j++)
             {
                 c[j] = _elements[i * _elementsPerCluster + j];
             }
             io.Save(c);
             _isModified[i] = false;
         }
     }
 }
Example #4
0
        public void Load(IClusterIO io)
        {
            for (int i = 0; i < _clusterAddresses.Count; i++)
            {
                ArrayCluster <T> c = _clusterFactory(_clusterAddresses[i]);
                io.Load(c);
                for (int j = 0; j < _elementsPerCluster; j++)
                {
                    int index = i * _elementsPerCluster + j;

                    if (_elements[index] != null)
                    {
                        _elements[index].Changed -= _notifyChangedDelegates[i];
                    }
                    _elements[index] = c[j];
                    if (_elements[index] != null)
                    {
                        _elements[index].Changed += _notifyChangedDelegates[i];
                    }
                }
                _isModified[i] = false;
            }
        }
Example #5
0
        // Public
        #region Constructors

        public ClusterTable(IEnumerable <int> clusterAddresses, int elementSize, Func <int, ArrayCluster <T> > clusterFactory)
        {
            _clusterAddresses = clusterAddresses.ToList();

            _elementSize        = elementSize;
            _elementsPerCluster = ArrayCluster.CalculateElementCount(elementSize);

            _isModified = new List <bool>(_elementsPerCluster * _clusterAddresses.Count);

            _elements = new List <T>(_elementsPerCluster * _clusterAddresses.Count);

            for (int i = 0; i < _elementsPerCluster * _clusterAddresses.Count; i++)
            {
                _elements.Add(default(T));
            }

            for (int i = 0; i < _clusterAddresses.Count; i++)
            {
                _isModified.Add(true);
                int clusterLogicalNumber = i;
            }

            _clusterFactory = clusterFactory;
        }
Example #6
0
        public void IntClusterTableTest()
        {
            ConfigurationTest.Initialize();

            using (var io = ConfigurationTest.CreateMemoryIO()) {
                SimpleClusterIO cio = new SimpleClusterIO(io);

                Random r = new Random();

                ClusterTable <int> ct = new ClusterTable <int>(
                    new int[] { 2, 4 },
                    sizeof(int),
                    (address) => new IntArrayCluster(address)
                {
                    Type = ClusterType.BytesUsedTable
                });

                ClusterTable <int> ct2 = new ClusterTable <int>(
                    new int[] { 2, 4 },
                    sizeof(int),
                    (address) => new IntArrayCluster(address)
                {
                    Type = ClusterType.BytesUsedTable
                });

                ct.Flush(cio);
                ct2.Load(cio);

                // Check that the cluster is written and everything is zeroed

                DataBlock b      = new DataBlock(io.Bytes, 2 * Configuration.Geometry.BytesPerCluster, Configuration.Geometry.BytesPerCluster);
                int       offset = verifyProperties(b, ClusterType.BytesUsedTable, 4);
                for (int i = 0; i < ArrayCluster.CalculateElementCount(sizeof(int)); i++)
                {
                    Assert.AreEqual(b.ToInt32(offset + i * sizeof(int)), 0);
                }

                b      = new DataBlock(io.Bytes, 4 * Configuration.Geometry.BytesPerCluster, Configuration.Geometry.BytesPerCluster);
                offset = verifyProperties(b, ClusterType.BytesUsedTable, Constants.NoAddress);
                for (int i = 0; i < ArrayCluster.CalculateElementCount(sizeof(int)); i++)
                {
                    Assert.AreEqual(b.ToInt32(offset + i * sizeof(int)), 0);
                }

                for (int i = 0; i < ct2.Count; i++)
                {
                    Assert.AreEqual(ct2[i], 0);
                }

                // Now randomize the contents
                for (int i = 0; i < ct.Count; i++)
                {
                    ct[i] = r.Next();
                }
                ct.Flush(cio);

                b      = new DataBlock(io.Bytes, 2 * Configuration.Geometry.BytesPerCluster, Configuration.Geometry.BytesPerCluster);
                offset = verifyProperties(b, ClusterType.BytesUsedTable, 4);
                int index = 0;
                for (int i = 0; i < ArrayCluster.CalculateElementCount(sizeof(int)); i++, index++)
                {
                    Assert.AreEqual(b.ToInt32(offset + i * sizeof(int)), ct[index]);
                }

                b      = new DataBlock(io.Bytes, 4 * Configuration.Geometry.BytesPerCluster, Configuration.Geometry.BytesPerCluster);
                offset = verifyProperties(b, ClusterType.BytesUsedTable, Constants.NoAddress);
                for (int i = 0; i < ArrayCluster.CalculateElementCount(sizeof(int)); i++, index++)
                {
                    Assert.AreEqual(b.ToInt32(offset + i * sizeof(int)), ct[index]);
                }

                ct2.Load(cio);
                for (int i = 0; i < ct2.Count; i++)
                {
                    Assert.AreEqual(ct2[i], ct[i]);
                }

                // Add a cluster
                ct.AddCluster(7);
                ct2.AddCluster(7);
                ct.Flush(cio);

                // Make sure that next cluster is updated
                b = new DataBlock(io.Bytes, 4 * Configuration.Geometry.BytesPerCluster, Configuration.Geometry.BytesPerCluster);
                verifyProperties(b, ClusterType.BytesUsedTable, 7);

                // check the new cluster and assure everything is zero
                b      = new DataBlock(io.Bytes, 7 * Configuration.Geometry.BytesPerCluster, Configuration.Geometry.BytesPerCluster);
                offset = verifyProperties(b, ClusterType.BytesUsedTable, Constants.NoAddress);
                for (int i = 0; i < ArrayCluster.CalculateElementCount(sizeof(int)); i++)
                {
                    Assert.AreEqual(b.ToInt32(offset + i * sizeof(int)), 0);
                }

                ct2.Load(cio);
                for (int i = 0; i < ct2.Count; i++)
                {
                    Assert.AreEqual(ct2[i], ct[i]);
                }

                Assert.AreEqual(ct2.Count, 3 * ArrayCluster.CalculateElementCount(sizeof(int)));

                // Remove a cluster
                ct.RemoveLastCluster();
                ct.Flush(cio);

                // Make sure that the last cluster is updated
                b = new DataBlock(io.Bytes, 4 * Configuration.Geometry.BytesPerCluster, Configuration.Geometry.BytesPerCluster);
                verifyProperties(b, ClusterType.BytesUsedTable, Constants.NoAddress);
            }
        }