Ejemplo n.º 1
0
 public void ReplaceChainElement(int indexOfChainEntry, T newElement)
 {
     _chain[indexOfChainEntry] =
         new ListChainElement
     {
         Element              = newElement,
         NextElementIndex     = _chain[indexOfChainEntry].NextElementIndex,
         PreviousElementIndex = _chain[indexOfChainEntry].PreviousElementIndex
     };
 }
Ejemplo n.º 2
0
        public bool RemoveChainElement(int number, int indexOfChainEntry)
        {
            // returns true, if indexOfChainEntry is the only element in the chain.
            _freedChainIndexes.Push(indexOfChainEntry);

            var chainElement = _chain[indexOfChainEntry];

            if (chainElement.PreviousElementIndex == -1 && chainElement.NextElementIndex == -1)
            {
                // this is the only element
                _firstChainElementOfChainNumber[number] = -1;
                _lastChainElementOfChainNumber[number]  = -1;
                return(true);
            }

            var indexOfNextChainElement     = chainElement.NextElementIndex;
            var indexOfPreviousChainElement = chainElement.PreviousElementIndex;

            if (indexOfNextChainElement != -1)
            {
                // the current element has a successor
                _chain[indexOfNextChainElement] =
                    new ListChainElement
                {
                    Element              = _chain[indexOfNextChainElement].Element,
                    NextElementIndex     = _chain[indexOfNextChainElement].NextElementIndex,
                    PreviousElementIndex = indexOfPreviousChainElement
                };
            }
            else
            {
                //removed the last element
                _lastChainElementOfChainNumber[number] = indexOfPreviousChainElement;
            }

            if (indexOfPreviousChainElement != -1)
            {
                // the current element has a predecessor
                _chain[indexOfPreviousChainElement] =
                    new ListChainElement
                {
                    Element              = _chain[indexOfPreviousChainElement].Element,
                    NextElementIndex     = indexOfNextChainElement,
                    PreviousElementIndex = _chain[indexOfPreviousChainElement].PreviousElementIndex
                };
            }
            else
            {
                //removed the first element
                _firstChainElementOfChainNumber[number] = indexOfNextChainElement;
            }
            return(false);
        }
Ejemplo n.º 3
0
        public void StartChain(int indexOfNewChainEntry, int number, T newElement)
        {
            Assert.That(_firstChainElementOfChainNumber[number] == -1, "Chain should be empty");

            _firstChainElementOfChainNumber[number] = indexOfNewChainEntry;
            _lastChainElementOfChainNumber[number]  = indexOfNewChainEntry;

            _chain[indexOfNewChainEntry] =
                new ListChainElement
            {
                Element              = newElement,
                NextElementIndex     = -1,
                PreviousElementIndex = -1
            };
        }
Ejemplo n.º 4
0
        public void RemoveSuccessors(int number, int indexOfChainEntryToKeep)
        {
            Assert.That(indexOfChainEntryToKeep != -1, "ChainElement must exist");

            var indexOfChainEntryToDelete = _chain[indexOfChainEntryToKeep].NextElementIndex;

            _lastChainElementOfChainNumber[number] = indexOfChainEntryToKeep;
            _chain[indexOfChainEntryToKeep]        =
                new ListChainElement
            {
                Element              = _chain[indexOfChainEntryToKeep].Element,
                NextElementIndex     = -1,
                PreviousElementIndex = _chain[indexOfChainEntryToKeep].PreviousElementIndex
            };

            while (indexOfChainEntryToDelete != -1)
            {
                _freedChainIndexes.Push(indexOfChainEntryToDelete);
                indexOfChainEntryToDelete = _chain[indexOfChainEntryToDelete].NextElementIndex;
            }
        }
Ejemplo n.º 5
0
        public void InsertChainElement(int indexOfNewChainEntry, int number, int indexOfPreviousChainElement, T newElement)
        {
            var previousNextElement     = _chain[indexOfPreviousChainElement].NextElementIndex;
            var previousPreviousElement = _chain[indexOfPreviousChainElement].PreviousElementIndex;

            _chain[indexOfNewChainEntry] =
                new ListChainElement
            {
                Element              = newElement,
                NextElementIndex     = previousNextElement,
                PreviousElementIndex = indexOfPreviousChainElement
            };

            _chain[indexOfPreviousChainElement] =
                new ListChainElement
            {
                Element              = _chain[indexOfPreviousChainElement].Element,
                NextElementIndex     = indexOfNewChainEntry,
                PreviousElementIndex = previousPreviousElement
            };

            if (previousNextElement == -1)
            {
                _lastChainElementOfChainNumber[number] = indexOfNewChainEntry;
            }
            else
            {
                _chain[previousNextElement] =
                    new ListChainElement
                {
                    Element              = _chain[previousNextElement].Element,
                    NextElementIndex     = _chain[previousNextElement].NextElementIndex,
                    PreviousElementIndex = indexOfNewChainEntry
                };
            }
        }