Free cookie consent management tool by TermsFeed Policy Generator

source: trunk/sources/HeuristicLab.Data/3.3/ReferenceTypeData.cs @ 2665

Last change on this file since 2665 was 2665, checked in by swagner, 14 years ago

Continued work on adapting and refactoring HeuristicLab.Data according to the changes in HeuristicLab.Core (#95)

File size: 2.4 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 System.Xml;
26using HeuristicLab.Core;
27using HeuristicLab.Persistence.Default.CompositeSerializers.Storable;
28
29namespace HeuristicLab.Data {
30  [Item("ReferenceTypeData<T>", "A base class for representing reference types.")]
31  public class ReferenceTypeData<T> : Item where T : class {
32    [Storable]
33    protected T value;
34    public T Value {
35      get { return value; }
36      set {
37        if (!value.Equals(this.value)) {
38          this.value = value;
39          OnValueChanged();
40        }
41      }
42    }
43
44    public ReferenceTypeData() {
45      value = default(T);
46    }
47
48    public override IDeepCloneable Clone(Cloner cloner) {
49      ReferenceTypeData<T> clone = (ReferenceTypeData<T>)base.Clone(cloner);
50      IDeepCloneable deepCloneable = Value as IDeepCloneable;
51      if (deepCloneable != null) {
52        clone.value = (T)deepCloneable.Clone(cloner);
53        return clone;
54      }
55      ICloneable cloneable = Value as ICloneable;
56      if (cloneable != null) {
57        clone.value = (T)cloneable.Clone();
58        return clone;
59      }
60      throw new InvalidOperationException("Contained object is not cloneable.");
61    }
62
63    public override string ToString() {
64      return value == null ? "null" : value.ToString();
65    }
66
67    public event EventHandler ValueChanged;
68    protected virtual void OnValueChanged() {
69      if (ValueChanged != null)
70        ValueChanged(this, EventArgs.Empty);
71      OnChanged();
72    }
73  }
74}
Note: See TracBrowser for help on using the repository browser.