public static void WriteReference(RCArray <byte> result, RCReference reference) { result.Write((byte)'r'); WriteScalarInt(result, reference.Parts.Count); for (int i = 0; i < reference.Parts.Count; ++i) { Binary.WriteScalarString(reference.Parts[i], result); } }
public static void WriteOperator(RCArray <byte> result, RCOperator op) { // Pre-order traversal of the expression tree. result.Write((byte)'o'); int count = op.Left == null ? 2 : 3; WriteScalarInt(result, count); if (op.Left != null) { op.Left.ToByte(result); } Binary.WriteScalarString(op.Name, result); op.Right.ToByte(result); }
public static void WriteBlock(RCArray <byte> result, RCBlock block) { // Pre-order traversal of the expression tree. result.Write((byte)'k'); WriteScalarInt(result, block.Count); for (int i = 0; i < block.Count; ++i) { RCBlock name = block.GetName(i); Binary.WriteScalarString(name.Name, result); // Binary.WriteScalarString (RCEvaluator.For (name.Evaluator), result); Binary.WriteScalarString(name.Evaluator.Symbol, result); name.Value.ToByte(result); } }
public static void WriteScalarSymbol(RCArray <byte> result, RCSymbolScalar scalar) { // This is not going to be a triumph of efficiency. // I am considering rewriting RCSymbolScalar so that it stores all of its // data as an array of bytes. Then the ToByte operation would just // return the internal representation. for (int i = 0; i < scalar.Length; ++i) { object part = scalar.Part(i); char type = RCVectorBase.EmptyOf(part.GetType()).TypeCode; result.Write((byte)type); switch (type) { case 'l': result.Write(BitConverter.GetBytes((long)part)); break; case 'd': result.Write(BitConverter.GetBytes((double)part)); break; case 'm': Binary.WriteScalarDecimal((decimal)part, result); break; case 'b': result.Write(BitConverter.GetBytes((bool)part)); break; case 's': Binary.WriteScalarString((string)part, result); break; default: throw new Exception("Unknown type:" + type + " found in symbol"); } } }