using System; namespace Vellum.UnitTests { public class Creature { public string Name; } public class Wolf : Creature { } public class AlphaWolf : Wolf { } public abstract class AbstractCreature : Creature { } public class Mastiff : AbstractCreature { } public class Herd { public MemberType Lead; } public class IntHerd : Herd { } public class StringHerd : Herd { } public class LabeledHerd : Herd { public LabelType Label; } public class NameHerd : LabeledHerd { } // The generator reports each, and the pragma silences what it says. #pragma warning disable VEL0002, VEL0007 /// /// Counts the converters made for each closed type, since a static in a generic class is one per closed type. /// public class CreatureConverter : SaveConverter where CreatureType : Creature { public static int Made; public CreatureConverter() { ++Made; } public override SaveNode Write(CreatureType value, SaveSession session) { return SaveNode.OfText(value.Name); } public override CreatureType Read(SaveNode node, SaveSession session) { var returnMe = (CreatureType)Activator.CreateInstance(typeof(CreatureType)); returnMe.Name = node.RequireText(); return returnMe; } } public class WolfConverter : SaveConverter where WolfType : Wolf { public override SaveNode Write(WolfType value, SaveSession session) { return SaveNode.OfText("wolf " + value.Name); } public override WolfType Read(SaveNode node, SaveSession session) { var returnMe = (WolfType)Activator.CreateInstance(typeof(WolfType)); returnMe.Name = node.RequireText().Substring("wolf ".Length); return returnMe; } } public class HerdConverter : SaveConverter where HerdType : Herd { public override SaveNode Write(HerdType value, SaveSession session) { SaveNode returnMe = SaveNode.NewTable(); returnMe.Entries["lead"] = session.ToNode(value.Lead, typeof(MemberType)); return returnMe; } public override HerdType Read(SaveNode node, SaveSession session) { var returnMe = (HerdType)Activator.CreateInstance(typeof(HerdType)); returnMe.Lead = (MemberType)session.FromNode(node.RequireEntry("lead"), typeof(MemberType)); return returnMe; } } public class StructLabeledHerdConverter : SaveConverter where HerdType : LabeledHerd where MemberType : struct { public override SaveNode Write(HerdType value, SaveSession session) { return SaveNode.OfText("struct labeled herd"); } public override HerdType Read(SaveNode node, SaveSession session) { return default(HerdType); } } public class StructHerdConverter : SaveConverter where HerdType : Herd where MemberType : struct { public override SaveNode Write(HerdType value, SaveSession session) { return SaveNode.Null; } public override HerdType Read(SaveNode node, SaveSession session) { return default(HerdType); } } public class ThrowingCreatureConverter : SaveConverter where CreatureType : Creature { public ThrowingCreatureConverter() { throw new FormatException("no converter for you"); } public override SaveNode Write(CreatureType value, SaveSession session) { return SaveNode.Null; } public override CreatureType Read(SaveNode node, SaveSession session) { return default(CreatureType); } } public class ThrowingBoxConverter : SaveConverter> { public ThrowingBoxConverter() { throw new FormatException("no converter for you"); } public override SaveNode Write(Box value, SaveSession session) { return SaveNode.Null; } public override Box Read(SaveNode node, SaveSession session) { return null; } } public class TwoConstraintFamilyConverter : SaveConverter where CreatureType : Creature, IDisposable { public override SaveNode Write(CreatureType value, SaveSession session) { return SaveNode.Null; } public override CreatureType Read(SaveNode node, SaveSession session) { return default(CreatureType); } } public class ClassConstrainedFamilyConverter : SaveConverter where CreatureType : class { public override SaveNode Write(CreatureType value, SaveSession session) { return SaveNode.Null; } public override CreatureType Read(SaveNode node, SaveSession session) { return default(CreatureType); } } public class NewConstrainedFamilyConverter : SaveConverter where CreatureType : Creature, new() { public override SaveNode Write(CreatureType value, SaveSession session) { return SaveNode.Null; } public override CreatureType Read(SaveNode node, SaveSession session) { return default(CreatureType); } } public class InterfaceFamilyConverter : SaveConverter where DisposableType : ICloneable { public override SaveNode Write(DisposableType value, SaveSession session) { return SaveNode.Null; } public override DisposableType Read(SaveNode node, SaveSession session) { return default(DisposableType); } } public class ParameterConstrainedFamilyConverter : SaveConverter where CreatureType : BaseType { public override SaveNode Write(CreatureType value, SaveSession session) { return SaveNode.Null; } public override CreatureType Read(SaveNode node, SaveSession session) { return default(CreatureType); } } public class UnboundFamilyConverter : SaveConverter where CreatureType : Creature { public override SaveNode Write(CreatureType value, SaveSession session) { return SaveNode.Null; } public override CreatureType Read(SaveNode node, SaveSession session) { return default(CreatureType); } } public class SelfReferencingFamilyConverter : SaveConverter where HerdType : Herd { public override SaveNode Write(HerdType value, SaveSession session) { return SaveNode.Null; } public override HerdType Read(SaveNode node, SaveSession session) { return default(HerdType); } } public class ClosedBaseFamilyConverter : SaveConverter where HerdType : Herd { public override SaveNode Write(HerdType value, SaveSession session) { return SaveNode.Null; } public override HerdType Read(SaveNode node, SaveSession session) { return default(HerdType); } } public class RepeatedBaseArgumentFamilyConverter : SaveConverter where HerdType : Pairing { public override SaveNode Write(HerdType value, SaveSession session) { return SaveNode.Null; } public override HerdType Read(SaveNode node, SaveSession session) { return default(HerdType); } } #pragma warning restore VEL0002, VEL0007 public class Pairing { } }