Пример #1
0
        public void Add(IRelevantObject relevantObject, bool propagate = true)
        {
            // Don't add if this layer is over the max
            if (Objects.GetCount() > ParentCollection.MaxObjects)
            {
                relevantObject.Dispose();
                return;
            }

            var previousCollection = GetAllPreviousLayersCollection();

            if (Objects.FindSimilar(relevantObject, ParentCollection.AcceptableDifference, out var similarObject))
            {
                // Consume object
                similarObject.Consume(relevantObject);
                // Dispose this relevant object
                relevantObject.Dispose();
                // Set DoNotDispose for the GenerateNewObjects method
                if (!similarObject.DoNotDispose && !similarObject.DefinitelyDispose && previousCollection.FindSimilar(similarObject, ParentCollection.AcceptableDifference, out _))
                {
                    similarObject.DefinitelyDispose = true;
                }
                else
                {
                    similarObject.DoNotDispose = true;
                }
                return;  // return so the relevant object doesn't get added
            }

            if (previousCollection != null && previousCollection.FindSimilar(relevantObject, ParentCollection.AcceptableDifference, out _))
            {
                // Don't consume because that causes inheritance issues
                // Dispose this relevant object
                relevantObject.Dispose();
                return;  // return so the relevant object doesn't get added
            }

            // Set DoNotDispose for the GenerateNewObjects method
            relevantObject.DoNotDispose = true;

            // Insert the new object
            Objects.SortedInsert(relevantObject);

            // Set layer variable in object
            relevantObject.Layer = this;

            // Propagate changes
            if (!propagate || NextLayer == null)
            {
                return;
            }
            NextLayer.GenerateNewObjects();
        }