Ejemplo n.º 1
0
def intersect_lgrs(lgr1, lgr2):
    """
    Compute the intersection of 2 LGRs and returns a valid LGR.

    Note: Ranges have to be expanded before calling this function.

    :param lgr1: First LGR.
    :param lgr2: Second LGR.
    :return: New LGR: intersection of two inputs.
    """
    name = 'Intersection of %s and %s' % (lgr1.name, lgr2.name)

    lgr1.expand_ranges()
    lgr2.expand_ranges()

    # Note: We need to create a copy (copy.deepcopy) for some elements
    # otherwise they could reference the original objects.

    metadata = copy.deepcopy(intersect_metadata(lgr1.metadata, lgr2.metadata))
    lgr = LGR(name=name, metadata=metadata)

    # No need to copy references, they are new objects
    references = intersect_reference_manager(lgr1.reference_manager,
                                             lgr2.reference_manager)
    lgr.reference_manager = references

    first_cps = {c.cp for c in lgr1.repertoire}
    second_cps = {c.cp for c in lgr2.repertoire}

    # No need to copy char, they are new objects
    for cp in set.intersection(first_cps, second_cps):
        char1 = lgr1.get_char(cp)
        char2 = lgr2.get_char(cp)

        intersect_char(lgr, char1, char2)

    (actions, actions_xml) = intersect_actions(lgr1, lgr2)
    lgr.actions = copy.deepcopy(actions)
    lgr.actions_xml = actions_xml

    (rules, rules_xml) = intersect_rules(lgr1, lgr2)
    lgr.rules = copy.deepcopy(rules)
    lgr.rules_xml = rules_xml

    (classes, classes_xml) = intersect_classes(lgr1, lgr2)
    lgr.classes = copy.deepcopy(classes)
    lgr.classes_xml = classes_xml

    return lgr
Ejemplo n.º 2
0
def union_lgrs(lgr1, lgr2):
    """
    Compute the union of 2 LGRs and returns a valid LGR.

    Note: Ranges have to be expanded before calling this function.

    :param lgr1: First LGR.
    :param lgr2: Second LGR.
    :return: New LGR: union of two inputs.
    """
    name = 'Union of %s and %s' % (lgr1.name, lgr2.name)

    logger.debug("Union of %s", name)

    lgr1.expand_ranges()
    lgr2.expand_ranges()

    # Note: We need to create a copy (copy.deepcopy) for some elements
    # otherwise they could reference the original objects.

    metadata = copy.deepcopy(union_metadata(lgr1.metadata, lgr2.metadata))
    lgr = LGR(name=name, metadata=metadata)

    # No need to copy references, they are new objects
    references = union_reference_manager(lgr1.reference_manager,
                                         lgr2.reference_manager)
    lgr.reference_manager = references

    first_cps = {c.cp for c in lgr1.repertoire}
    second_cps = {c.cp for c in lgr2.repertoire}


    # No need to copy char, they are new objects

    # Compute union of all common code points
    for cp in set.intersection(first_cps, second_cps):
        char1 = lgr1.get_char(cp)
        char2 = lgr2.get_char(cp)

        union_char(lgr, char1, char2)

    # Append all other code points
    for cp in set.difference(first_cps, second_cps):
        char = lgr1.get_char(cp)

        lgr.add_cp(char.cp,
                   comment=char.comment,
                   #ref=char.references,
                   tag=char.tags,
                   when=char.when, not_when=char.not_when)

    for cp in set.difference(second_cps, first_cps):
        char = lgr2.get_char(cp)

        lgr.add_cp(char.cp,
                   comment=char.comment,
                   #ref=char.references,
                   tag=char.tags,
                   when=char.when, not_when=char.not_when)

    (actions, actions_xml) = union_actions(lgr1, lgr2)
    lgr.actions = copy.deepcopy(actions)
    lgr.actions_xml = actions_xml

    (rules, rules_xml) = union_rules(lgr1, lgr2)
    lgr.rules = copy.deepcopy(rules)
    lgr.rules_xml = rules_xml

    (classes, classes_xml) = union_classes(lgr1, lgr2)
    lgr.classes = copy.deepcopy(classes)
    lgr.classes_xml = classes_xml

    return lgr