Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
06/19/11 21:32:06 (13 years ago)
Author:
mkommend
Message:

#1559: Fixed memory leak in SymbolicExpressionGrammar.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Encodings.SymbolicExpressionTreeEncoding/3.4/SymbolicExpressionGrammar.cs

    r6233 r6443  
    2121
    2222using System;
     23using System.Linq;
    2324using HeuristicLab.Common;
    2425using HeuristicLab.Core;
    2526using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
     27using System.Collections.Generic;
    2628
    2729namespace HeuristicLab.Encodings.SymbolicExpressionTreeEncoding {
     
    111113    #endregion
    112114
     115    [StorableHook(HookType.AfterDeserialization)]
     116    private void AfterDeserialization() {
     117      foreach (ISymbol symbol in symbols.Values)
     118        RegisterSymbolEvents(symbol);
     119    }
    113120    [StorableConstructor]
    114121    protected SymbolicExpressionGrammar(bool deserializing) : base(deserializing) { }
    115122    protected SymbolicExpressionGrammar(SymbolicExpressionGrammar original, Cloner cloner)
    116123      : base(original, cloner) {
     124      foreach (ISymbol symbol in Symbols)
     125        RegisterSymbolEvents(symbol);
     126
    117127      programRootSymbol = cloner.Clone(original.programRootSymbol);
    118128      startSymbol = cloner.Clone(original.StartSymbol);
     
    153163    }
    154164
     165    protected override void AddSymbol(ISymbol symbol) {
     166      base.AddSymbol(symbol);
     167      RegisterSymbolEvents(symbol);
     168    }
     169    protected override void RemoveSymbol(ISymbol symbol) {
     170      DeregisterSymbolEvents(symbol);
     171      base.RemoveSymbol(symbol);
     172    }
     173
    155174    public event EventHandler ReadOnlyChanged;
    156175    protected virtual void OnReadOnlyChanged() {
     
    166185    }
    167186    #endregion
     187
     188    #region symbol events
     189    protected virtual void RegisterSymbolEvents(ISymbol symbol) {
     190      symbol.NameChanging += new EventHandler<CancelEventArgs<string>>(Symbol_NameChanging);
     191      symbol.NameChanged += new EventHandler(Symbol_NameChanged);
     192    }
     193    protected virtual void DeregisterSymbolEvents(ISymbol symbol) {
     194      symbol.NameChanging -= new EventHandler<CancelEventArgs<string>>(Symbol_NameChanging);
     195      symbol.NameChanged -= new EventHandler(Symbol_NameChanged);
     196    }
     197
     198    private void Symbol_NameChanging(object sender, CancelEventArgs<string> e) {
     199      if (symbols.ContainsKey(e.Value)) e.Cancel = true;
     200    }
     201    private void Symbol_NameChanged(object sender, EventArgs e) {
     202      ISymbol symbol = (ISymbol)sender;
     203      string oldName = symbols.Where(x => x.Value == symbol).First().Key;
     204      string newName = symbol.Name;
     205
     206      symbols.Remove(oldName);
     207      symbols.Add(newName, symbol);
     208
     209      var subtreeCount = symbolSubtreeCount[oldName];
     210      symbolSubtreeCount.Remove(oldName);
     211      symbolSubtreeCount.Add(newName, subtreeCount);
     212
     213      List<string> allowedChilds;
     214      if (allowedChildSymbols.TryGetValue(oldName, out allowedChilds)) {
     215        allowedChildSymbols.Remove(oldName);
     216        allowedChildSymbols.Add(newName, allowedChilds);
     217      }
     218
     219      for (int i = 0; i < GetMaximumSubtreeCount(symbol); i++) {
     220        if (allowedChildSymbolsPerIndex.TryGetValue(Tuple.Create(oldName, i), out allowedChilds)) {
     221          allowedChildSymbolsPerIndex.Remove(Tuple.Create(oldName, i));
     222          allowedChildSymbolsPerIndex.Add(Tuple.Create(newName, i), allowedChilds);
     223        }
     224      }
     225
     226      foreach (var parent in Symbols) {
     227        if (allowedChildSymbols.TryGetValue(parent.Name, out allowedChilds))
     228          if (allowedChilds.Remove(oldName))
     229            allowedChilds.Add(newName);
     230
     231        for (int i = 0; i < GetMaximumSubtreeCount(parent); i++) {
     232          if (allowedChildSymbolsPerIndex.TryGetValue(Tuple.Create(parent.Name, i), out allowedChilds))
     233            if (allowedChilds.Remove(oldName)) allowedChilds.Add(newName);
     234        }
     235      }
     236
     237      ClearCaches();
     238    }
     239    #endregion
    168240  }
    169241}
Note: See TracChangeset for help on using the changeset viewer.