Boost logo

Boost :

From: Brock Peabody (brock.peabody_at_[hidden])
Date: 2003-07-28 17:08:42


> -----Original Message-----
> From: boost-bounces_at_[hidden]
[mailto:boost-bounces_at_[hidden]]
> On Behalf Of Philippe A. Bouchard
> Sent: Monday, July 28, 2003 8:13 AM
> To: boost_at_[hidden]
> Subject: [boost] RE: Re: Re: GUI/GDI template library
>

> Yes I know, this could be defined by another property what to do when
you
> expand a sub-list:
>
> template <typename T>
> struct tree
> {
> list<T> element;
> list<tree> children;
> };
>

Ok, your tree is the structure (and owns the data). My 'tree control'
actually owns and manages the data. The programmer just specifies the
layout of the tree. I had a supporting class called n_tree:

    template <typename Parent, typename ChildList = null_type> struct
n_tree
    {
        typedef Parent parent;
        typedef ChildList child;
    };

    typedef boost::mpl::vector<int, double, n_tree<int, std::string> >
            tree_layout;

    tree_ctrl<tree_layout> my_tree;

This defines a tree with three types of root nodes, int, double, and
another int node that has string children. Here is how you would
specify how to populate the various node:

    int list_integers();
    double list_doubles();
    std::string list_strings_for_parent(int parent);

    my_tree.first.set_nodes(list_integers);

    my_tree.second.set_nodes(list_doubles);

    my_tree.third.set_nodes(list_integers);

    my_tree.third.first.set_nodes(list_strings_for_parent);

It is all statically typed. The control manages when to load all the
data for the various nodes. Doing things like setting color is easy
too:

    color even_is_red(int i) {
    
        return i % 2 == 0 ? red : default;
    }

    my_tree.first.set_color(even_is_red);
        

[...]

> struct tree<> is recursive: list<tree> children. Why I like it this
way
> is
> because it is exactly like other containers and can be used for other

The only problem is that while tree<> can be as deep as possible, it
can't have multiple types of structures, say filessystem and
printersystem.

> purposes. You could define any element type you want:
>
> tree<lineedit>, tree<checkbox>, tree<label>, tree<pixmap_label> or
tree<
> ..._ptr<mytype> > if the design is chosen upon smart pointers for
widget
> creation.

That's really cool. You could have trees in lists in trees. I never
thought of it that way. That would be a challenging project!


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk