Free cookie consent management tool by TermsFeed Policy Generator

source: branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/JsonItem.cs @ 17283

Last change on this file since 17283 was 17283, checked in by dpiringe, 5 years ago

#3026: renamed Component to JsonItem

File size: 3.8 KB
Line 
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Threading.Tasks;
6using HeuristicLab.Core;
7using Newtonsoft.Json;
8using Newtonsoft.Json.Linq;
9
10namespace HeuristicLab.Manufacture {
11  //JsonItem
12  public class JsonItem {
13    private IList<object> range;
14    private object defaultValue;
15
16    public string Name { get; set; }
17    public string Type { get; set; }
18    public object Default {
19      get => defaultValue;
20      set {
21        defaultValue = value;
22        if(Range != null && value != null && !FulfillConstraints())
23          throw new ArgumentOutOfRangeException("Default", "Default is not in range.");
24      }
25    }
26    public string Path { get; set; } = "";
27
28    public IList<object> Range {
29      get => range;
30      set {
31        range = value;
32        if (Default != null && value != null && !FulfillConstraints())
33          throw new ArgumentOutOfRangeException("Default", "Default is not in range.");
34      }
35    }
36
37    public IList<JsonItem> Parameters { get; set; }
38    public IList<JsonItem> Operators { get; set; }
39   
40    public override bool Equals(object obj) =>
41      (obj is JsonItem ? (obj.Cast<JsonItem>().Name == this.Name) : false);
42     
43    public override int GetHashCode() => Name.GetHashCode();
44
45    [JsonIgnore]
46    public JsonItem Reference { get; set; }
47   
48    public static void Merge(JsonItem target, JsonItem from) {
49      target.Name = from.Name ?? target.Name;
50      target.Type = from.Type ?? target.Type;
51      target.Range = from.Range ?? target.Range;
52      target.Path = from.Path ?? target.Path;
53      target.Default = from.Default ?? target.Default;
54      target.Reference = from.Reference ?? target.Reference;
55      target.Parameters = from.Parameters ?? target.Parameters;
56      target.Operators = from.Operators ?? target.Operators;
57    }
58
59    public bool FulfillConstraints() => FulfillConstraints(this);
60
61    public static bool FulfillConstraints(JsonItem data) =>
62      data.Range != null && data.Default != null && (
63      IsInRangeList(data.Range, data.Default) ||
64      IsInNumericRange<long>(data.Default, data.Range[0], data.Range[1]) ||
65      IsInNumericRange<int>(data.Default, data.Range[0], data.Range[1]) ||
66      IsInNumericRange<short>(data.Default, data.Range[0], data.Range[1]) ||
67      IsInNumericRange<byte>(data.Default, data.Range[0], data.Range[1]) ||
68      IsInNumericRange<float>(data.Default, data.Range[0], data.Range[1]) ||
69      IsInNumericRange<double>(data.Default, data.Range[0], data.Range[1]));
70
71
72
73    public void UpdatePaths() {
74      if (Parameters != null) {
75        foreach (var p in Parameters) {
76          p.Path = Path + "." + p.Name;
77        }
78      }
79
80      if (Operators != null) {
81        foreach (var p in Operators) {
82          p.Path = Path + "." + p.Name;
83        }
84      }
85    }
86
87    public void PrependPath(string str) {
88      Path = $"{str}.{Path}";
89      PrependPathHelper(Parameters, str);
90      PrependPathHelper(Operators, str);
91    }
92
93    private void PrependPathHelper(IEnumerable<JsonItem> items, string str) {
94      if (items != null) {
95        foreach (var p in items)
96          p.PrependPath(str);
97      }
98    }
99
100    #region Helper
101    private static bool IsInRangeList(IEnumerable<object> list, object value) {
102      foreach (var x in list)
103        if (x.Equals(value)) return true;
104      return false;
105    }
106
107    private static bool IsInNumericRange<T>(object value, object min, object max) where T : IComparable =>
108      (value != null && min != null && max != null && value is T && min is T && max is T &&
109        (((T)min).CompareTo(value) == -1 || ((T)min).CompareTo(value) == 0) &&
110        (((T)max).CompareTo(value) == 1 || ((T)max).CompareTo(value) == 0));
111    #endregion
112  }
113}
Note: See TracBrowser for help on using the repository browser.