Boost logo

Boost Users :

Subject: Re: [Boost-users] [fusion] const and transform algorithm
From: vicente.botet (vicente.botet_at_[hidden])
Date: 2009-01-06 18:24:52


----- Original Message -----
From: "Joel de Guzman" <joel_at_[hidden]>
To: <boost-users_at_[hidden]>
Sent: Tuesday, January 06, 2009 11:26 PM
Subject: Re: [Boost-users] [fusion] const and transform algorithm

>
> vicente.botet wrote:
>> Hi,
>>
>> What is the reason fusion::transform taskes a const Sequence?
>> template<
>> typename Sequence,
>> typename F
>> >
>> typename result_of::transform<Sequence const, F>::type transform(
>> Sequence const& seq, F f);
>>
>> Does this means that the transform do not change the sequence itself o also its elements?
>
> Yes. Fusion transform returns a lazy (transform) view. This view
> is non-mutating. It is not like STL's transform which mutates
> the target container in place. Fusion's is purely functional and
> lazily evaluated.

Can for_each mutate the sequence elements? if yes, would the following get a transformation I'm locking for?

vector<shared_pair<shared_future<int>,int>,shared_pair<shared_future<char>,int> > t;
boost::fusion::for_each(t, intrusive_get());
vector<int, char> res=unzip<1>(boost::fusion::for_each(t, intrusive_get()));

where
shared_pair would be a sequence something like a shared_ptr<pair<A,B> and
unzip would be the reverse function of zip. BTW do you think that the counterpart function of zip has a place on Fusion?

>> boost::tuple<int, char> = ??(boost::fusion::transform(t, get()));
>> boost::as_vector? Is there a as_tuple function? Should this force the evaluation of the get function?
>
> As I said, Fusion transform is purely functional. The result of a transform
> is a view. The function will only be called when you iterate over the
> view. The transformation does not change/mutate the sequence itself.
> If that's what you want, you can assign the view back to the original
> container. For example:
>
> vector<int, char> v;
> v = transform(v, f);

I was lock for in the documentation and I have not found this assignation. Where in the documentation can I found that I can do that?

If for_each can change/mutate the sequence itself, why don't have a mutating_transform that takes a Sequence& and not a Sequence const&

Just a last question. How move semantics maps with purely functional Sequences? Do you plan to add move semantics for the elements of the tuple? The concept of MovableSequence has a sens for you?

Thanks,
Vicente


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net