Boost logo

Boost :

From: Jaap Suter (J.Suter_at_[hidden])
Date: 2003-01-02 00:45:45


> > Perhaps it is a good idea to add those missing operators to
> > the MPL?
>
> It is! They are not there only because you are the pioneer, here. The
> followers will be very grateful :)

See other message.

> It's not that frightening, but I understand :). I'll try to do something
> about documenting the major workaround techniques/constructs.

Awesome.

> Personally, I would make it even more shorter by getting rid of explicit
> comparison with zero:
> typedef typename mpl::apply_if< N, ... ...

Duh, of course. If there ever is a prize for the best way to make things
overly complicated, please nominate me.
Honestly, at one point I was considering writing a meta-function called
equal_to_zero, because I needed it a lot.
I guess

    N

is a lot shorter than

    mpl::equals_to< N, mpl< N::value_type, 0 > >

> Some of these issues are probably caused by absence of some common
> primitives in the library. If you cite your typical use cases when you
have
> to resort to recursion (and when that bothers you :), together we might be
> able to classify them and find out if there is anything on the library
side
> we can do to support them better - or may be find the ways to do that with
> the already existing facilities.

Well, the biggest headache is caused by an O(n * m) algorithm that does
something like the following:

list_n and list_m are typelists (or vectors) of integral_c< size_t >'s.
list_result is an empty typelist at the start

for_each_in( list_n )
    for_each_in( list_n )
        if ( ! contains( list_result, list_n[ i ] ^ list_m[ i ] )
            insert( list_result, list_n[ i ] ^ list_m[ i ] );

So list_result acts as a set (I'm still considering to write an mpl::set),
and it contains the xor of all combinations of elements from list_n and
list_m.
I have the meta-function written and it's compiling, but I can only
instantiate it for very small lists (1 or 2 elements).

> For instance, here's how a higher-level version of the 'bit_count'
algorithm
> might look like:
>
> template< typename N >
> struct bit_count
> {
> typedef typename for_<
> pair< int_c<0>, N >
> , _2
> , pair<
> next< _1 >
> , bit_and< _2, prior< _2 > >
> >
> >::type type;
> };
>
> Would something like this make your life easier?

Yes! Most definitely. I would have some difficulties transitioning to this
way of thinking (even now I still have a few places where I should use an
iter_fold, but resort to old-scool meta-programming techniques instead), but
I would totally try using it. Not only is it easier to code (imho), but the
readability greatly improves as well.

> > Also, I'll need to start thinking about
> > http://www.mywikinet.com/mpl/paper/mpl_paper.html#sequences.unrolling
> > and http://users.rcn.com/abrahams/instantiation_speed/index.html.
>
> The current sources implement the unrolling a little bit different; I will
> be documenting it sometime in the future, meanwhile just ask when you get
to
> it.

Thanks for the time and help!

Regards,

Jaap Suter


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