#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.Drawing;
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 Value Boxes
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 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 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 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);
}
#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); }
}
#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