[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 |
|
---|
[17266] | 9 | namespace HeuristicLab.Manufacture {
|
---|
[17263] | 10 | public static class Transformer {
|
---|
| 11 | private static IDictionary<Type, ITypeTransformer> transformers = new Dictionary<Type, ITypeTransformer>();
|
---|
| 12 |
|
---|
[17280] | 13 | public static void Register(Type type, ITypeTransformer transformer) { // TODO: explizit
|
---|
| 14 | if (!transformers.ContainsKey(type))
|
---|
[17263] | 15 | transformers.Add(type, transformer);
|
---|
| 16 | }
|
---|
| 17 |
|
---|
| 18 |
|
---|
| 19 | public static void Register<T>(ITypeTransformer transformer) => Register(typeof(T), transformer);
|
---|
| 20 |
|
---|
[17280] | 21 | public static IEnumerable<ITypeTransformer> Get(Type type) {
|
---|
[17266] | 22 | IList<KeyValuePair<Type, ITypeTransformer>> possibleTransformers = new List<KeyValuePair<Type, ITypeTransformer>>();
|
---|
[17269] | 23 |
|
---|
| 24 |
|
---|
[17263] | 25 | foreach (var x in transformers) {
|
---|
[17266] | 26 | if (type.IsEqualTo(x.Key))
|
---|
| 27 | possibleTransformers.Add(x);
|
---|
[17263] | 28 | }
|
---|
[17266] | 29 |
|
---|
[17269] | 30 |
|
---|
[17266] | 31 | if(possibleTransformers.Count > 0) {
|
---|
| 32 | ITypeTransformer nearest = possibleTransformers.First().Value;
|
---|
| 33 | int nearestDistance = -1;
|
---|
| 34 | foreach (var x in possibleTransformers) {
|
---|
| 35 | int d = type.GetInterfaceDistance(x.Key);
|
---|
| 36 | if (d != -1 && (nearestDistance == -1 || d < nearestDistance)) {
|
---|
| 37 | nearestDistance = d;
|
---|
| 38 | nearest = x.Value;
|
---|
| 39 | }
|
---|
| 40 | }
|
---|
[17269] | 41 | return new ITypeTransformer[] { nearest };
|
---|
| 42 | /*
|
---|
| 43 | return possibleTransformers.OrderBy(x => {
|
---|
| 44 | return type.GetInterfaceDistance(x.Key);
|
---|
| 45 | }).Select(x => x.Value);
|
---|
| 46 | */
|
---|
[17266] | 47 | }
|
---|
[17269] | 48 | return new ITypeTransformer[] { new DummyTransformer() };
|
---|
[17263] | 49 | }
|
---|
| 50 |
|
---|
[17271] | 51 | internal static void Inject(IItem item, Component data) {
|
---|
[17269] | 52 | IEnumerable<ITypeTransformer> arr = Get(item.GetType());
|
---|
| 53 | foreach (var transformer in arr)
|
---|
| 54 | transformer.Inject(item, data);
|
---|
[17263] | 55 | }
|
---|
| 56 |
|
---|
[17271] | 57 | internal static Component Extract(IItem item) {
|
---|
[17269] | 58 | IEnumerable<ITypeTransformer> arr = Get(item.GetType());
|
---|
[17271] | 59 | Component data = new Component();
|
---|
[17269] | 60 | foreach (var transformer in arr)
|
---|
[17271] | 61 | Component.Merge(data, transformer.Extract(item));
|
---|
[17269] | 62 | return data;
|
---|
[17266] | 63 | }
|
---|
[17263] | 64 |
|
---|
[17266] | 65 |
|
---|
[17263] | 66 | static Transformer() {
|
---|
| 67 | Register<IntValue>(new ValueTypeValueTransformer<IntValue, int>());
|
---|
| 68 | Register<DoubleValue>(new ValueTypeValueTransformer<DoubleValue, double>());
|
---|
| 69 | Register<PercentValue>(new ValueTypeValueTransformer<PercentValue, double>());
|
---|
| 70 | Register<BoolValue>(new ValueTypeValueTransformer<BoolValue, bool>());
|
---|
| 71 | Register<DateTimeValue>(new ValueTypeValueTransformer<DateTimeValue, DateTime>());
|
---|
| 72 | Register<StringValue>(new StringValueTransformer());
|
---|
| 73 |
|
---|
| 74 | Register<IntArray>(new ValueTypeArrayTransformer<IntArray, int>());
|
---|
| 75 | Register<DoubleArray>(new ValueTypeArrayTransformer<DoubleArray, double>());
|
---|
| 76 | Register<PercentArray>(new ValueTypeArrayTransformer<PercentArray, double>());
|
---|
| 77 | Register<BoolArray>(new ValueTypeArrayTransformer<BoolArray, bool>());
|
---|
| 78 |
|
---|
| 79 | Register<IntMatrix>(new ValueTypeMatrixTransformer<IntMatrix, int>());
|
---|
| 80 | Register<DoubleMatrix>(new ValueTypeMatrixTransformer<DoubleMatrix, double>());
|
---|
| 81 | Register<PercentMatrix>(new ValueTypeMatrixTransformer<PercentMatrix, double>());
|
---|
| 82 | Register<BoolMatrix>(new ValueTypeMatrixTransformer<BoolMatrix, bool>());
|
---|
[17266] | 83 |
|
---|
| 84 | Register(typeof(IConstrainedValueParameter<>), new ConstrainedValueParameterTransformer());
|
---|
| 85 | Register(typeof(ILookupParameter), new LookupParameterTransformer());
|
---|
| 86 | Register(typeof(IValueParameter), new ValueParameterTransformer());
|
---|
[17269] | 87 | Register(typeof(IParameterizedItem), new ParameterizedItemTransformer());
|
---|
| 88 | Register(typeof(ICheckedMultiOperator<>), new MultiCheckedOperatorTransformer());
|
---|
[17263] | 89 | }
|
---|
| 90 |
|
---|
| 91 | }
|
---|
| 92 | }
|
---|