PR 44436 Associative containers emplace/emplace_hint

François Dumont frs.dumont@gmail.com
Mon Sep 24 20:04:00 GMT 2012


Attached patch applied.

2012-09-24  François Dumont  <fdumont@gcc.gnu.org>

     PR libstdc++/44436
     * include/bits/stl_tree.h
     (_Rb_tree<>::_M_insert_): Take _Base_ptr rather than
     _Const_Base_ptr.
     (_Rb_tree<>::_M_insert_node): New.
     (_Rb_tree<>::_M_get_insert_unique_pos): New, search code of
     _M_insert_unique method.
     (_Rb_tree<>::_M_insert_unique): Use latter.
     (_Rb_tree<>::_M_emplace_unique): New, likewise.
     (_Rb_tree<>::_M_get_insert_equal_pos): New, search code of
     _M_insert_equal method.
     (_Rb_tree<>::_M_insert_equal): Use latter.
     (_Rb_tree<>::_M_emplace_equal): New, likewise.
     (_Rb_tree<>::_M_get_insert_hint_unique_pos): New, search code of
     _M_insert_unique_ method.
     (_Rb_tree<>::_M_insert_unique_): Use latter.
     (_Rb_tree<>::_M_emplace_hint_unique): New, likewise.
     (_Rb_tree<>::_M_get_insert_hint_equal_pos): New, search code of
     _M_insert_equal_ method.
     (_Rb_tree<>::_M_insert_equal_): Use latter.
     (_Rb_tree<>::_M_emplace_hint_equal): New, likewise.
     (_Rb_tree<>::_M_insert_lower): Remove first _Base_ptr parameter,
     useless as always null.
     * include/bits/stl_map.h: Include <tuple> in C++11.
     (map<>::operator[](const key_type&)): Use
     _Rb_tree<>::_M_emplace_hint_unique in C++11.
     (map<>::operator[](key_type&&)): Likewise.
     (map<>::emplace): New.
     (map<>::emplace_hint): New.
     * include/bits/stl_multimap.h (multimap<>::emplace): New.
     (multimap<>::emplace_hint): New.
     * include/bits/stl_set.h (set<>::emplace): New.
     (set<>::emplace_hint): New.
     * include/bits/stl_multiset.h (multiset<>::emplace): New.
     (multiset<>::emplace_hint): New.
     * include/debug/map.h (std::__debug::map<>::emplace): New.
     (std::__debug::map<>::emplace_hint): New.
     * include/debug/multimap.h (std::__debug::multimap<>::emplace):
     New.
     (std::__debug::multimap<>::emplace_hint): New.
     * include/debug/set.h (std::__debug::set<>::emplace): New.
     (std::__debug::set<>::emplace_hint): New.
     * include/debug/multiset.h (std::__debug::multiset<>::emplace):
     New.
     (std::__debug::multiset<>::emplace_hint): New.
     * include/profile/map.h (std::__profile::map<>::emplace): New.
     (std::__profile::map<>::emplace_hint): New.
     * include/profile/multimap.h (std::__profile::multimap<>::emplace):
     New.
     (std::__profile::multimap<>::emplace_hint): New.
     * include/profile/set.h (std::__profile::set<>::emplace): New.
     (std::__profile::set<>::emplace_hint): New.
     * include/profile/multiset.h (std::__profile::multiset<>::emplace):
     New.
     (std::__profile::multiset<>::emplace_hint): New.
     * testsuite/util/testsuite_container_traits.h: Signal that emplace
     and emplace_hint are available on std::map, std::multimap,
     std::set and std::multiset in C++11.
     * testsuite/23_containers/map/operators/2.cc: New.
     * testsuite/23_containers/map/modifiers/emplace/1.cc: New.
     * testsuite/23_containers/multimap/modifiers/emplace/1.cc: New.
     * testsuite/23_containers/set/modifiers/emplace/1.cc: New.
     * testsuite/23_containers/multiset/modifiers/emplace/1.cc: New.

I run performance tests too and didn't notice a difference even if it 
was a rather manual, error prone, process. It would be great if 'make 
check-performance' was generating a report of the difference with the 
previous run. Just giving an idea as I don't think I have the necessary 
make skill to do so.

François

-------------- next part --------------
A non-text attachment was scrubbed...
Name: emplace.patch
Type: text/x-patch
Size: 58116 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20120924/2a8c9af0/attachment.bin>


More information about the Libstdc++ mailing list