Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
02/03/10 04:43:06 (14 years ago)
Author:
swagner
Message:

Operator architecture refactoring (#95)

  • worked on parameters and operators
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Parameters/3.3/ItemParameter.cs

    r2715 r2740  
    2929namespace HeuristicLab.Parameters {
    3030  /// <summary>
    31   /// Represents a parameter.
     31  /// A generic parameter which represents an instance of type T.
    3232  /// </summary>
    3333  [Item("ItemParameter<T>", "A generic parameter which represents an instance of type T.")]
     
    4646    }
    4747
    48     private T value;
     48    private T localValue;
    4949    [Storable]
    50     public T Value {
    51       get { return this.value; }
     50    public T LocalValue {
     51      get { return this.localValue; }
    5252      set {
    53         if (value != this.value) {
     53        if (value != this.localValue) {
    5454          if ((value != null) && (!DataType.IsInstanceOfType(value))) throw new ArgumentException("Static value does not match data type of parameter");
    55           if (this.value != null) this.value.Changed -= new ChangedEventHandler(Value_Changed);
    56           this.value = value;
    57           if (this.value != null) this.value.Changed += new ChangedEventHandler(Value_Changed);
    58           OnValueChanged();
     55          if (this.localValue != null) this.localValue.Changed -= new ChangedEventHandler(LocalValue_Changed);
     56          this.localValue = value;
     57          if (this.localValue != null) this.localValue.Changed += new ChangedEventHandler(LocalValue_Changed);
     58          OnLocalValueChanged();
    5959        }
    6060      }
     61    }
     62
     63    public T Value {
     64      get { return GetValue(); }
     65      set { SetValue(value); }
    6166    }
    6267
     
    6469      : base("Anonymous", null, typeof(T)) {
    6570      actualName = Name;
    66       Value = null;
     71      LocalValue = null;
    6772    }
    6873    public ItemParameter(string name, string description)
    6974      : base(name, description, typeof(T)) {
    70       this.actualName = Name;
    71       this.Value = null;
     75      actualName = Name;
     76      LocalValue = null;
    7277    }
    73     public ItemParameter(string name, string description, T value)
     78    public ItemParameter(string name, string description, T localValue)
    7479      : base(name, description, typeof(T)) {
    75       this.actualName = Name;
    76       this.Value = value;
     80      actualName = Name;
     81      LocalValue = localValue;
    7782    }
    7883
    79     public override IItem GetValue(ExecutionContext context) {
     84    public override IDeepCloneable Clone(Cloner cloner) {
     85      ItemParameter<T> clone = (ItemParameter<T>)base.Clone(cloner);
     86      clone.actualName = actualName;
     87      clone.LocalValue = (T)cloner.Clone(localValue);
     88      return clone;
     89    }
     90
     91    public override string ToString() {
     92      return string.Format("{0}: {1} ({2})", Name, LocalValue != null ? LocalValue.ToString() : ActualName, DataType.Name);
     93    }
     94
     95    protected ItemParameter<T> GetParameter(out string name) {
    8096      ItemParameter<T> param = this;
    81       ExecutionContext current = context;
    82       string actualName = null;
     97      ExecutionContext current = ExecutionContext;
     98      name = param.Name;
    8399      while (param != null) {
    84         if (param.Value != null) return param.Value;
    85         actualName = param.ActualName;
     100        if (param.LocalValue != null) return param;
     101        name = param.ActualName;
    86102        current = current.Parent;
    87         while ((current != null) && !current.Operator.Parameters.ContainsKey(actualName))
     103        while ((current != null) && !current.Operator.Parameters.ContainsKey(name))
    88104          current = current.Parent;
    89105        if (current != null)
     
    92108          param = null;
    93109      }
    94 
    95       IScope scope = context.Scope;
    96       while ((scope != null) && !scope.Variables.ContainsKey(actualName))
     110      return null;
     111    }
     112    protected IVariable GetVariable(string name) {
     113      IScope scope = ExecutionContext.Scope;
     114      while ((scope != null) && !scope.Variables.ContainsKey(name))
    97115        scope = scope.Parent;
    98       return scope != null ? scope.Variables[actualName].Value : null;
     116      return scope != null ? scope.Variables[actualName] : null;
    99117    }
    100 
    101     public override IDeepCloneable Clone(Cloner cloner) {
    102       ItemParameter<T> clone = (ItemParameter<T>)base.Clone(cloner);
    103       clone.actualName = actualName;
    104       clone.Value = (T)cloner.Clone(value);
    105       return clone;
     118    protected virtual T GetValue() {
     119      string name;
     120      // try to get local value from context stack
     121      ItemParameter<T> param = GetParameter(out name);
     122      if (param != null) return param.Value;
     123      else {
     124        // try to get variable from scope
     125        IVariable var = GetVariable(name);
     126        if (var != null) return (T)var.Value;
     127      }
     128      return null;
    106129    }
    107 
    108     public override string ToString() {
    109       return string.Format("{0}: {1} ({2})", Name, Value != null ? Value.ToString() : ActualName, DataType.Name);
     130    protected virtual void SetValue(T value) {
     131      string name;
     132      // try to get local value from context stack
     133      ItemParameter<T> param = GetParameter(out name);
     134      if (param != null) param.Value = value;
     135      else {
     136        // try to get variable from scope
     137        IVariable var = GetVariable(name);
     138        if (var != null) var.Value = value;
     139        else ExecutionContext.Scope.Variables.Add(new Variable(name, value));
     140      }
    110141    }
    111142
     
    116147      OnChanged();
    117148    }
    118     public event EventHandler ValueChanged;
    119     private void OnValueChanged() {
    120       if (ValueChanged != null)
    121         ValueChanged(this, new EventArgs());
     149    public event EventHandler LocalValueChanged;
     150    private void OnLocalValueChanged() {
     151      if (LocalValueChanged != null)
     152        LocalValueChanged(this, new EventArgs());
    122153      OnChanged();
    123154    }
    124 
    125     private void Value_Changed(object sender, ChangedEventArgs e) {
     155    private void LocalValue_Changed(object sender, ChangedEventArgs e) {
    126156      OnChanged(e);
    127157    }
Note: See TracChangeset for help on using the changeset viewer.