Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
09/17/19 14:05:47 (5 years ago)
Author:
abeham
Message:

#2521: Refactored ContextLookupParameter with suggestions from mkommend

  • Add StorableType attribute to some types
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2521_ProblemRefactoring/HeuristicLab.Parameters/3.3/ContextLookupParameter.cs

    r17254 r17257  
    11using System;
    2 using System.Threading;
    32using HEAL.Attic;
    43using HeuristicLab.Common;
     
    87  [Item("ContextLookupParameter", "A parameter that looks up contexts by type.")]
    98  [StorableType("4ac189c8-6cf3-48fd-bf79-392d35a872db")]
    10   public class ContextLookupParameter<T> : Parameter, IContextLookupParameter<T>, IStatefulItem
     9  public class ContextLookupParameter<T> : ContextParameter, IContextLookupParameter<T>
    1110      where T : class, IParameterizedItem {
    1211
     
    1514    }
    1615
    17     private Lazy<ThreadLocal<IItem>> cachedActualValues;
    18     protected IItem CachedActualValue {
    19       get { return cachedActualValues.Value.Value; }
    20       set { cachedActualValues.Value.Value = value; }
    21     }
    22 
    23     private Lazy<ThreadLocal<IExecutionContext>> executionContexts;
    24     public IExecutionContext ExecutionContext {
    25       get { return executionContexts.Value.Value; }
    26       set {
    27         if (value != executionContexts.Value.Value) {
    28           executionContexts.Value.Value = value;
    29           cachedActualValues.Value.Value = null;
    30         }
    31       }
    32     }
    33 
    3416    [StorableConstructor]
    35     protected ContextLookupParameter(StorableConstructorFlag _) : base(_) {
    36       cachedActualValues = new Lazy<ThreadLocal<IItem>>(() => { return new ThreadLocal<IItem>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
    37       executionContexts = new Lazy<ThreadLocal<IExecutionContext>>(() => { return new ThreadLocal<IExecutionContext>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
    38     }
    39     protected ContextLookupParameter(ContextLookupParameter<T> original, Cloner cloner)
    40       : base(original, cloner) {
    41       cachedActualValues = new Lazy<ThreadLocal<IItem>>(() => { return new ThreadLocal<IItem>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
    42       executionContexts = new Lazy<ThreadLocal<IExecutionContext>>(() => { return new ThreadLocal<IExecutionContext>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
    43     }
    44     public ContextLookupParameter() : this("Anonymous") { }
    45     public ContextLookupParameter(string name, string description = null)
    46       : base(name, description, typeof(T)) {
    47       cachedActualValues = new Lazy<ThreadLocal<IItem>>(() => { return new ThreadLocal<IItem>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
    48       executionContexts = new Lazy<ThreadLocal<IExecutionContext>>(() => { return new ThreadLocal<IExecutionContext>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
     17    protected ContextLookupParameter(StorableConstructorFlag _) : base(_) { }
     18    protected ContextLookupParameter(ContextLookupParameter<T> original, Cloner cloner) : base(original, cloner) { }
     19    public ContextLookupParameter() : base("ContextLookup." + typeof(T).Name, string.Empty, typeof(T)) {
     20      Hidden = true;
    4921    }
    5022
     
    5325    }
    5426
    55     protected override IItem GetActualValue() {
    56       if (CachedActualValue != null) return CachedActualValue;
    57 
     27    protected override IItem GetActualValueFromContext() {
    5828      IItem item = null;
    5929      var context = ExecutionContext;
     
    6535        context = context.Parent;
    6636      }
    67       CachedActualValue = item;
    6837      return item;
    6938    }
     
    7241      throw new NotSupportedException("The context lookup parameter may not be used to set an item.");
    7342    }
    74 
    75     public virtual void InitializeState() {
    76     }
    77     public virtual void ClearState() {
    78       if (cachedActualValues.IsValueCreated) {
    79         cachedActualValues.Value.Dispose();
    80         cachedActualValues = new Lazy<ThreadLocal<IItem>>(() => { return new ThreadLocal<IItem>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
    81       }
    82       if (executionContexts.IsValueCreated) {
    83         executionContexts.Value.Dispose();
    84         executionContexts = new Lazy<ThreadLocal<IExecutionContext>>(() => { return new ThreadLocal<IExecutionContext>(); }, LazyThreadSafetyMode.ExecutionAndPublication);
    85       }
    86     }
    8743  }
    8844}
Note: See TracChangeset for help on using the changeset viewer.