#region License Information /* HeuristicLab * Copyright (C) 2002-2015 Heuristic and Evolutionary Algorithms Laboratory (HEAL) * * This file is part of HeuristicLab. * * HeuristicLab is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * HeuristicLab is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with HeuristicLab. If not, see . */ #endregion using Google.ProtocolBuffers; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; namespace HeuristicLab.Persistence { public abstract class BoxTransformer : Transformer { public override bool CanTransformType(Type type) { return type == typeof(T); } public override Box ToBox(object o, Mapper mapper) { var box = Box.CreateBuilder(); box.TransformerId = mapper.GetTransformerId(this); box.TypeId = mapper.GetTypeId(o.GetType()); Populate(box, (T)o, mapper); return box.Build(); } public override object ToObject(Box box, Mapper mapper) { return Extract(box, mapper.GetType(box.TypeId), mapper); } protected abstract void Populate(Box.Builder box, T value, Mapper mapper); protected abstract T Extract(Box box, Type type, Mapper mapper); } #region Scalar Box Transformers public abstract class BoolBoxTransformer : BoxTransformer { protected override void Populate(Box.Builder box, T value, Mapper mapper) { var b = BoolBox.CreateBuilder(); b.Value = ToBoxType(value, mapper); box.SetExtension(BoolBox.Bool, b.Build()); } protected override T Extract(Box box, Type type, Mapper mapper) { return ToValueType(box.GetExtension(BoolBox.Bool).Value, type, mapper); } protected abstract bool ToBoxType(T value, Mapper mapper); protected abstract T ToValueType(bool value, Type type, Mapper mapper); } public abstract class IntBoxTransformer : BoxTransformer { protected override void Populate(Box.Builder box, T value, Mapper mapper) { var b = IntBox.CreateBuilder(); b.Value = ToBoxType(value, mapper); box.SetExtension(IntBox.Int, b.Build()); } protected override T Extract(Box box, Type type, Mapper mapper) { return ToValueType(box.GetExtension(IntBox.Int).Value, type, mapper); } protected abstract int ToBoxType(T value, Mapper mapper); protected abstract T ToValueType(int value, Type type, Mapper mapper); } public abstract class LongBoxTransformer : BoxTransformer { protected override void Populate(Box.Builder box, T value, Mapper mapper) { var b = LongBox.CreateBuilder(); b.Value = ToBoxType(value, mapper); box.SetExtension(LongBox.Long, b.Build()); } protected override T Extract(Box box, Type type, Mapper mapper) { return ToValueType(box.GetExtension(LongBox.Long).Value, type, mapper); } protected abstract long ToBoxType(T value, Mapper mapper); protected abstract T ToValueType(long value, Type type, Mapper mapper); } public abstract class UnsignedIntBoxTransformer : BoxTransformer { protected override void Populate(Box.Builder box, T value, Mapper mapper) { var b = UnsignedIntBox.CreateBuilder(); b.Value = ToBoxType(value, mapper); box.SetExtension(UnsignedIntBox.UnsignedInt, b.Build()); } protected override T Extract(Box box, Type type, Mapper mapper) { return ToValueType(box.GetExtension(UnsignedIntBox.UnsignedInt).Value, type, mapper); } protected abstract uint ToBoxType(T value, Mapper mapper); protected abstract T ToValueType(uint value, Type type, Mapper mapper); } public abstract class UnsignedLongBoxTransformer : BoxTransformer { protected override void Populate(Box.Builder box, T value, Mapper mapper) { var b = UnsignedLongBox.CreateBuilder(); b.Value = ToBoxType(value, mapper); box.SetExtension(UnsignedLongBox.UnsignedLong, b.Build()); } protected override T Extract(Box box, Type type, Mapper mapper) { return ToValueType(box.GetExtension(UnsignedLongBox.UnsignedLong).Value, type, mapper); } protected abstract ulong ToBoxType(T value, Mapper mapper); protected abstract T ToValueType(ulong value, Type type, Mapper mapper); } public abstract class FloatBoxTransformer : BoxTransformer { protected override void Populate(Box.Builder box, T value, Mapper mapper) { var b = FloatBox.CreateBuilder(); b.Value = ToBoxType(value, mapper); box.SetExtension(FloatBox.Float, b.Build()); } protected override T Extract(Box box, Type type, Mapper mapper) { return ToValueType(box.GetExtension(FloatBox.Float).Value, type, mapper); } protected abstract float ToBoxType(T value, Mapper mapper); protected abstract T ToValueType(float value, Type type, Mapper mapper); } public abstract class DoubleBoxTransformer : BoxTransformer { protected override void Populate(Box.Builder box, T value, Mapper mapper) { var b = DoubleBox.CreateBuilder(); b.Value = ToBoxType(value, mapper); box.SetExtension(DoubleBox.Double, b.Build()); } protected override T Extract(Box box, Type type, Mapper mapper) { return ToValueType(box.GetExtension(DoubleBox.Double).Value, type, mapper); } protected abstract double ToBoxType(T value, Mapper mapper); protected abstract T ToValueType(double value, Type type, Mapper mapper); } public abstract class StringBoxTransformer : BoxTransformer { protected override void Populate(Box.Builder box, T value, Mapper mapper) { var b = StringBox.CreateBuilder(); b.Value = ToBoxType(value, mapper); box.SetExtension(StringBox.String, b.Build()); } protected override T Extract(Box box, Type type, Mapper mapper) { return ToValueType(box.GetExtension(StringBox.String).Value, type, mapper); } protected abstract string ToBoxType(T value, Mapper mapper); protected abstract T ToValueType(string value, Type type, Mapper mapper); } public abstract class BytesBoxTransformer : BoxTransformer { protected override void Populate(Box.Builder box, T value, Mapper mapper) { var b = BytesBox.CreateBuilder(); b.Value = ByteString.CopyFrom(ToBoxType(value, mapper)); box.SetExtension(BytesBox.Bytes, b.Build()); } protected override T Extract(Box box, Type type, Mapper mapper) { return ToValueType(box.GetExtension(BytesBox.Bytes).Value.ToByteArray(), type, mapper); } protected abstract byte[] ToBoxType(T value, Mapper mapper); protected abstract T ToValueType(byte[] value, Type type, Mapper mapper); } #endregion #region Array Box Transformers public abstract class BoolArrayBoxTransformer : BoxTransformer { protected override void Populate(Box.Builder box, T value, Mapper mapper) { var b = BoolArrayBox.CreateBuilder(); b.AddRangeValues(ToBoxType(value, mapper)); box.SetExtension(BoolArrayBox.BoolArray, b.Build()); } protected override T Extract(Box box, Type type, Mapper mapper) { return ToValueType(box.GetExtension(BoolArrayBox.BoolArray).ValuesList, type, mapper); } protected abstract IEnumerable ToBoxType(T value, Mapper mapper); protected abstract T ToValueType(IEnumerable value, Type type, Mapper mapper); } public abstract class IntArrayBoxTransformer : BoxTransformer { protected override void Populate(Box.Builder box, T value, Mapper mapper) { var b = IntArrayBox.CreateBuilder(); b.AddRangeValues(ToBoxType(value, mapper)); box.SetExtension(IntArrayBox.IntArray, b.Build()); } protected override T Extract(Box box, Type type, Mapper mapper) { return ToValueType(box.GetExtension(IntArrayBox.IntArray).ValuesList, type, mapper); } protected abstract IEnumerable ToBoxType(T value, Mapper mapper); protected abstract T ToValueType(IEnumerable value, Type type, Mapper mapper); } public abstract class LongArrayBoxTransformer : BoxTransformer { protected override void Populate(Box.Builder box, T value, Mapper mapper) { var b = LongArrayBox.CreateBuilder(); b.AddRangeValues(ToBoxType(value, mapper)); box.SetExtension(LongArrayBox.LongArray, b.Build()); } protected override T Extract(Box box, Type type, Mapper mapper) { return ToValueType(box.GetExtension(LongArrayBox.LongArray).ValuesList, type, mapper); } protected abstract IEnumerable ToBoxType(T value, Mapper mapper); protected abstract T ToValueType(IEnumerable value, Type type, Mapper mapper); } public abstract class UnsignedIntArrayBoxTransformer : BoxTransformer { protected override void Populate(Box.Builder box, T value, Mapper mapper) { var b = UnsignedIntArrayBox.CreateBuilder(); b.AddRangeValues(ToBoxType(value, mapper)); box.SetExtension(UnsignedIntArrayBox.UnsignedIntArray, b.Build()); } protected override T Extract(Box box, Type type, Mapper mapper) { return ToValueType(box.GetExtension(UnsignedIntArrayBox.UnsignedIntArray).ValuesList, type, mapper); } protected abstract IEnumerable ToBoxType(T value, Mapper mapper); protected abstract T ToValueType(IEnumerable value, Type type, Mapper mapper); } public abstract class UnsignedLongArrayBoxTransformer : BoxTransformer { protected override void Populate(Box.Builder box, T value, Mapper mapper) { var b = UnsignedLongArrayBox.CreateBuilder(); b.AddRangeValues(ToBoxType(value, mapper)); box.SetExtension(UnsignedLongArrayBox.UnsignedLongArray, b.Build()); } protected override T Extract(Box box, Type type, Mapper mapper) { return ToValueType(box.GetExtension(UnsignedLongArrayBox.UnsignedLongArray).ValuesList, type, mapper); } protected abstract IEnumerable ToBoxType(T value, Mapper mapper); protected abstract T ToValueType(IEnumerable value, Type type, Mapper mapper); } public abstract class FloatArrayBoxTransformer : BoxTransformer { protected override void Populate(Box.Builder box, T value, Mapper mapper) { var b = FloatArrayBox.CreateBuilder(); b.AddRangeValues(ToBoxType(value, mapper)); box.SetExtension(FloatArrayBox.FloatArray, b.Build()); } protected override T Extract(Box box, Type type, Mapper mapper) { return ToValueType(box.GetExtension(FloatArrayBox.FloatArray).ValuesList, type, mapper); } protected abstract IEnumerable ToBoxType(T value, Mapper mapper); protected abstract T ToValueType(IEnumerable value, Type type, Mapper mapper); } public abstract class DoubleArrayBoxTransformer : BoxTransformer { protected override void Populate(Box.Builder box, T value, Mapper mapper) { var b = DoubleArrayBox.CreateBuilder(); b.AddRangeValues(ToBoxType(value, mapper)); box.SetExtension(DoubleArrayBox.DoubleArray, b.Build()); } protected override T Extract(Box box, Type type, Mapper mapper) { return ToValueType(box.GetExtension(DoubleArrayBox.DoubleArray).ValuesList, type, mapper); } protected abstract IEnumerable ToBoxType(T value, Mapper mapper); protected abstract T ToValueType(IEnumerable value, Type type, Mapper mapper); } public abstract class StringArrayBoxTransformer : BoxTransformer { protected override void Populate(Box.Builder box, T value, Mapper mapper) { var b = StringArrayBox.CreateBuilder(); b.AddRangeValues(ToBoxType(value, mapper)); box.SetExtension(StringArrayBox.StringArray, b.Build()); } protected override T Extract(Box box, Type type, Mapper mapper) { return ToValueType(box.GetExtension(StringArrayBox.StringArray).ValuesList, type, mapper); } protected abstract IEnumerable ToBoxType(T value, Mapper mapper); protected abstract T ToValueType(IEnumerable value, Type type, Mapper mapper); } #endregion #region Primitive Value Types [Transformer("9FA1C6A8-517E-4623-AC1B-7E9AEF6ED13D", 200)] internal sealed class BoolTransformer : BoolBoxTransformer { protected override bool ToBoxType(bool value, Mapper mapper) { return value; } protected override bool ToValueType(bool value, Type type, Mapper mapper) { return value; } } [Transformer("059633E9-12CB-43EC-8544-57746536E281", 201)] internal sealed class ByteTransformer : UnsignedIntBoxTransformer { protected override uint ToBoxType(byte value, Mapper mapper) { return value; } protected override byte ToValueType(uint value, Type type, Mapper mapper) { return (byte)value; } } [Transformer("5DC2F3AC-0852-4B57-A861-D29CC814A94C", 202)] internal sealed class SByteTransformer : IntBoxTransformer { protected override int ToBoxType(sbyte value, Mapper mapper) { return value; } protected override sbyte ToValueType(int value, Type type, Mapper mapper) { return (sbyte)value; } } [Transformer("B862E642-A94A-4870-8065-06126A35A9E1", 203)] internal sealed class ShortTransformer : IntBoxTransformer { protected override int ToBoxType(short value, Mapper mapper) { return value; } protected override short ToValueType(int value, Type type, Mapper mapper) { return (short)value; } } [Transformer("D1D3062D-F1BB-4189-AE50-D6986E1DEB4E", 204)] internal sealed class UShortTransformer : UnsignedIntBoxTransformer { protected override uint ToBoxType(ushort value, Mapper mapper) { return value; } protected override ushort ToValueType(uint value, Type type, Mapper mapper) { return (ushort)value; } } [Transformer("6C444645-3062-4D15-AD01-E6E1B0692A2B", 205)] internal sealed class CharTransformer : UnsignedIntBoxTransformer { protected override uint ToBoxType(char value, Mapper mapper) { return value; } protected override char ToValueType(uint value, Type type, Mapper mapper) { return (char)value; } } [Transformer("649E73B2-EFA6-4E01-BCB4-4B29D652C9CB", 206)] internal sealed class IntTransformer : IntBoxTransformer { protected override int ToBoxType(int value, Mapper mapper) { return value; } protected override int ToValueType(int value, Type type, Mapper mapper) { return value; } } [Transformer("BCF25010-81A2-49BC-88CC-407D3F393D5B", 207)] internal sealed class UIntTransformer : UnsignedIntBoxTransformer { protected override uint ToBoxType(uint value, Mapper mapper) { return value; } protected override uint ToValueType(uint value, Type type, Mapper mapper) { return value; } } [Transformer("B6F6ACAE-755C-47EE-B8BF-7CDECBE19C30", 208)] internal sealed class LongTransformer : LongBoxTransformer { protected override long ToBoxType(long value, Mapper mapper) { return value; } protected override long ToValueType(long value, Type type, Mapper mapper) { return value; } } [Transformer("82333ACA-F041-44E0-B365-27C399594BA7", 209)] internal sealed class ULongTransformer : UnsignedLongBoxTransformer { protected override ulong ToBoxType(ulong value, Mapper mapper) { return value; } protected override ulong ToValueType(ulong value, Type type, Mapper mapper) { return value; } } [Transformer("8FE91ECF-2261-4934-BECD-C38923B7A703", 210)] internal sealed class FloatTransformer : FloatBoxTransformer { protected override float ToBoxType(float value, Mapper mapper) { return value; } protected override float ToValueType(float value, Type type, Mapper mapper) { return value; } } [Transformer("070D23EA-7F38-46B7-A667-219BEF914E49", 211)] internal sealed class DoubleTransformer : DoubleBoxTransformer { protected override double ToBoxType(double value, Mapper mapper) { return value; } protected override double ToValueType(double value, Type type, Mapper mapper) { return value; } } [Transformer("BA55C7A6-C91E-4351-A889-E4A7E647F16D", 213)] internal sealed class DateTimeTransformer : LongBoxTransformer { protected override long ToBoxType(DateTime value, Mapper mapper) { return value.Ticks; } protected override DateTime ToValueType(long value, Type type, Mapper mapper) { return new DateTime(value); } } [Transformer("0C91441B-2D97-432B-B493-D6EC483FC5AD", 214)] internal sealed class TimeSpanTransformer : LongBoxTransformer { protected override long ToBoxType(TimeSpan value, Mapper mapper) { return value.Ticks; } protected override TimeSpan ToValueType(long value, Type type, Mapper mapper) { return new TimeSpan(value); } } [Transformer("0B540EAC-79AB-40CF-8277-D2C81135FEB6", 217)] internal sealed class ColorTransformers : IntBoxTransformer { protected override int ToBoxType(Color value, Mapper mapper) { return value.ToArgb(); } protected override Color ToValueType(int value, Type type, Mapper mapper) { return Color.FromArgb(value); } } #endregion #region String [Transformer("E75A594C-0034-4DAB-B28E-8F84F9F6DE8D", 215)] internal sealed class StringTransformer : UnsignedIntBoxTransformer { protected override uint ToBoxType(string value, Mapper mapper) { return mapper.GetStringId(value); } protected override string ToValueType(uint value, Type type, Mapper mapper) { return mapper.GetString(value); } } #endregion #region Enum [Transformer("93FF076B-BC4B-4C39-8C40-15E004468C98", 216)] internal sealed class EnumTransformer : UnsignedIntBoxTransformer { public override bool CanTransformType(Type type) { return typeof(Enum).IsAssignableFrom(type); } protected override uint ToBoxType(object value, Mapper mapper) { return mapper.GetStringId(Enum.Format(value.GetType(), value, "G")); } protected override object ToValueType(uint value, Type type, Mapper mapper) { return Enum.Parse(type, mapper.GetString(value)); } } #endregion #region Type [Transformer("8D17FD28-383B-44E9-9BBF-B19D351C5E38", 218)] internal sealed class TypeTransformer : UnsignedIntBoxTransformer { public override bool CanTransformType(Type type) { return typeof(Type).IsAssignableFrom(type); } protected override uint ToBoxType(Type value, Mapper mapper) { return mapper.GetTypeId(value); } protected override Type ToValueType(uint value, Type type, Mapper mapper) { return mapper.GetType(value); } } #endregion #region Primitive Array Types [Transformer("F25A73B2-6B67-4493-BD59-B836AF4455D1", 300)] internal sealed class BoolArrayTransformer : BoolArrayBoxTransformer { protected override IEnumerable ToBoxType(bool[] value, Mapper mapper) { return value; } protected override bool[] ToValueType(IEnumerable value, Type type, Mapper mapper) { return value.ToArray(); } } [Transformer("FF89F6D1-CDE3-498E-9166-F70AC6EB01F1", 301)] internal sealed class ByteArrayTransformer : UnsignedIntArrayBoxTransformer { protected override IEnumerable ToBoxType(byte[] value, Mapper mapper) { return value.Cast(); } protected override byte[] ToValueType(IEnumerable value, Type type, Mapper mapper) { return value.Cast().ToArray(); } } [Transformer("B49B3F2D-2E97-4BAB-8705-8D29DA707C6A", 302)] internal sealed class SByteArrayTransformer : IntArrayBoxTransformer { protected override IEnumerable ToBoxType(sbyte[] value, Mapper mapper) { return value.Cast(); } protected override sbyte[] ToValueType(IEnumerable value, Type type, Mapper mapper) { return value.Cast().ToArray(); } } [Transformer("2811FDD4-6800-4CBA-86D7-9071ED5775ED", 303)] internal sealed class ShortArrayTransformer : IntArrayBoxTransformer { protected override IEnumerable ToBoxType(short[] value, Mapper mapper) { return value.Cast(); } protected override short[] ToValueType(IEnumerable value, Type type, Mapper mapper) { return value.Cast().ToArray(); } } [Transformer("1AAC2625-356C-40BC-8CB4-15CB3D047EB8", 304)] internal sealed class UShortArrayTransformer : UnsignedIntArrayBoxTransformer { protected override IEnumerable ToBoxType(ushort[] value, Mapper mapper) { return value.Cast(); } protected override ushort[] ToValueType(IEnumerable value, Type type, Mapper mapper) { return value.Cast().ToArray(); } } [Transformer("12F19098-5D49-4C23-8897-69087F1C146D", 305)] internal sealed class CharArrayTransformer : UnsignedIntArrayBoxTransformer { protected override IEnumerable ToBoxType(char[] value, Mapper mapper) { return value.Cast(); } protected override char[] ToValueType(IEnumerable value, Type type, Mapper mapper) { return value.Cast().ToArray(); } } [Transformer("5F6DC3BC-4433-4AE9-A636-4BD126F7DACD", 306)] internal sealed class IntArrayTransformer : IntArrayBoxTransformer { protected override IEnumerable ToBoxType(int[] value, Mapper mapper) { return value; } protected override int[] ToValueType(IEnumerable value, Type type, Mapper mapper) { return value.ToArray(); } } [Transformer("3F10274F-D350-4C82-89EA-A5EB36D4EFCC", 307)] internal sealed class UIntArrayTransformer : UnsignedIntArrayBoxTransformer { protected override IEnumerable ToBoxType(uint[] value, Mapper mapper) { return value; } protected override uint[] ToValueType(IEnumerable value, Type type, Mapper mapper) { return value.ToArray(); } } [Transformer("E9D550E2-57F7-47F3-803D-37A619DA1A5C", 308)] internal sealed class LongArrayTransformer : LongArrayBoxTransformer { protected override IEnumerable ToBoxType(long[] value, Mapper mapper) { return value; } protected override long[] ToValueType(IEnumerable value, Type type, Mapper mapper) { return value.ToArray(); } } [Transformer("C02A205B-2176-4282-AC2B-ADEF96DDBE24", 309)] internal sealed class ULongArrayTransformer : UnsignedLongArrayBoxTransformer { protected override IEnumerable ToBoxType(ulong[] value, Mapper mapper) { return value; } protected override ulong[] ToValueType(IEnumerable value, Type type, Mapper mapper) { return value.ToArray(); } } [Transformer("3C4590D9-C76E-4AFB-98FD-E50D3D051648", 310)] internal sealed class FloatArrayTransformer : FloatArrayBoxTransformer { protected override IEnumerable ToBoxType(float[] value, Mapper mapper) { return value; } protected override float[] ToValueType(IEnumerable value, Type type, Mapper mapper) { return value.ToArray(); } } [Transformer("FB98C399-9323-4470-9A85-9186C2B2D5D4", 311)] internal sealed class DoubleArrayTransformer : DoubleArrayBoxTransformer { protected override IEnumerable ToBoxType(double[] value, Mapper mapper) { return value; } protected override double[] ToValueType(IEnumerable value, Type type, Mapper mapper) { return value.ToArray(); } } [Transformer("68332513-9CF1-47FA-A093-6DDB663186EC", 312)] internal sealed class StringArrayTransformer : StringArrayBoxTransformer { protected override IEnumerable ToBoxType(string[] value, Mapper mapper) { return value; } protected override string[] ToValueType(IEnumerable value, Type type, Mapper mapper) { return value.ToArray(); } } #endregion }