Boost logo

Boost Users :

Subject: Re: [Boost-users] [fusion] memory layout of fusion::vector vs boost::tuple/boost::array
From: Thomas Heller (thom.heller_at_[hidden])
Date: 2010-10-08 03:44:31


alfC wrote:

>
>
> On Oct 7, 5:13 pm, OvermindDL1 <overmind..._at_[hidden]> wrote:
>> On Thu, Oct 7, 2010 at 5:42 PM, Alfredo Correa <alfredo.cor..._at_[hidden]>
>> wrote:
>> > On Thu, Oct 7, 2010 at 3:33 PM, OvermindDL1 <overmind..._at_[hidden]>
>> > wrote:
>> >> You do know that based on this:
>>
>> >>
http://www.boost.org/doc/libs/1_44_0/libs/fusion/doc/html/fusion/adap...
>> >> boost::array is already adapted as a fusion container and can be used
>> >> directly, as soon as you include the proper hpp that is?
>>
>> > yes, thank you, that what I wrote in my last post . I can make this
>> > work
>>
>> > #include <boost/fusion/adapted/boost_array.hpp>
>> > #include <boost/fusion/include/boost_array.hpp>
>> > ...
>> > boost::array<double, 3> boostarr={{1.0, 2.1, 3.2}};
>> > vector<double, double, double> fusionvec(boostarr); //now works
>>
>> Ah, heh, got lost in the noise and I missed it.
>>
>> On Thu, Oct 7, 2010 at 5:42 PM, Alfredo Correa <alfredo.cor..._at_[hidden]>
>> wrote:
>> > I still can't do the other way around:
>>
>> > boost::array<double, 3> boostarr2(fusionvec); //doesn't work
>> > ideas?
>>
>> I know that would not work because that is still a 'custom' type as
>> far as fusion is concerned, and only free functions can work on it, a
>> constructor is obviously not a free function, so you need to write a
>> free function to do it (probably called 'copy', probably using
>> fusion's foreach to copy each element one to the other, should be
>> pretty well optimized out thanks to the template-magic).
>
> no luck. I can't make it work. First I tried with "for_each" and
> didn't manage to put together the code because I need to copy one
> sequence from the other and the for_each doesn't keep track of the
> index. So I tried with "transform", the code compiles but does nothing
> to the array.
>
> boost::array<double, 3> ba0;
> boost::fusion::transform(ba0, bfv1, copy());
>
> where
> struct copy{
> typedef void result_type;
> void operator()(double& lhs, double const& rhs) const{
> lhs = rhs;
> }
> };
>
> ba0 is still undefined after running this.
>
> Obviously I am getting Boost.Fusion wrong.
>
> Thanks,
> Alfredo

You will find a version using fold attached.
What it does, is that it increases the size of the boost::array passed in as
state by one for every element in the fusion sequence and copies over the
elements. There could be a more elegant solution to the problem ;)

Cheers




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