/* Copyright (c) Microsoft Corporation All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT. See the Apache Version 2.0 License for specific language governing permissions and limitations under the License. */ // // � Microsoft Corporation. All rights reserved. // using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Text; using System.Reflection; using System.Linq; using System.Data.SqlTypes; using System.Diagnostics; using Microsoft.Research.DryadLinq.Internal; using Microsoft.Research.DryadLinq; namespace Microsoft.Research.DryadLinq { // If a class T implements HpcSerializer, HpcLinq will use the // read and write methods of the class to do serialization. public interface IHpcSerializer { T Read(HpcBinaryReader reader); void Write(HpcBinaryWriter writer, T x); } } namespace Microsoft.Research.DryadLinq.Internal { public abstract class HpcSerializer : IHpcSerializer { public HpcSerializer() { } public abstract T Read(HpcBinaryReader reader); public abstract void Write(HpcBinaryWriter writer, T x); } internal struct HpcLinqSequence : IEnumerable { private T[] elements; internal HpcLinqSequence(T[] elems) { this.elements = elems; } internal int Count() { return this.elements.Length; } IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return this.GetEnumerator(); } internal IEnumerator GetEnumerator() { foreach (T x in this.elements) { yield return x; } } } // The only use is to handle Nullable. public static class StructHpcSerialization where T : struct where S : HpcSerializer, new() { private static S serializer = new S(); public static void Read(HpcBinaryReader reader, out Nullable val) { bool hasValue = reader.ReadBool(); if (hasValue) { val = serializer.Read(reader); } else { val = null; } } public static void Write(HpcBinaryWriter writer, Nullable val) { writer.Write(val.HasValue); if (val.HasValue) { serializer.Write(writer, val.Value); } } } public static class StructHpcSerialization where T1 : struct where T2 : struct where S1 : HpcSerializer, new() where S2 : HpcSerializer, new() { private static S1 serializer1 = new S1(); private static S2 serializer2 = new S2(); } // A workaround to deal with some limitation of C# generics public static class HpcSerialization where S : HpcSerializer, new() { private static S serializer = new S(); public static void Read(HpcBinaryReader reader, out List list) { int cnt = reader.ReadInt32(); list = new List(cnt); for (int i = 0; i < cnt; i++) { list.Add(serializer.Read(reader)); } } public static void Write(HpcBinaryWriter writer, List list) { writer.Write(list.Count); foreach (T elem in list) { serializer.Write(writer, elem); } } public static void Read(HpcBinaryReader reader, out LinkedList list) { int cnt = reader.ReadInt32(); list = new LinkedList(); for (int i = 0; i < cnt; i++) { list.AddLast(serializer.Read(reader)); } } public static void Write(HpcBinaryWriter writer, LinkedList list) { writer.Write(list.Count); foreach (T elem in list) { serializer.Write(writer, elem); } } public static void Read(HpcBinaryReader reader, out Queue queue) { int cnt = reader.ReadInt32(); queue = new Queue(cnt); for (int i = 0; i < cnt; i++) { queue.Enqueue(serializer.Read(reader)); } } public static void Write(HpcBinaryWriter writer, Queue queue) { writer.Write(queue.Count); foreach (T elem in queue) { serializer.Write(writer, elem); } } public static void Read(HpcBinaryReader reader, out Stack stack) { int cnt = reader.ReadInt32(); stack = new Stack(cnt); for (int i = 0; i < cnt; i++) { stack.Push(serializer.Read(reader)); } } public static void Write(HpcBinaryWriter writer, Stack stack) { writer.Write(stack.Count); foreach (T elem in stack) { serializer.Write(writer, elem); } } public static void Read(HpcBinaryReader reader, out HashSet set) { int cnt = reader.ReadInt32(); set = new HashSet(); for (int i = 0; i < cnt; i++) { set.Add(serializer.Read(reader)); } } public static void Write(HpcBinaryWriter writer, HashSet set) { writer.Write(set.Count); foreach (T elem in set) { serializer.Write(writer, elem); } } public static void Read(HpcBinaryReader reader, out Collection set) { int cnt = reader.ReadInt32(); set = new Collection(); for (int i = 0; i < cnt; i++) { set.Add(serializer.Read(reader)); } } public static void Write(HpcBinaryWriter writer, Collection set) { writer.Write(set.Count); foreach (T elem in set) { serializer.Write(writer, elem); } } public static void Read(HpcBinaryReader reader, out ReadOnlyCollection set) { int cnt = reader.ReadInt32(); List lst = new List(cnt); for (int i = 0; i < cnt; i++) { lst.Add(serializer.Read(reader)); } set = new ReadOnlyCollection(lst); } public static void Write(HpcBinaryWriter writer, ReadOnlyCollection set) { writer.Write(set.Count); foreach (T elem in set) { serializer.Write(writer, elem); } } public static void Read(HpcBinaryReader reader, out IEnumerable seq) { int cnt = reader.ReadInt32(); T[] elems = new T[cnt]; for (int i = 0; i < cnt; i++) { elems[i] = serializer.Read(reader); } seq = new HpcLinqSequence(elems); } public static void Write(HpcBinaryWriter writer, IEnumerable seq) { writer.Write(seq.Count()); foreach (T elem in seq) { serializer.Write(writer, elem); } } public static void Read(HpcBinaryReader reader, out IList seq) { int cnt = reader.ReadInt32(); seq = new List(cnt); for (int i = 0; i < cnt; i++) { seq.Add(serializer.Read(reader)); } } public static void Write(HpcBinaryWriter writer, IList seq) { writer.Write(seq.Count); foreach (T elem in seq) { serializer.Write(writer, elem); } } public static void Read(HpcBinaryReader reader, out ForkValue val) { val = new ForkValue(); if (reader.ReadBool()) { val.Value = serializer.Read(reader); } } public static void Write(HpcBinaryWriter writer, ForkValue val) { writer.Write(val.HasValue); if (val.HasValue) { serializer.Write(writer, val.Value); } } public static void Read(HpcBinaryReader reader, out AggregateValue aggVal) { long cnt = reader.ReadInt64(); T val = default(T); if (cnt > 0) { val = serializer.Read(reader); } aggVal = new AggregateValue(val, cnt); } public static void Write(HpcBinaryWriter writer, AggregateValue aggVal) { writer.Write(aggVal.Count); if (aggVal.Count > 0) { serializer.Write(writer, aggVal.Value); } } public static void Read(HpcBinaryReader reader, out IndexedValue indexedVal) { int index = reader.ReadInt32(); T val = serializer.Read(reader); indexedVal = new IndexedValue(index, val); } public static void Write(HpcBinaryWriter writer, IndexedValue indexedVal) { writer.Write(indexedVal.Index); serializer.Write(writer, indexedVal.Value); } } public static class HpcSerialization where S1 : HpcSerializer, new() where S2 : HpcSerializer, new() { private static S1 serializer1 = new S1(); private static S2 serializer2 = new S2(); public static void Read(HpcBinaryReader reader, out Dictionary dict) { int cnt = reader.ReadInt32(); dict = new Dictionary(cnt); for (int i = 0; i < cnt; i++) { T1 key = serializer1.Read(reader); T2 val = serializer2.Read(reader); dict.Add(key, val); } } public static void Write(HpcBinaryWriter writer, Dictionary dict) { writer.Write(dict.Count); foreach (KeyValuePair elem in dict) { serializer1.Write(writer, elem.Key); serializer2.Write(writer, elem.Value); } } public static void Read(HpcBinaryReader reader, out SortedDictionary dict) { int cnt = reader.ReadInt32(); dict = new SortedDictionary(); for (int i = 0; i < cnt; i++) { T1 key = serializer1.Read(reader); T2 val = serializer2.Read(reader); dict.Add(key, val); } } public static void Write(HpcBinaryWriter writer, SortedDictionary dict) { writer.Write(dict.Count); foreach (KeyValuePair elem in dict) { serializer1.Write(writer, elem.Key); serializer2.Write(writer, elem.Value); } } public static void Read(HpcBinaryReader reader, out SortedList list) { int cnt = reader.ReadInt32(); list = new SortedList(cnt); for (int i = 0; i < cnt; i++) { T1 key = serializer1.Read(reader); T2 value = serializer2.Read(reader); list.Add(key, value); } } public static void Write(HpcBinaryWriter writer, SortedList list) { writer.Write(list.Count); foreach (KeyValuePair elem in list) { serializer1.Write(writer, elem.Key); serializer2.Write(writer, elem.Value); } } public static void Read(HpcBinaryReader reader, out IGrouping group) { T1 key = serializer1.Read(reader); int len = reader.ReadInt32(); Grouping realGroup = new Grouping(key, len); for (int i = 0; i < len; i++) { realGroup.AddItem(serializer2.Read(reader)); } group = realGroup; } public static void Write(HpcBinaryWriter writer, IGrouping group) { serializer1.Write(writer, group.Key); writer.Write(group.Count()); foreach (T2 elem in group) { serializer2.Write(writer, elem); } } public static void Read(HpcBinaryReader reader, out KeyValuePair kv) { T1 key = serializer1.Read(reader); T2 val = serializer2.Read(reader); kv = new KeyValuePair(key, val); } public static void Write(HpcBinaryWriter writer, KeyValuePair kv) { serializer1.Write(writer, kv.Key); serializer2.Write(writer, kv.Value); } public static void Read(HpcBinaryReader reader, out Pair pair) { T1 x = serializer1.Read(reader); T2 y = serializer2.Read(reader); pair = new Pair(x, y); } public static void Write(HpcBinaryWriter writer, Pair pair) { serializer1.Write(writer, pair.Key); serializer2.Write(writer, pair.Value); } public static void Read(HpcBinaryReader reader, out ForkTuple val) { val = new ForkTuple(); if (reader.ReadBool()) { val.First = serializer1.Read(reader); } if (reader.ReadBool()) { val.Second = serializer2.Read(reader); } } public static void Write(HpcBinaryWriter writer, ForkTuple val) { writer.Write(val.HasFirst); if (val.HasFirst) { serializer1.Write(writer, val.First); } writer.Write(val.HasSecond); if (val.HasSecond) { serializer2.Write(writer, val.Second); } } public static void Read(HpcBinaryReader reader, out HpcLinqGrouping group) { T1 key = serializer1.Read(reader); int cnt = reader.ReadInt32(); T2[] elems = new T2[cnt]; for (int i = 0; i < cnt; i++) { elems[i] = serializer2.Read(reader); } group = new HpcLinqGrouping(key, elems); } public static void Write(HpcBinaryWriter writer, HpcLinqGrouping group) { serializer1.Write(writer, group.Key); writer.Write(group.Count()); foreach (T2 elem in group) { serializer2.Write(writer, elem); } } } public sealed class ByteHpcSerializer : HpcSerializer { public override byte Read(HpcBinaryReader reader) { return reader.ReadUByte(); } public override void Write(HpcBinaryWriter writer, byte x) { writer.Write(x); } } public sealed class SByteHpcSerializer : HpcSerializer { public override sbyte Read(HpcBinaryReader reader) { return reader.ReadSByte(); } public override void Write(HpcBinaryWriter writer, sbyte x) { writer.Write(x); } } public sealed class BoolHpcSerializer : HpcSerializer { public override bool Read(HpcBinaryReader reader) { return reader.ReadBool(); } public override void Write(HpcBinaryWriter writer, bool x) { writer.Write(x); } } public sealed class CharHpcSerializer : HpcSerializer { public override char Read(HpcBinaryReader reader) { return reader.ReadChar(); } public override void Write(HpcBinaryWriter writer, char x) { writer.Write(x); } } public sealed class Int16HpcSerializer : HpcSerializer { public override Int16 Read(HpcBinaryReader reader) { return reader.ReadInt16(); } public override void Write(HpcBinaryWriter writer, Int16 x) { writer.Write(x); } } public sealed class UInt16HpcSerializer : HpcSerializer { public override UInt16 Read(HpcBinaryReader reader) { return reader.ReadUInt16(); } public override void Write(HpcBinaryWriter writer, UInt16 x) { writer.Write(x); } } public sealed class Int32HpcSerializer : HpcSerializer { public override Int32 Read(HpcBinaryReader reader) { return reader.ReadInt32(); } public override void Write(HpcBinaryWriter writer, Int32 x) { writer.Write(x); } } public sealed class UInt32HpcSerializer : HpcSerializer { public override UInt32 Read(HpcBinaryReader reader) { return reader.ReadUInt32(); } public override void Write(HpcBinaryWriter writer, UInt32 x) { writer.Write(x); } } public sealed class Int64HpcSerializer : HpcSerializer { public override Int64 Read(HpcBinaryReader reader) { return reader.ReadInt64(); } public override void Write(HpcBinaryWriter writer, Int64 x) { writer.Write(x); } } public sealed class UInt64HpcSerializer : HpcSerializer { public override UInt64 Read(HpcBinaryReader reader) { return reader.ReadUInt64(); } public override void Write(HpcBinaryWriter writer, UInt64 x) { writer.Write(x); } } public sealed class SingleHpcSerializer : HpcSerializer { public override float Read(HpcBinaryReader reader) { return reader.ReadSingle(); } public override void Write(HpcBinaryWriter writer, float x) { writer.Write(x); } } public sealed class DoubleHpcSerializer : HpcSerializer { public override double Read(HpcBinaryReader reader) { return reader.ReadDouble(); } public override void Write(HpcBinaryWriter writer, double x) { writer.Write(x); } } public sealed class DecimalHpcSerializer : HpcSerializer { public override decimal Read(HpcBinaryReader reader) { return reader.ReadDecimal(); } public override void Write(HpcBinaryWriter writer, decimal x) { writer.Write(x); } } public sealed class DateTimeHpcSerializer : HpcSerializer { public override DateTime Read(HpcBinaryReader reader) { return reader.ReadDateTime(); } public override void Write(HpcBinaryWriter writer, DateTime x) { writer.Write(x); } } public sealed class StringHpcSerializer : HpcSerializer { public override string Read(HpcBinaryReader reader) { return reader.ReadString(); } public override void Write(HpcBinaryWriter writer, string x) { writer.Write(x); } } public sealed class GuidHpcSerializer : HpcSerializer { public override Guid Read(HpcBinaryReader reader) { return reader.ReadGuid(); } public override void Write(HpcBinaryWriter writer, Guid x) { writer.Write(x); } } public sealed class SqlDateTimeHpcSerializer : HpcSerializer { public override SqlDateTime Read(HpcBinaryReader reader) { return reader.ReadSqlDateTime(); } public override void Write(HpcBinaryWriter writer, SqlDateTime x) { writer.Write(x); } } }