diff --git a/src/GraphClimber/Program.cs b/src/GraphClimber/Program.cs index f52d9f6..db8a8ac 100644 --- a/src/GraphClimber/Program.cs +++ b/src/GraphClimber/Program.cs @@ -1,277 +1,108 @@ using System; -using System.Collections; using System.Collections.Generic; -using System.IO; -using System.Linq.Expressions; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Xml.Linq; -using GraphClimber.Examples; -using GraphClimber.ExpressionCompiler; -using GraphClimber.ValueDescriptor; namespace GraphClimber { - enum Days + class Program { - Sunday, - Monday, - Tuesday, - Wendensday, - Thursday, - Friday, - Saturday - } - - public class ExpressionDebugGames - { - private static int PrivateField = 2; - - private static int PrivateProperty - { - get { return 5; } - } - - private static int PrivateMethod() - { - return 3; - } - - private static int GenericMethod(TEnum value) where TEnum : IConvertible - { - return 2; - } - - public static void Play() + static void Main(string[] args) { + Person person = new Person() + { + Age = 26, + Name = "Or Bar Yosef", + Parent = new Person() + { + Name = "Avi", + Age = 27, + Surprise = new object[] + { + 213, + "Shalom", + new Person() + { + Name = "sad" + }, + new int[,]{{1,1,2},{3,5,8}} + } + } + }; - Expression> hi = () => typeof(int); - - MemberExpression propertyOrField = Expression.Field(null, typeof(ExpressionDebugGames).GetField("PrivateField", BindingFlags.Static | BindingFlags.NonPublic)); - MemberExpression property = Expression.Property(null, typeof(ExpressionDebugGames), "PrivateProperty"); - MethodCallExpression method = Expression.Call(null, - typeof(ExpressionDebugGames).GetMethod("PrivateMethod", BindingFlags.NonPublic | BindingFlags.Static).MakeGenericMethod(typeof(object))); - - var parameter = Expression.Parameter(typeof(int), "someNumberArgument"); - - var variable = Expression.Variable(typeof(int), "myInt"); - var @break = Expression.Label(); - Expression exp = Expression.Assign(variable, Expression.Divide(propertyOrField, Expression.Subtract(property, method))); - exp = Expression.Block(new[] { variable }, exp, Expression.Add(Expression.Constant(2), Expression.Constant(5)), Expression.Call(typeof(Console).GetMethod("WriteLine", new[] { typeof(string) }), Expression.Constant("Hello Worlda")), - Expression.Goto(@break)); - - - exp = Expression.Loop(exp, @break); - exp = Expression.Block(exp, - Expression.Call(typeof(Console).GetMethod("WriteLine", new[] { typeof(string) }), - Expression.Constant("Goodbye"))); + Extractor myExtractor = new Extractor(); - var lambda = Expression.Lambda>(exp, "Hello_World", - new[] { parameter }); + IEnumerable comparables = myExtractor.Extract(person); - var expression = new DebugExpressionCompiler(DebugViewExpressionDescriber.Empty).Compile(lambda); + foreach (IComparable comparable in comparables) + { + Console.WriteLine(comparable); + } - expression(56); - } - + } } - public class Program + public class Extractor { - private static readonly IStateMemberProvider _stateMemberProvider = new CachingStateMemberProvider(new ReflectionPropertyStateMemberProvider()); + private readonly SlowGraphClimber> _climber; - public static void DoSomething(StrongBox hello) + public Extractor() { - Console.WriteLine(hello); - } - - - static void Main(string[] args) - { - // ExpressionDebugGames.Play(); - //IStore store = new TrivialStore(); - - //store.Set("A", 5); - //store.GetInner("A").Set("A", 10); - - //SerializeDeserializeXML(); - - SerializeDeserializeStore(); - - //SerializeDeserializeBinary(); + _climber = + new SlowGraphClimber>(new ReflectionPropertyStateMemberProvider()); } - private static void SerializeDeserializeBinary() + public IEnumerable Extract(object value) { - var person = GetPerson2(); - - var stateMemberProvider = new BinaryStateMemberProvider(_stateMemberProvider); - - var writeClimber = new SlowGraphClimber(stateMemberProvider); - var readClimber = new SlowGraphClimber(stateMemberProvider); - - var stream = new MemoryStream(); - var binaryWriterProcessor = new BinaryWriterProcessor(new SuperBinaryWriter(stream)); + ExtractorProcessor processor = new ExtractorProcessor(); - writeClimber.Route(person, binaryWriterProcessor, false); - - stream.Position = 0; - var binaryReaderProcessor = new BinaryReaderProcessor(new SuperBinaryReader(stream)); + _climber.Route(value, processor, false); - var strongBox = new StrongBox(); - readClimber.Climb(strongBox, binaryReaderProcessor); + return processor.Result; } + } - private static void SerializeDeserializeXML() - { - var text = - @" - Shani Elharrar - 24 - - null - 23 - 4 - -"; - - - // Reader code: - SlowGraphClimber climber2 = - new SlowGraphClimber - (_stateMemberProvider); - - XElement reader = XElement.Parse(text); - - XmlReaderProcessor processor2 = - new XmlReaderProcessor(reader); - - Person person2 = new Person(); - - climber2.Climb(person2, - processor2); - - - // Writer code: - SlowGraphClimber climber = - new SlowGraphClimber - (_stateMemberProvider); - - Person person = new Person() - { - Age = 24, - Name = "Shani Elharrar", - Surprise = new Person() - { - Age = 23, - Name = null, - Surprise = 4 - } - }; - - XmlWriterProcessor processor = new XmlWriterProcessor(); - - climber.Climb(person, - processor); - } + internal class ExtractorProcessor : INullProcessor + { + private readonly List _gathered = new List(); - class Person + public IEnumerable Result { - public Person() + get { - Children = new List(); + return _gathered; } - - public string Name { get; set; } - - public int Age { get; set; } - - public object Surprise { get; set; } - - public Person Father { get; set; } - - public IList Children { get; set; } } - struct Person2 + [ProcessorMethod(Precedence = 1)] + public virtual void Process(IReadOnlyValueDescriptor descriptor) + where TRuntime : T { - public string Name { get; set; } - - public int Age { get; set; } - - public object Surprise { get; set; } - - public object Father { get; set; } - - public Days Day { get; set; } + T runtime = descriptor.Get(); + _gathered.Add(runtime); } - - public static void SerializeDeserializeStore() + [ProcessorMethod(Precedence = 2)] + public void ProcessGeneric + (IReadOnlyValueDescriptor descriptor) { - var store = new TrivialStore(); - - SlowGraphClimber climber = new SlowGraphClimber(_stateMemberProvider); - - var processor = new StoreWriterProcessor(store); - var box = new StrongBox(GetPerson()); - - climber.Climb(box, processor); - - - SlowGraphClimber readerClimber = new SlowGraphClimber(_stateMemberProvider); - - var readerProcessor = new StoreReaderProcessor(store); - var readBox = new StrongBox(null); - readerClimber.Climb(readBox, readerProcessor); - + descriptor.Climb(); } - private static Person GetPerson() + public void ProcessNull(IWriteOnlyValueDescriptor descriptor) { - var ilan = new Person { Age = 26 + 25, Name = "Ilan Zelingher", Surprise = 1 }; - ilan.Surprise = ilan; - return new Person() - { - Age = 26, - Name = "Elad Zelinger", - Father = ilan, - Children = { new Person() { Name = "Jason"}, new Person() { Name = "Tomerh" }}, - Surprise = new Person() - { - Age = 21, - Name = "Yosi Attias", - Surprise = ilan - } - }; + // Don't climb } + } - private static Person2 GetPerson2() - { - Person2 ilan = new Person2 { Age = 26 + 25, Name = "Ilan Zelingher" }; + public class Person + { + public string Name { get; set; } + + public int Age { get; set; } - ilan.Surprise = ilan; + public object Surprise { get; set; } - return new Person2() - { - Age = 26, - Name = "Elad Zelinger", - Father = ilan, - Day = Days.Tuesday, - Surprise = new Person2() - { - Age = 21, - Name = "Yosi Attias", - Surprise = - new object[] - { - ilan, ilan, 342, "Hello", - new int[]{1,1,2,3,5,8}, - new int[,]{{1,1},{2,3},{5,8}}, - Days.Saturday - } - } - }; - } + public Person Parent { get; set; } + + public Person[] Children { get; set; } } } \ No newline at end of file