public Expression Map(BondDataType?expectedKeyType, BondDataType?expectedValueType, MapHandler handler) { Debug.Assert(schema.IsMap); var count = Expression.Variable(typeof(int), "count"); var loop = handler( new UntaggedParser <R>(this, schema.GetKeySchema()), new UntaggedParser <R>(this, schema.GetElementSchema()), Expression.Constant(schema.TypeDef.key.id), Expression.Constant(schema.TypeDef.element.id), Expression.GreaterThan(Expression.PostDecrementAssign(count), Expression.Constant(0)), Expression.Empty(), count); return(Expression.Block( new[] { count }, Expression.Assign(count, reader.ReadContainerBegin()), loop, reader.ReadContainerEnd())); }
Expression Map(IParser parser, RuntimeSchema schema) { var expectedValueType = schema.HasValue ? schema.TypeDef.element.id : (BondDataType?)null; var expectedKeyType = schema.HasValue ? schema.TypeDef.key.id : (BondDataType?)null; return(parser.Map(expectedKeyType, expectedValueType, (keyParser, valueParser, keyType, valueType, nextKey, nextValue, count) => Expression.Block( writer.WriteContainerBegin(count, keyType, valueType), ControlExpression.While(nextKey, Expression.Block( writer.WriteItemBegin(), schema.HasValue ? Value(keyParser, keyType, schema.GetKeySchema()) : Value(keyParser, keyType), writer.WriteItemEnd(), nextValue, writer.WriteItemBegin(), schema.HasValue ? Value(valueParser, valueType, schema.GetElementSchema()) : Value(valueParser, valueType), writer.WriteItemEnd())), writer.WriteContainerEnd()))); }