Example #1
0
        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()));
        }
Example #2
0
        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())));
        }