Ejemplo n.º 1
0
def list_concat_expr_to_ir1(expr: ir2.ListConcatExpr):
    # l1 + l2
    #
    # Becomes (if l1 and l2 are lists of ints):
    #
    # Int64ListConcat<l1, l2>::type

    elem_kind = ir1_to_ir0.type_to_ir0(type_to_ir1(expr.type.elem_type)).kind
    if elem_kind == ir0.ExprKind.BOOL:
        list_concat_template_name = 'BoolListConcat'
    elif elem_kind == ir0.ExprKind.INT64:
        list_concat_template_name = 'Int64ListConcat'
    elif elem_kind == ir0.ExprKind.TYPE:
        list_concat_template_name = 'TypeListConcat'
    else:
        raise NotImplementedError('elem_kind: %s' % elem_kind)

    template_instantiation = ir1.TemplateInstantiation(
        template_name=list_concat_template_name,
        arg_exprs=[expr_to_ir1(expr.lhs),
                   expr_to_ir1(expr.rhs)],
        instantiation_might_trigger_static_asserts=False)

    return ir1.ClassMemberAccess(class_type_expr=template_instantiation,
                                 member_name='type',
                                 member_type=ir1.TypeType())
Ejemplo n.º 2
0
def template_instantiation_pattern_expr_to_ir1(
        expr: ir2.TemplateInstantiationPatternExpr):
    return ir1.TemplateInstantiation(
        template_name=expr.template_atomic_cpp_type,
        arg_exprs=[
            type_pattern_expr_to_ir1(elem_expr) for elem_expr in expr.arg_exprs
        ],
        instantiation_might_trigger_static_asserts=False)
Ejemplo n.º 3
0
def int_list_sum_expr_to_ir1(expr: ir2.IntListSumExpr):
    # sum(l)
    #
    # Becomes:
    #
    # Int64ListSum<l>::value

    template_instantiation = ir1.TemplateInstantiation(
        template_name='Int64ListSum',
        arg_exprs=[expr_to_ir1(expr.var)],
        instantiation_might_trigger_static_asserts=False)

    return ir1.ClassMemberAccess(class_type_expr=template_instantiation,
                                 member_name='value',
                                 member_type=ir1.IntType())
Ejemplo n.º 4
0
def bool_list_any_expr_to_ir1(expr: ir2.BoolListAnyExpr):
    # any(l)
    #
    # Becomes:
    #
    # BoolListAny<l>::value

    template_instantiation = ir1.TemplateInstantiation(
        template_name='BoolListAny',
        arg_exprs=[expr_to_ir1(expr.var)],
        instantiation_might_trigger_static_asserts=False)

    return ir1.ClassMemberAccess(class_type_expr=template_instantiation,
                                 member_name='value',
                                 member_type=ir1.BoolType())
Ejemplo n.º 5
0
def list_expr_to_ir1(list_expr: Union[ir2.ListExpr, ir2.ListPatternExpr]):
    # [1, 2, x]
    #
    # Becomes:
    #
    # IntList<1, 2, x>

    elem_kind = ir1_to_ir0.type_to_ir0(type_to_ir1(list_expr.elem_type)).kind
    if elem_kind == ir0.ExprKind.BOOL:
        list_template_name = 'BoolList'
    elif elem_kind == ir0.ExprKind.INT64:
        list_template_name = 'Int64List'
    elif elem_kind == ir0.ExprKind.TYPE:
        list_template_name = 'List'
    else:
        raise NotImplementedError('elem_kind: %s' % elem_kind)

    return ir1.TemplateInstantiation(
        template_name=list_template_name,
        arg_exprs=[expr_to_ir1(elem_expr) for elem_expr in list_expr.elems],
        instantiation_might_trigger_static_asserts=False)