Boost logo

Boost :

Subject: Re: [boost] [interprocess][multi_index] emplace() is not sufficient for maps
From: Joaquin M Lopez Munoz (joaquin_at_[hidden])
Date: 2009-07-26 13:54:15


Thorsten Ottosen <thorsten.ottosen <at> dezide.com> writes:

>
> Hi Ion and Joaquín,

Hi Thorsten, sorry for the late answer, been
offline this weekend.
 
> This issue is related to node-based containers. I think you both have
> added emplace() to provide efficient in-place construction.

Boost.MultiIndex does not offer it yet, will do
in the future.

> However, I often encounter a situation where emplace() is not sufficient
> for me.
>
> The situation is characterized by the need to calculate the key after
> the mapped value (a heavy object) has been placed in the pair. To
> calculate the key the mapped value needs to be modified (the key is
> calculated as a side-effect).
>
> I therefore suggest that we add a new function:
>
> typedef ... map;
> map m;
> map::node_ptr p = m.get_node_ptr(<like emplace, but only for
> constructing the mapped value>);
> p->pair.first = modify( p->pair.second );
> m.insert( boost::move(p) );
>
> Thoughts?

Why can't you just do the following?

map::mapped_type x=...;
map::key_type k=modify(x);
m.emplace(boost::move(k),boost::move(x));

Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo


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