[17263] | 1 | using System;
|
---|
| 2 | using System.Collections.Generic;
|
---|
| 3 | using System.Linq;
|
---|
| 4 | using System.Text;
|
---|
| 5 | using System.Threading.Tasks;
|
---|
| 6 | using HeuristicLab.Core;
|
---|
| 7 | using HeuristicLab.Data;
|
---|
| 8 |
|
---|
[17284] | 9 | namespace HeuristicLab.JsonInterface {
|
---|
[17353] | 10 | /// <summary>
|
---|
| 11 | /// Static class for handling json converters.
|
---|
| 12 | /// </summary>
|
---|
[17281] | 13 | public static class JsonItemConverter {
|
---|
[17282] | 14 |
|
---|
| 15 | private struct ConverterPriorityContainer {
|
---|
| 16 | public IJsonItemConverter Converter { get; set; }
|
---|
| 17 | public int Priority { get; set; }
|
---|
| 18 | }
|
---|
| 19 |
|
---|
[17353] | 20 | private static IDictionary<Type, ConverterPriorityContainer> Converters { get; set; }
|
---|
| 21 | = new Dictionary<Type, ConverterPriorityContainer>();
|
---|
[17263] | 22 |
|
---|
[17353] | 23 | /// <summary>
|
---|
| 24 | /// Register a converter for a given type and priority.
|
---|
| 25 | /// </summary>
|
---|
| 26 | /// <param name="type">The type for which the converter will be selected.</param>
|
---|
| 27 | /// <param name="converter">The implemented converter.</param>
|
---|
| 28 | /// <param name="priority">The priority for the converter selection (when multiple converter match for a given type). Higher is better.</param>
|
---|
[17282] | 29 | public static void Register(Type type, IJsonItemConverter converter, int priority) {
|
---|
[17353] | 30 | if (!Converters.ContainsKey(type))
|
---|
| 31 | Converters.Add(type, new ConverterPriorityContainer() { Converter = converter, Priority = priority });
|
---|
[17263] | 32 | }
|
---|
| 33 |
|
---|
[17353] | 34 | public static void Register<T>(IJsonItemConverter converter, int priority) =>
|
---|
| 35 | Register(typeof(T), converter, priority);
|
---|
[17263] | 36 |
|
---|
[17353] | 37 | /// <summary>
|
---|
| 38 | /// Deregister a converter (same object has to be already registered).
|
---|
| 39 | /// </summary>
|
---|
| 40 | /// <param name="converter">Converter to deregister.</param>
|
---|
| 41 | public static void Deregister(IJsonItemConverter converter) {
|
---|
| 42 | var types =
|
---|
| 43 | Converters
|
---|
| 44 | .Where(x => x.Value.Converter.GetHashCode() == converter.GetHashCode())
|
---|
| 45 | .Select(x => x.Key);
|
---|
| 46 | foreach (var x in types)
|
---|
| 47 | Converters.Remove(x);
|
---|
| 48 | }
|
---|
| 49 |
|
---|
| 50 | /// <summary>
|
---|
| 51 | /// Get a converter for a specific type.
|
---|
| 52 | /// </summary>
|
---|
| 53 | /// <param name="type">The type for which the converter will be selected.</param>
|
---|
| 54 | /// <returns>An IJsonItemConverter object.</returns>
|
---|
[17282] | 55 | public static IJsonItemConverter Get(Type type) {
|
---|
| 56 | IList<ConverterPriorityContainer> possibleConverters = new List<ConverterPriorityContainer>();
|
---|
[17353] | 57 |
|
---|
| 58 | foreach (var x in Converters)
|
---|
[17266] | 59 | if (type.IsEqualTo(x.Key))
|
---|
[17282] | 60 | possibleConverters.Add(x.Value);
|
---|
[17266] | 61 |
|
---|
[17282] | 62 | if(possibleConverters.Count > 0) {
|
---|
| 63 | ConverterPriorityContainer best = possibleConverters.First();
|
---|
| 64 | foreach (var x in possibleConverters) {
|
---|
| 65 | if (x.Priority > best.Priority)
|
---|
| 66 | best = x;
|
---|
[17266] | 67 | }
|
---|
[17282] | 68 | return best.Converter;
|
---|
[17266] | 69 | }
|
---|
[17282] | 70 | return new DummyConverter();
|
---|
[17263] | 71 | }
|
---|
| 72 |
|
---|
[17283] | 73 | internal static void Inject(IItem item, JsonItem data) =>
|
---|
[17282] | 74 | Get(item.GetType()).Inject(item, data);
|
---|
[17263] | 75 |
|
---|
[17283] | 76 | internal static JsonItem Extract(IItem item) =>
|
---|
[17282] | 77 | Get(item.GetType()).Extract(item);
|
---|
[17263] | 78 |
|
---|
[17266] | 79 |
|
---|
[17353] | 80 | /// <summary>
|
---|
| 81 | /// Static constructor for default converter configuration.
|
---|
| 82 | /// </summary>
|
---|
[17281] | 83 | static JsonItemConverter() {
|
---|
[17282] | 84 | Register<IntValue>(new ValueTypeValueConverter<IntValue, int>(), 1);
|
---|
| 85 | Register<DoubleValue>(new ValueTypeValueConverter<DoubleValue, double>(), 1);
|
---|
[17287] | 86 | Register<PercentValue>(new ValueTypeValueConverter<PercentValue, double>(), 2);
|
---|
[17282] | 87 | Register<BoolValue>(new ValueTypeValueConverter<BoolValue, bool>(), 1);
|
---|
| 88 | Register<DateTimeValue>(new ValueTypeValueConverter<DateTimeValue, DateTime>(), 1);
|
---|
| 89 | Register<StringValue>(new StringValueConverter(), 1);
|
---|
[17263] | 90 |
|
---|
[17282] | 91 | Register<IntArray>(new ValueTypeArrayConverter<IntArray, int>(), 1);
|
---|
| 92 | Register<DoubleArray>(new ValueTypeArrayConverter<DoubleArray, double>(), 1);
|
---|
[17287] | 93 | Register<PercentArray>(new ValueTypeArrayConverter<PercentArray, double>(), 2);
|
---|
[17282] | 94 | Register<BoolArray>(new ValueTypeArrayConverter<BoolArray, bool>(), 1);
|
---|
[17263] | 95 |
|
---|
[17282] | 96 | Register<IntMatrix>(new ValueTypeMatrixConverter<IntMatrix, int>(), 1);
|
---|
| 97 | Register<DoubleMatrix>(new ValueTypeMatrixConverter<DoubleMatrix, double>(), 1);
|
---|
[17287] | 98 | Register<PercentMatrix>(new ValueTypeMatrixConverter<PercentMatrix, double>(), 2);
|
---|
[17282] | 99 | Register<BoolMatrix>(new ValueTypeMatrixConverter<BoolMatrix, bool>(), 1);
|
---|
[17266] | 100 |
|
---|
[17353] | 101 | Register<DoubleRange>(new DoubleRangeConverter(), 1);
|
---|
| 102 | Register<IntRange>(new IntRangeConverter(), 1);
|
---|
| 103 |
|
---|
[17287] | 104 | Register(typeof(EnumValue<>), new EnumTypeConverter(), 1);
|
---|
| 105 |
|
---|
[17353] | 106 | Register<IParameter>(new ParameterConverter(), 1);
|
---|
[17287] | 107 |
|
---|
[17353] | 108 | Register<IValueParameter>(new ValueParameterConverter(), 2);
|
---|
| 109 | Register<IParameterizedItem>(new ParameterizedItemConverter(), 2);
|
---|
| 110 | Register<ILookupParameter>(new LookupParameterConverter(), 3);
|
---|
| 111 | Register<IValueLookupParameter>(new ValueLookupParameterConverter(), 4);
|
---|
| 112 |
|
---|
| 113 | Register(typeof(IConstrainedValueParameter<>), new ConstrainedValueParameterConverter(), 3);
|
---|
| 114 | Register(typeof(ICheckedMultiOperator<>), new MultiCheckedOperatorConverter(), 3);
|
---|
[17263] | 115 | }
|
---|
| 116 | }
|
---|
| 117 | }
|
---|