#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 System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using Google.Protobuf;
namespace HeuristicLab.Persistence {
[StorableType("8c7e99f5-092f-4cef-8b72-8afec1d10236")]
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 = new Box {
TransformerId = mapper.GetTransformerId(this),
TypeId = mapper.GetBoxId(o.GetType())
};
Populate(box, (T)o, mapper);
return box;
}
public override object ToObject(Box box, Mapper mapper) {
return Extract(box, (Type)mapper.GetObject(box.TypeId), mapper);
}
protected abstract void Populate(Box box, T value, Mapper mapper);
protected abstract T Extract(Box box, Type type, Mapper mapper);
}
[Transformer("854156DA-2A37-450F-92ED-355FBBD8D131", 50)]
[StorableType("D48991BB-1DDA-4D64-A2E6-5B5608F85F2A")]
internal sealed class TypeTransformer : Transformer {
public override bool CanTransformType(Type type) {
return typeof(Type).IsAssignableFrom(type);
}
public override Box ToBox(object o, Mapper mapper) {
var box = new Box {
TransformerId = mapper.GetTransformerId(this)
};
Populate(box, o, mapper);
return box;
}
private void Populate(Box box, object value, Mapper mapper) {
var type = (Type)value;
var typeBox = new TypeBox();
if (type.IsGenericType) {
box.TypeId = mapper.GetTypeId(type.GetGenericTypeDefinition());
typeBox.GenericTypeIds.AddRange(type.GetGenericArguments().Select(mapper.GetBoxId));
} else if (type.IsArray) {
box.TypeId = mapper.GetTypeId(typeof(Array));
typeBox.GenericTypeIds.Add(mapper.GetBoxId(type.GetElementType()));
} else {
box.TypeId = mapper.GetTypeId(type);
}
if (StorableTypeAttribute.IsStorableType(type))
typeBox.Version = StorableTypeAttribute.GetStorableTypeAttribute(type).Version;
box.BoxId = mapper.GetTypeBoxId(typeBox);
}
public override object ToObject(Box box, Mapper mapper) {
return Extract(box, mapper.GetType(box.TypeId), mapper);
}
private object Extract(Box box, Type type, Mapper mapper) {
var typeBox = mapper.GetTypeBox(box.BoxId);
if (type.IsGenericType) {
return type.MakeGenericType(typeBox.GenericTypeIds.Select(id => (Type)mapper.GetObject(id)).ToArray());
} else if (type == typeof(Array)) {
return ((Type)mapper.GetObject(typeBox.GenericTypeIds[0])).MakeArrayType();
} else {
return type;
}
}
}
[Transformer("4C610596-5234-4C49-998E-30007D64492E", 100)]
[StorableType("69870239-00B7-4C9D-AF0B-14208069FAC8")]
internal sealed class StringBoxTransformer : BoxTransformer {
protected override void Populate(Box box, string value, Mapper mapper) { box.UInt = mapper.GetStringId(value); }
protected override string Extract(Box box, Type type, Mapper mapper) { return mapper.GetString(box.UInt); }
}
[Transformer("58E69402-2533-426A-B9B5-9F2EB5241560", 101)]
[StorableType("667182BB-D2D5-46C6-97CB-593CE1B19CBC")]
internal sealed class BoolBoxTransformer : BoxTransformer {
protected override void Populate(Box box, bool value, Mapper mapper) { box.Bool = value; }
protected override bool Extract(Box box, Type type, Mapper mapper) { return box.Bool; }
}
[Transformer("D78F3391-3CAE-4376-9348-7FB38A4DE0EB", 102)]
[StorableType("1E75D1D8-3FAD-4D68-86BB-95DE981FDDD2")]
internal sealed class IntBoxTransformer : BoxTransformer {
protected override void Populate(Box box, int value, Mapper mapper) { box.Int = value; }
protected override int Extract(Box box, Type type, Mapper mapper) { return box.Int; }
}
[Transformer("25881263-F452-492E-9FD1-24E1938B048B", 103)]
[StorableType("7742A4A3-31B4-4449-9657-0D9F50F2382F")]
internal sealed class UIntBoxTransformer : BoxTransformer {
protected override void Populate(Box box, uint value, Mapper mapper) { box.UInt = value; }
protected override uint Extract(Box box, Type type, Mapper mapper) { return box.UInt; }
}
[Transformer("F4175165-382B-4B03-921E-5F923510FB1E", 104)]
[StorableType("985427E0-E4F0-4182-8D30-63DA7FB69735")]
internal sealed class LongBoxTransformer : BoxTransformer {
protected override void Populate(Box box, long value, Mapper mapper) { box.Long = value; }
protected override long Extract(Box box, Type type, Mapper mapper) { return box.Long; }
}
[Transformer("E8F63973-3C0C-4FA9-B068-40EF4463B30B", 105)]
[StorableType("C9F95D84-BCDC-498E-A9AE-7187E483BBBA")]
internal sealed class ULongBoxTransformer : BoxTransformer {
protected override void Populate(Box box, ulong value, Mapper mapper) { box.ULong = value; }
protected override ulong Extract(Box box, Type type, Mapper mapper) { return box.ULong; }
}
[Transformer("15489146-EA11-4B90-8020-AF5C10A2531C", 106)]
[StorableType("AF1C5176-859C-423B-A2BF-2AEA4D0792C7")]
internal sealed class FloatBoxTransformer : BoxTransformer {
protected override void Populate(Box box, float value, Mapper mapper) { box.Float = value; }
protected override float Extract(Box box, Type type, Mapper mapper) { return box.Float; }
}
[Transformer("91FD51F3-9C47-4944-AC85-273ED0561E87", 107)]
[StorableType("4AB25AE9-2600-4041-8F31-C02CCE9A3BEC")]
internal sealed class DoubleBoxTransformer : BoxTransformer {
protected override void Populate(Box box, double value, Mapper mapper) { box.Double = value; }
protected override double Extract(Box box, Type type, Mapper mapper) { return box.Double; }
}
[Transformer("BCB087EA-E477-47EB-9BCE-8C64BAC2F288", 108)]
[StorableType("341C2F99-8849-408E-99AA-7700FE0FB789")]
internal sealed class ByteBoxTransformer : BoxTransformer {
protected override void Populate(Box box, byte value, Mapper mapper) { box.UInt = value; }
protected override byte Extract(Box box, Type type, Mapper mapper) { return (byte)box.UInt; }
}
[Transformer("B90F61D9-75D0-4CAC-AF93-B8C6AB68F642", 109)]
[StorableType("FEC52DD5-A422-45C4-995F-09F3B0DEC13F")]
internal sealed class SByteBoxTransformer : BoxTransformer {
protected override void Populate(Box box, sbyte value, Mapper mapper) { box.Int = value; }
protected override sbyte Extract(Box box, Type type, Mapper mapper) { return (sbyte)box.Int; }
}
[Transformer("95EB44A4-EADD-4DA9-B60F-3262FAD6134B", 110)]
[StorableType("48744968-15F2-4B22-AAF2-6C0910239384")]
internal sealed class ShortBoxTransformer : BoxTransformer {
protected override void Populate(Box box, short value, Mapper mapper) { box.Int = value; }
protected override short Extract(Box box, Type type, Mapper mapper) { return (short)box.Int; }
}
[Transformer("E3A33614-9120-400E-BAD9-2594F6804DA8", 111)]
[StorableType("DCF05BA3-3C57-4DBB-96B4-B2CE31CA60C5")]
internal sealed class UShortBoxTransformer : BoxTransformer {
protected override void Populate(Box box, ushort value, Mapper mapper) { box.Int = value; }
protected override ushort Extract(Box box, Type type, Mapper mapper) { return (ushort)box.Int; }
}
[Transformer("C64EA534-E2E1-48F0-86C5-648AA02117BC", 112)]
[StorableType("142980B3-A251-48D2-BF02-A66C483D6385")]
internal sealed class CharBoxTransformer : BoxTransformer {
protected override void Populate(Box box, char value, Mapper mapper) { box.UInt = value; }
protected override char Extract(Box box, Type type, Mapper mapper) { return (char)box.UInt; }
}
[Transformer("D50C4782-7211-4476-B50F-7D3378EE3E53", 200)]
[StorableType("4397B775-7D48-4C2A-8D28-ACC8C196CF70")]
internal sealed class StringArrayBoxTransformer : BoxTransformer {
protected override void Populate(Box box, string[] value, Mapper mapper) {
var unsignedIntArrayBox = new UnsignedIntArrayBox();
unsignedIntArrayBox.Values.AddRange(value.Select(mapper.GetStringId));
box.BoxId = mapper.GetUnsignedIntArrayBoxId(unsignedIntArrayBox);
}
protected override string[] Extract(Box box, Type type, Mapper mapper) {
var unsignedIntArrayBox = mapper.GetUnsignedIntArrayBox(box.BoxId);
return unsignedIntArrayBox.Values.Select(mapper.GetString).ToArray();
}
}
[Transformer("C9CFA67B-DF13-4125-B781-98EC8F5E390F", 201)]
[StorableType("9719DB59-C6BC-4788-BBB0-389A1B49CFEE")]
internal sealed class BoolArrayBoxTransformer : BoxTransformer {
protected override void Populate(Box box, bool[] value, Mapper mapper) {
var boolArrayBox = new BoolArrayBox();
boolArrayBox.Values.AddRange(value);
box.BoxId = mapper.GetBoolArrayBoxId(boolArrayBox);
}
protected override bool[] Extract(Box box, Type type, Mapper mapper) {
var boolArrayBox = mapper.GetBoolArrayBox(box.BoxId);
return boolArrayBox.Values.ToArray();
}
}
[Transformer("BA2E18F6-5C17-40CA-A5B8-5690C5EFE872", 202)]
[StorableType("6548E9F0-621D-47BA-A605-8A47EF85C231")]
internal sealed class IntArrayBoxTransformer : BoxTransformer {
protected override void Populate(Box box, int[] value, Mapper mapper) {
var intArrayBox = new IntArrayBox();
intArrayBox.Values.AddRange(value);
box.BoxId = mapper.GetIntArrayBoxId(intArrayBox);
}
protected override int[] Extract(Box box, Type type, Mapper mapper) {
var intArrayBox = mapper.GetIntArrayBox(box.BoxId);
return intArrayBox.Values.ToArray();
}
}
[Transformer("EEE7710D-86DE-47E1-887D-BDA2996B141E", 203)]
[StorableType("4127B466-AFC0-4050-8C45-1376A0E3E016")]
internal sealed class UnsignedIntArrayBoxTransformer : BoxTransformer {
protected override void Populate(Box box, uint[] value, Mapper mapper) {
var unsignedIntArrayBox = new UnsignedIntArrayBox();
unsignedIntArrayBox.Values.AddRange(value);
box.BoxId = mapper.GetUnsignedIntArrayBoxId(unsignedIntArrayBox);
}
protected override uint[] Extract(Box box, Type type, Mapper mapper) {
var unsignedIntArrayBox = mapper.GetUnsignedIntArrayBox(box.BoxId);
return unsignedIntArrayBox.Values.ToArray();
}
}
[Transformer("557932AA-F023-477F-AAD0-5098E8B8CD56", 204)]
[StorableType("C2ED50C8-C340-40C1-B00C-2F398EB709A0")]
internal sealed class LongArrayBoxTransformer : BoxTransformer {
protected override void Populate(Box box, long[] value, Mapper mapper) {
var longArrayBox = new LongArrayBox();
longArrayBox.Values.AddRange(value);
box.BoxId = mapper.GetLongArrayBoxId(longArrayBox);
}
protected override long[] Extract(Box box, Type type, Mapper mapper) {
var longArrayBox = mapper.GetLongArrayBox(box.BoxId);
return longArrayBox.Values.ToArray();
}
}
[Transformer("CFF20DEE-2A55-4D04-B543-A4C7E0A8F7BF", 205)]
[StorableType("641AE353-5373-4811-BACB-C13D3144809C")]
internal sealed class UnsignedLongArrayBoxTransformer : BoxTransformer {
protected override void Populate(Box box, ulong[] value, Mapper mapper) {
var unsignedLongArrayBox = new UnsignedLongArrayBox();
unsignedLongArrayBox.Values.AddRange(value);
box.BoxId = mapper.GetUnsignedLongArrayBoxId(unsignedLongArrayBox);
}
protected override ulong[] Extract(Box box, Type type, Mapper mapper) {
var unsignedLongArrayBox = mapper.GetUnsignedLongArrayBox(box.BoxId);
return unsignedLongArrayBox.Values.ToArray();
}
}
[Transformer("2A0F766D-FE71-4415-A75F-A32FB8BB9E2D", 206)]
[StorableType("AEE9384F-3857-4CE4-AE30-B99474F7A6C9")]
internal sealed class FloatArrayBoxTransformer : BoxTransformer {
protected override void Populate(Box box, float[] value, Mapper mapper) {
var floatArrayBox = new FloatArrayBox();
floatArrayBox.Values.AddRange(value);
box.BoxId = mapper.GetFloatArrayBoxId(floatArrayBox);
}
protected override float[] Extract(Box box, Type type, Mapper mapper) {
var floatArrayBox = mapper.GetFloatArrayBox(box.BoxId);
return floatArrayBox.Values.ToArray();
}
}
[Transformer("192A8F7D-84C7-44BF-B0CA-AD387A241AAD", 207)]
[StorableType("17D0BA74-CB84-405C-8DBB-D9E361274A0A")]
internal sealed class DoubleArrayBoxTransformer : BoxTransformer {
protected override void Populate(Box box, double[] value, Mapper mapper) {
var doubleArrayBox = new DoubleArrayBox();
doubleArrayBox.Values.AddRange(value);
box.BoxId = mapper.GetDoubleArrayBoxId(doubleArrayBox);
}
protected override double[] Extract(Box box, Type type, Mapper mapper) {
var doubleArrayBox = mapper.GetDoubleArrayBox(box.BoxId);
return doubleArrayBox.Values.ToArray();
}
}
[Transformer("3A35CECE-9953-4C29-A796-A56C02D80A05", 208)]
[StorableType("A076D11E-89AA-43C8-87F5-A0D0F52569EB")]
internal sealed class ByteArrayBoxTransformer : BoxTransformer {
protected override void Populate(Box box, byte[] value, Mapper mapper) {
box.Bytes = ByteString.CopyFrom(value);
}
protected override byte[] Extract(Box box, Type type, Mapper mapper) {
return box.Bytes.ToArray();
}
}
[Transformer("880D4A63-6C77-4F9F-8F7C-2D365F0AE829", 209)]
[StorableType("74F6FD4B-D7D7-43CD-B28B-3A775505FEE3")]
internal sealed class SByteArrayBoxTransformer : BoxTransformer {
protected override void Populate(Box box, sbyte[] value, Mapper mapper) {
box.Bytes = ByteString.CopyFrom(value.Select(x => (byte)x).ToArray());
}
protected override sbyte[] Extract(Box box, Type type, Mapper mapper) {
return box.Bytes.Select(x => (sbyte)x).ToArray();
}
}
[Transformer("9786E711-7C1D-4761-BD6B-445793834264", 210)]
[StorableType("5F32480E-AACB-4DB3-ADE3-1CF36E33C037")]
internal sealed class ShortArrayBoxTransformer : BoxTransformer {
protected override void Populate(Box box, short[] value, Mapper mapper) {
var res = new byte[value.Length * 2];
for (int i = 0; i < value.Length; i++) {
var bytes = BitConverter.GetBytes(value[i]);
Array.Copy(bytes, 0, res, i * 2, 2);
}
box.Bytes = ByteString.CopyFrom(res);
}
protected override short[] Extract(Box box, Type type, Mapper mapper) {
var bytes = box.Bytes.ToArray();
var res = new short[bytes.Length / 2];
for (int i = 0; i < bytes.Length; i += 2) {
res[i / 2] = BitConverter.ToInt16(bytes, i);
}
return res;
}
}
[Transformer("1AAC2625-356C-40BC-8CB4-15CB3D047EB8", 211)]
[StorableType("C303B4CF-FFD0-47E2-9D94-07F2D558D17F")]
internal sealed class UShortArrayTransformer : BoxTransformer {
protected override void Populate(Box box, ushort[] value, Mapper mapper) {
var res = new byte[value.Length * 2];
for (int i = 0; i < value.Length; i++) {
var bytes = BitConverter.GetBytes(value[i]);
Array.Copy(bytes, 0, res, i * 2, 2);
}
box.Bytes = ByteString.CopyFrom(res);
}
protected override ushort[] Extract(Box box, Type type, Mapper mapper) {
var bytes = box.Bytes.ToArray();
var res = new ushort[bytes.Length / 2];
for (int i = 0; i < bytes.Length; i += 2) {
res[i / 2] = BitConverter.ToUInt16(bytes, i);
}
return res;
}
}
[Transformer("12F19098-5D49-4C23-8897-69087F1C146D", 212)]
[StorableType("55F7C8B0-F2AA-4830-857D-6CE2807DA138")]
internal sealed class CharArrayTransformer : BoxTransformer {
protected override void Populate(Box box, char[] value, Mapper mapper) {
var res = new byte[value.Length * 2];
for (int i = 0; i < value.Length; i++) {
var bytes = BitConverter.GetBytes(value[i]);
Array.Copy(bytes, 0, res, i * 2, 2);
}
box.Bytes = ByteString.CopyFrom(res);
}
protected override char[] Extract(Box box, Type type, Mapper mapper) {
var bytes = box.Bytes.ToArray();
var res = new char[bytes.Length / 2];
for (int i = 0; i < bytes.Length; i += 2) {
res[i / 2] = BitConverter.ToChar(bytes, i);
}
return res;
}
}
[Transformer("05AE4C5D-4D0C-47C7-B6D5-F04230C6F565", 301)]
[StorableType("A74820C8-F400-462A-913A-610BB588D04A")]
internal sealed class ArrayBoxTransformer : BoxTransformer