using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using HeuristicLab.Core; using HeuristicLab.Data; namespace HeuristicLab.JsonInterface { public static class JsonItemConverter { private struct ConverterPriorityContainer { public IJsonItemConverter Converter { get; set; } public int Priority { get; set; } } private static IDictionary transformers = new Dictionary(); public static void Register(Type type, IJsonItemConverter converter, int priority) { if (!transformers.ContainsKey(type)) transformers.Add(type, new ConverterPriorityContainer() { Converter = converter, Priority = priority }); } public static void Register(IJsonItemConverter converter, int priority) => Register(typeof(T), converter, priority); public static IJsonItemConverter Get(Type type) { IList possibleConverters = new List(); foreach (var x in transformers) if (type.IsEqualTo(x.Key)) possibleConverters.Add(x.Value); if(possibleConverters.Count > 0) { ConverterPriorityContainer best = possibleConverters.First(); foreach (var x in possibleConverters) { if (x.Priority > best.Priority) best = x; } return best.Converter; } return new DummyConverter(); } internal static void Inject(IItem item, JsonItem data) => Get(item.GetType()).Inject(item, data); internal static JsonItem Extract(IItem item) => Get(item.GetType()).Extract(item); static JsonItemConverter() { Register(new ValueTypeValueConverter(), 1); Register(new ValueTypeValueConverter(), 1); Register(new ValueTypeValueConverter(), 1); Register(new ValueTypeValueConverter(), 1); Register(new ValueTypeValueConverter(), 1); Register(new StringValueConverter(), 1); Register(new ValueTypeArrayConverter(), 1); Register(new ValueTypeArrayConverter(), 1); Register(new ValueTypeArrayConverter(), 1); Register(new ValueTypeArrayConverter(), 1); Register(new ValueTypeMatrixConverter(), 1); Register(new ValueTypeMatrixConverter(), 1); Register(new ValueTypeMatrixConverter(), 1); Register(new ValueTypeMatrixConverter(), 1); Register(typeof(IConstrainedValueParameter<>), new ConstrainedValueParameterConverter(), 1); Register(typeof(ILookupParameter), new LookupParameterConverter(), 1); Register(typeof(IValueParameter), new ValueParameterConverter(), 1); Register(typeof(IParameterizedItem), new ParameterizedItemConverter(), 1); Register(typeof(ICheckedMultiOperator<>), new MultiCheckedOperatorConverter(), 2); Register(typeof(EnumValue<>), new EnumTypeConverter(), 1); } } }