Boost logo

Boost :

Subject: Re: [boost] [interprocess][multi_index] emplace() is not sufficient for maps
From: Thorsten Ottosen (thorsten.ottosen_at_[hidden])
Date: 2009-09-19 04:18:54


Ion Gaztañaga skrev:
> Thorsten Ottosen escribió:

>>
>> Therefore I would like to see the follwing member:
>>
>> iterator modify_key( const_iterator element, const Key& new_key );
>>
>> This function only needs to rebalance/resort the keys and can
>> completely avoid deallocation/allocation.
>
> Interesting. What about exception safety? We can't assure strong
> guarantee. It could just erase the element if the change fails? We could
> also use the assignment operator instead of destroy+construct to reuse
> some resources.

For keys where assignment don't throw, we get the strong guarantee. For
the case where assignment could throw, I agree the element should be
erase (the user can then reinsert manually if that happens). So maybe
we should return

   pair<iterator,bool>

to tell the user if the update succeeded?

For cases where the ordering is based merely on a non-throwing part of
the Key type, it could be usable with

   template< class Key2 >
   iterator modify_key( const_iterator element, const Key2& new_key );

This function would place the existing node in its right place, but not
change the key object which the user then has to do, e.g.

   iterator i = modify_key( x, new_object.sub_object );
   i->swap( new_object );

I guess there are some additional overloads for movable types.

-Thorsten


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