Free cookie consent management tool by TermsFeed Policy Generator

source: branches/Operator Architecture Refactoring/HeuristicLab.Core/3.3/CallNodeBase.cs @ 2046

Last change on this file since 2046 was 2046, checked in by swagner, 15 years ago

Refactoring of the operator architecture (#95)

File size: 3.6 KB
Line 
1#region License Information
2/* HeuristicLab
3 * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
4 *
5 * This file is part of HeuristicLab.
6 *
7 * HeuristicLab is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * HeuristicLab is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
19 */
20#endregion
21
22using System;
23using System.Collections.Generic;
24using System.Text;
25using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
26
27namespace HeuristicLab.Core {
28  public abstract class CallNodeBase : ItemBase, ICallNode {
29    [Storable]
30    private CallGraph parentGraph;
31
32    [Storable]
33    private Dictionary<string, string> myNameMappings;
34    public IEnumerable<KeyValuePair<string, string>> NameMappings {
35      get { return myNameMappings; }
36    }
37    public IList<ICallNode> SuccessorNodes {
38      get { return parentGraph != null ? parentGraph.GetSuccessorNodes(this) : null; }
39    }
40    public bool InitialCallNode {
41      get { return parentGraph != null ? parentGraph.InitialCallNode == this : false; }
42      set {
43        if (parentGraph != null)
44          parentGraph.InitialCallNode = this;
45      }
46    }
47
48    protected CallNodeBase()
49      : base() {
50      parentGraph = null;
51      myNameMappings = new Dictionary<string, string>();
52    }
53    protected CallNodeBase(CallGraph parentGraph)
54      : this() {
55      this.parentGraph = parentGraph;
56      parentGraph.AddCallNode(this);
57    }
58
59    public override ICloneable Clone(ICloner cloner) {
60      CallNodeBase clone = (CallNodeBase)base.Clone(cloner);
61      foreach (KeyValuePair<string, string> nameMapping in myNameMappings)
62        clone.AddNameMapping(nameMapping.Key, nameMapping.Value);
63      return clone;
64    }
65
66    public void AddNameMapping(string name, string alias) {
67      RemoveNameMapping(name);
68      myNameMappings.Add(name, alias);
69      OnNameMappingAdded(name, alias);
70    }
71    public void RemoveNameMapping(string name) {
72      if (myNameMappings.ContainsKey(name)) {
73        string alias = myNameMappings[name];
74        myNameMappings.Remove(name);
75        OnNameMappingRemoved(name, alias);
76      }
77    }
78    protected void ClearNameMappings() {
79      string[] names = new string[myNameMappings.Count];
80      myNameMappings.Keys.CopyTo(names, 0);
81      foreach (string name in names)
82        RemoveNameMapping(name);
83    }
84    public string MapName(string name) {
85      string alias = name;
86      myNameMappings.TryGetValue(name, out alias);
87      if (parentGraph != null)
88        alias = parentGraph.MapName(alias);
89      return alias;
90    }
91
92    public event EventHandler<EventArgs<string, string>> NameMappingAdded;
93    protected virtual void OnNameMappingAdded(string name, string alias) {
94      if (NameMappingAdded != null)
95        NameMappingAdded(this, new EventArgs<string, string>(name, alias));
96    }
97    public event EventHandler<EventArgs<string, string>> NameMappingRemoved;
98    protected virtual void OnNameMappingRemoved(string name, string alias) {
99      if (NameMappingRemoved != null)
100        NameMappingRemoved(this, new EventArgs<string, string>(name, alias));
101    }
102  }
103}
Note: See TracBrowser for help on using the repository browser.