Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/13/16 10:51:56 (8 years ago)
Author:
abeham
Message:

#2431: Refactored ResultsParameter

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/PerformanceComparison/HeuristicLab.Optimization/3.3/Results/ResultParameter.cs

    r12764 r14058  
    11#region License Information
    22/* HeuristicLab
    3  * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
     3 * Copyright (C) 2002-2016 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
    44 *
    55 * This file is part of HeuristicLab.
     
    2121
    2222using System;
     23using System.Drawing;
    2324using HeuristicLab.Common;
     25using HeuristicLab.Common.Resources;
    2426using HeuristicLab.Core;
    2527using HeuristicLab.Parameters;
     
    3133  [StorableClass]
    3234  [NonDiscoverableType]
    33   public sealed class ResultParameter<T> : LookupParameter<ResultCollection>, IResultParameter<T> where T : class, IItem, new() {
     35  public sealed class ResultParameter<T> : LookupParameter<T>, IResultParameter<T> where T : class, IItem {
     36    public override Image ItemImage { get { return VSImageLibrary.Exception; } }
    3437
    3538    [Storable]
    36     private string resultName;
    37     public string ResultName {
    38       get { return resultName; }
     39    private string resultCollectionName;
     40    public string ResultCollectionName {
     41      get { return resultCollectionName; }
    3942      set {
    4043        if (value == null) throw new ArgumentNullException();
    41         if (string.IsNullOrWhiteSpace(value)) {
    42           resultName = Name;
    43           OnResultNameChanged();
    44         } else if (!resultName.Equals(value)) {
    45           resultName = value;
    46           OnResultNameChanged();
     44        if (string.IsNullOrWhiteSpace(value)) throw new ArgumentNullException();
     45        else if (!resultCollectionName.Equals(value)) {
     46          resultCollectionName = value;
     47          OnResultCollectionNameChanged();
    4748        }
    4849      }
     
    6162    }
    6263
    63     public T ResultValue {
    64       get { return GetResultValue(); }
    65       set { SetResultValue(value); }
    66     }
    67 
    6864    [StorableConstructor]
    6965    private ResultParameter(bool deserializing) : base(deserializing) { }
    7066    private ResultParameter(ResultParameter<T> original, Cloner cloner)
    7167      : base(original, cloner) {
    72       resultName = original.resultName;
     68      resultCollectionName = original.resultCollectionName;
    7369      defaultValue = cloner.Clone(original.defaultValue);
    7470    }
     
    7672      return new ResultParameter<T>(this, cloner);
    7773    }
    78     public ResultParameter() : this("Anonymous") { }
    79     public ResultParameter(string name)
    80       : base(name, string.Empty, "Results") {
    81       resultName = Name;
    82       defaultValue = new T();
    83     }
    84     public ResultParameter(string name, string description) : this(name, description, new T()) { }
    85     public ResultParameter(string name, string description, T defaultValue)
    86       : base(name, description, "Results") {
     74    public ResultParameter() : this("Anonymous", string.Empty, "Results") { }
     75    public ResultParameter(string name) : this(name, string.Empty, "Results") { }
     76    public ResultParameter(string name, string description) : this(name, description, "Results") { }
     77    public ResultParameter(string name, string description, string resultCollectionName)
     78      : base(name, description, string.Empty) {
     79      if (string.IsNullOrEmpty(resultCollectionName)) throw new ArgumentException("resultCollectionName");
     80      this.resultCollectionName = resultCollectionName;
     81    }
     82    public ResultParameter(string name, string description, string resultCollectionName, T defaultValue)
     83      : base(name, description, string.Empty) {
     84      if (string.IsNullOrEmpty(resultCollectionName)) throw new ArgumentException("resultCollectionName");
    8785      if (defaultValue == null) throw new ArgumentNullException("defaultValue");
    88       resultName = Name;
     86      this.resultCollectionName = resultCollectionName;
    8987      this.defaultValue = defaultValue;
    9088    }
    91     public ResultParameter(string name, string description, string resultName) : this(name, description, new T(), resultName) { }
    92     public ResultParameter(string name, string description, T defaultValue, string resultName)
    93       : base(name, description, "Results") {
    94       if (defaultValue == null) throw new ArgumentNullException("defaultValue");
    95       this.resultName = string.IsNullOrWhiteSpace(resultName) ? Name : resultName;
    96       this.defaultValue = defaultValue;
    97     }
     89   
     90    protected override IItem GetActualValue() {
     91      ResultCollection results;
     92      if (CachedActualValue != null) {
     93        results = CachedActualValue as ResultCollection;
     94        if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection not found.");
     95      } else {
     96        var tmp = ResultCollectionName;
     97        // verifyType has to be disabled, because the ResultCollection may not be identical to the generic type of the parameter
     98        results = GetValue(ExecutionContext, ref tmp) as ResultCollection;
     99        if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection with name " + tmp + " not found.");
     100        CachedActualValue = results;
     101      }
    98102
    99     public override string ToString() {
    100       if (Name.Equals(ResultName)) return Name;
    101       return Name + ": " + ResultName;
    102     }
     103      IResult result;
     104      if (!results.TryGetValue(ActualName, out result)) {
     105        if (DefaultValue == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): Result not found and no default value specified.");
     106        result = new Result(ActualName, (T)DefaultValue.Clone());
     107        results.Add(result);
     108      }
    103109
    104     private T GetResultValue() {
    105       var results = ActualValue;
    106       if (results == null)
    107         throw new InvalidOperationException("ResultParameter (" + ResultName + "): ResultCollection " + ActualName + " not found.");
    108 
    109       if (!results.ContainsKey(ResultName)) results.Add(new Result(ResultName, (T)DefaultValue.Clone()));
    110       var resultValue = results[ResultName].Value as T;
     110      var resultValue = result.Value as T;
    111111      if (resultValue == null)
    112         throw new InvalidOperationException(string.Format("Type mismatch. Result \"{0}\" does not contain a \"{1}\".", ResultName, typeof(T).GetPrettyName()));
     112        throw new InvalidOperationException(string.Format("Type mismatch. Result \"{0}\" does not contain a \"{1}\".", ActualName, typeof(T).GetPrettyName()));
    113113
    114114      return resultValue;
    115115    }
    116116
    117     private void SetResultValue(T value) {
    118       var results = ActualValue;
    119       if (results == null)
    120         throw new InvalidOperationException("ResultParameter (" + ResultName + "): ResultCollection " + ActualName + " not found.");
     117    protected override void SetActualValue(IItem value) {
     118      ResultCollection results;
     119      if (CachedActualValue != null) {
     120        results = CachedActualValue as ResultCollection;
     121        if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection not found.");
     122      } else {
     123        var tmp = ResultCollectionName;
     124        results = GetValue(ExecutionContext, ref tmp) as ResultCollection;
     125        if (results == null) throw new InvalidOperationException("ResultParameter (" + ActualName + "): ResultCollection with name " + tmp + " not found.");
     126        CachedActualValue = results;
     127      }
    121128
    122       if (!results.ContainsKey(ResultName))
    123         results.Add(new Result(ResultName, value));
    124       else results[ResultName].Value = value;
     129      IResult result;
     130      if (!results.TryGetValue(ActualName, out result)) {
     131        result = new Result(ActualName, value);
     132        results.Add(result);
     133      } else result.Value = value;
    125134    }
    126135
    127     public event EventHandler ResultNameChanged;
    128     private void OnResultNameChanged() {
    129       var handler = ResultNameChanged;
     136
     137    public event EventHandler ResultCollectionNameChanged;
     138    private void OnResultCollectionNameChanged() {
     139      var handler = ResultCollectionNameChanged;
    130140      if (handler != null) handler(this, EventArgs.Empty);
    131141      OnToStringChanged();
Note: See TracChangeset for help on using the changeset viewer.