# Searching for a declaration (using a loop)

This example shows how to search for a specific declaration using a loop on the declarations tree.

Let’s consider the following c++ file (example.hpp):

    namespace ns{
        int a = 1;
        int b = 2;
        double c = 3.0;

        double func2(double a) {
            double b = a + 2.0;
            return b;
        }
    }

The following code will show you how to loop on the tree and find a declaration

    from pygccxml import utils
    from pygccxml import declarations
    from pygccxml import parser

    # Find the location of the xml generator (castxml or gccxml)
    generator_path, generator_name = utils.find_xml_generator()

    # Configure the xml generator
    xml_generator_config = parser.xml_generator_configuration_t(
        xml_generator_path=generator_path,
        xml_generator=generator_name)

    # The c++ file we want to parse
    filename = "example.hpp"

    # Parse the c++ file
    decls = parser.parse([filename], xml_generator_config)

    global_namespace = declarations.get_global_namespace(decls)

    ns_namespace = global_namespace.namespace("ns")

    int_type = declarations.cpptypes.int_t()
    double_type = declarations.cpptypes.double_t()

    for decl in ns_namespace.declarations:
        print(decl)

    # This prints all the declarations in the namespace declaration tree:
    # ns::a [variable]
    # ns::b [variable]
    # ns::c [variable]
    # double ns::func2(double a) [free function]

    # Let's search for specific declarations
    for decl in ns_namespace.declarations:
        if decl.name == "b":
            print(decl)
        if isinstance(decl, declarations.free_function_t):
            print(decl)

    # This prints:
    # ns::b [variable]
    # double ns::func2(double a) [free function]