using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using HeuristicLab.Core; using HeuristicLab.Data; namespace HeuristicLab.Manufacture { public static class Transformer { private static IDictionary transformers = new Dictionary(); public static void Register(Type type, ITypeTransformer transformer) { // TODO: explizit if (!transformers.ContainsKey(type)) transformers.Add(type, transformer); } public static void Register(ITypeTransformer transformer) => Register(typeof(T), transformer); public static IEnumerable Get(Type type) { IList> possibleTransformers = new List>(); foreach (var x in transformers) { if (type.IsEqualTo(x.Key)) possibleTransformers.Add(x); } if(possibleTransformers.Count > 0) { ITypeTransformer nearest = possibleTransformers.First().Value; int nearestDistance = -1; foreach (var x in possibleTransformers) { int d = type.GetInterfaceDistance(x.Key); if (d != -1 && (nearestDistance == -1 || d < nearestDistance)) { nearestDistance = d; nearest = x.Value; } } return new ITypeTransformer[] { nearest }; /* return possibleTransformers.OrderBy(x => { return type.GetInterfaceDistance(x.Key); }).Select(x => x.Value); */ } return new ITypeTransformer[] { new DummyTransformer() }; } internal static void Inject(IItem item, Component data) { IEnumerable arr = Get(item.GetType()); foreach (var transformer in arr) transformer.Inject(item, data); } internal static Component Extract(IItem item) { IEnumerable arr = Get(item.GetType()); Component data = new Component(); foreach (var transformer in arr) Component.Merge(data, transformer.Extract(item)); return data; } static Transformer() { Register(new ValueTypeValueTransformer()); Register(new ValueTypeValueTransformer()); Register(new ValueTypeValueTransformer()); Register(new ValueTypeValueTransformer()); Register(new ValueTypeValueTransformer()); Register(new StringValueTransformer()); Register(new ValueTypeArrayTransformer()); Register(new ValueTypeArrayTransformer()); Register(new ValueTypeArrayTransformer()); Register(new ValueTypeArrayTransformer()); Register(new ValueTypeMatrixTransformer()); Register(new ValueTypeMatrixTransformer()); Register(new ValueTypeMatrixTransformer()); Register(new ValueTypeMatrixTransformer()); Register(typeof(IConstrainedValueParameter<>), new ConstrainedValueParameterTransformer()); Register(typeof(ILookupParameter), new LookupParameterTransformer()); Register(typeof(IValueParameter), new ValueParameterTransformer()); Register(typeof(IParameterizedItem), new ParameterizedItemTransformer()); Register(typeof(ICheckedMultiOperator<>), new MultiCheckedOperatorTransformer()); } } }