def flag_instantiatable_class(dependency_tree, main_classes):
    """determine if the class can be instantiated"""
    main_classes_by_name_namespace = {make_namespace_class(c["namespace"], c["name"]): c
                                      for classes in main_classes.values() for c in classes}

    for module, header_name in main_classes:
        for class_ in main_classes[(module, header_name)]:
            can_be_instantiated = True
            if class_["abstract"]:
                can_be_instantiated = False
            else:
                # check if any pure virtual method is not implemented
                all_implemented_inherited_methods = get_all_class_methods_not_pure_virtual(class_)
                namespace_class = make_namespace_class(class_["namespace"], class_["name"])
                for base_name_nsp in dependency_tree.breadth_first_iterator(namespace_class):
                    base_class = main_classes_by_name_namespace.get(base_name_nsp)
                    if base_class:
                        base_class_methods = get_all_class_methods_not_pure_virtual(base_class)
                        all_implemented_inherited_methods.update(base_class_methods)

                for base_name_nsp in dependency_tree.breadth_first_iterator(namespace_class):
                    base_class = main_classes_by_name_namespace.get(base_name_nsp)
                    if base_class and base_class["abstract"]:
                        base_pure_virtual_methods = get_pure_virtual_methods(base_class)
                        if base_pure_virtual_methods - all_implemented_inherited_methods:
                            can_be_instantiated = False

            class_["can_be_instantiated"] = can_be_instantiated
def flag_instantiatable_class(dependency_tree, main_classes):
    # determine if the class can be instantiated
    main_classes_by_name_namespace = {
        make_namespace_class(c["namespace"], c["name"]): c
        for classes in main_classes.values() for c in classes
    }

    for module, header_name in main_classes:
        for class_ in main_classes[(module, header_name)]:
            can_be_instantiated = True
            if class_["abstract"]:
                can_be_instantiated = False
            else:  # check for inherited abstract base classes
                methods = set([
                    m["name"] for access in "private protected public".split()
                    for m in class_["methods"][access]
                ])
                namespace_class = make_namespace_class(class_["namespace"],
                                                       class_["name"])
                for base_name_nsp in dependency_tree.breadth_first_iterator(
                        namespace_class):
                    base_class = main_classes_by_name_namespace.get(
                        base_name_nsp)
                    if base_class and base_class["abstract"]:
                        base_pure_virtual_methods = set(
                            get_pure_virtual_methods(base_class))
                        if base_pure_virtual_methods - methods:
                            can_be_instantiated = False
            class_["can_be_instantiated"] = can_be_instantiated