Boost logo

Boost Users :

Subject: Re: [Boost-users] [fusion] memory layout of fusion::vector vs boost::tuple/boost::array
From: Alfredo Correa (alfredo.correa_at_[hidden])
Date: 2010-10-08 14:29:06


2010/10/8 Thomas Heller <thom.heller_at_[hidden]>

> 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 ;)
>

Thomas, thanks so much for the code. Unfortunately it doesn't work (maybe it
is my compiler?)

$ c++ -v
gcc 4.4.3
$ c++ fusion_test.cpp
$ ./a.out
terminate called after throwing an instance of
'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::out_of_range>
>'
  what(): attempt to access element of an empty array
Aborted

Thanks,
Alfredo

>
> Cheers
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
> --
> Sie haben diese Nachricht erhalten, da Sie der Google Groups-Gruppe Boost
> Users beigetreten sind.
> Wenn Sie Nachrichten in dieser Gruppe posten möchten, senden Sie eine
> E-Mail an boostusers_at_googlegroups.com.
> Wenn Sie aus dieser Gruppe austreten möchten, senden Sie eine E-Mail an
> boostusers+unsubscribe_at_[hidden]<boostusers%2Bunsubscribe_at_[hidden]>
> .
> Besuchen Sie die Gruppe unter
> http://groups.google.com/group/boostusers?hl=de, um weitere Optionen zu
> erhalten.
>
>
>



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