[PATCH] Implement C++17 node extraction and insertion (P0083R5)
Jonathan Wakely
jwakely@redhat.com
Wed Sep 21 13:57:00 GMT 2016
This mail got rejected from gcc-patches as spam. The attachment can be
found at https://gcc.gnu.org/ml/libstdc++/2016-09/msg00115.html
On 21/09/16 14:48 +0100, Jonathan Wakely wrote:
>This implements container node extraction/insertion, and merging. The
>patch includes Debug Mode support and pretty printers for the node
>handles.
>
>Most of the changes are fairly straightforward, with two things worth
>pointing out.
>
>There's a FIXME in bits/hashtable.h due to an exception-safety issue.
>If the hash function or equality predicate throws then the node is
>destroyed and deallocated. It would be better to leave it unchanged in
>the node_handle argument.
>
>I didn't want to make all map and multimap specializations friends of
>each other (and similarly for all sets and multisets, and again for
>the unordered ones). That would make it too easy to accidentally
>access the internals of a map<T,U> from a map<V,W>. So I defined the
>_Rb_tree_merge_helper and _Hash_merge_helper class templates to
>mediate access, so that any access to a "foreign" container type must
>be done through that type, and only certain internals can be obtained.
>
>I'll probably commit this tomorrow.
>
> * doc/xml/manual/status_cxx2017.xml: Document status.
> * doc/html/*: Regenerate.
> * include/Makefile.am: Add bits/node_handle.h and reorder.
> * include/Makefile.in: Regenerate.
> * include/bits/hashtable.h (_Hashtable::node_type)
> (_Hashtable::insert_return_type, _Hashtable::_M_reinsert_node)
> (_Hashtable::_M_reinsert_node_multi, _Hashtable::extract)
> (_Hashtable::_M_merge_unique, _Hashtable::_M_merge_multi): Define.
> (_Hash_merge_helper): Define primary template.
> * include/bits/node_handle.h: New header.
> * include/bits/stl_map.h (map): Declare _Rb_tree_merge_helper as
> friend.
> (map::node_type, map::insert_return_type, map::extract, map::merge)
> (map::insert(node_type&&), map::insert(const_iterator, node_type&&)):
> Define new members.
> (_Rb_tree_merge_helper): Specialize for map.
> * include/bits/stl_multimap.h (multimap): Declare _Rb_tree_merge_helper
> as friend.
> (multimap::node_type, multimap::extract, multimap::merge)
> (multimap::insert(node_type&&))
> (multimap::insert(const_iterator, node_type&&)): Define.
> (_Rb_tree_merge_helper): Specialize for multimap.
> * include/bits/stl_multiset.h (multiset): Declare _Rb_tree_merge_helper
> as friend.
> (multiset::node_type, multiset::extract, multiset::merge)
> (multiset::insert(node_type&&))
> (multiset::insert(const_iterator, node_type&&)): Define.
> * include/bits/stl_set.h (set): Declare _Rb_tree_merge_helper as
> friend.
> (set::node_type, set::insert_return_type, set::extract, set::merge)
> (set::insert(node_type&&), set::insert(const_iterator, node_type&&)):
> Define.
> (_Rb_tree_merge_helper): Specialize for set.
> * include/bits/stl_tree.h (_Rb_tree): Declare _Rb_tree<> as friend.
> (_Rb_tree::node_type, _Rb_tree::insert_return_type)
> (_Rb_tree::_M_reinsert_node_unique, _Rb_tree::_M_reinsert_node_equal)
> (_Rb_tree::_M_reinsert_node_hint_unique)
> (_Rb_tree::_M_reinsert_node_hint_equal, _Rb_tree::extract)
> (_Rb_tree::_M_merge_unique, _Rb_tree::_M_merge_equal): Define.
> (_Rb_tree_merge_helper): Specialize for multiset.
> * include/bits/unordered_map.h (unordered_map): Declare
> unordered_map<> and unordered_multimap<> as friends.
> (unordered_map::node_type, unordered_map::insert_return_type)
> (unordered_map::extract, unordered_map::merge)
> (unordered_map::insert(node_type&&))
> (unordered_map::insert(const_iterator, node_type&&))
> (unordered_multimap): Declare _Hash_merge_helper as friend.
> (unordered_multimap::node_type, unordered_multimap::extract)
> (unordered_multimap::merge, unordered_multimap::insert(node_type&&))
> (unordered_multimap::insert(const_iterator, node_type&&)): Define.
> (_Hash_merge_helper): Specialize for unordered maps and multimaps.
> * include/bits/unordered_set.h (unordered_set, unordered_multiset):
> Declare _Hash_merge_helper as friend.
> (unordered_set::node_type, unordered_set::insert_return_type)
> (unordered_set::extract, unordered_set::merge)
> (unordered_set::insert(node_type&&))
> (unordered_set::insert(const_iterator, node_type&&)): Define.
> (unordered_multiset::node_type, unordered_multiset::extract)
> (unordered_multiset::merge, unordered_multiset::insert(node_type&&))
> (unordered_multiset::insert(const_iterator, node_type&&)): Define.
> (_Hash_merge_helper): Specialize for unordered sets and multisets.
> * include/debug/map.h (map): Add using declarations or forwarding
> functions for new members.
> * include/debug/map.h (multimap): Likewise.
> * include/debug/map.h (multiset): Likewise.
> * include/debug/map.h (set): Likewise.
> * include/debug/unordered_map (unordered_map, unordered_multimap):
> Likewise.
> * include/debug/unordered_set( unordered_set, unordered_multiset):
> Likewise.
> * python/libstdcxx/v6/printers.py (get_value_from_aligned_membuf): New
> helper function.
> (get_value_from_list_node, get_value_from_Rb_tree_node): Use helper.
> (StdNodeHandlePrinter): Define printer for node handles.
> (build_libstdcxx_dictionary): Register StdNodeHandlePrinter.
> * testsuite/23_containers/map/modifiers/extract.cc: New.
> * testsuite/23_containers/map/modifiers/merge.cc: New.
> * testsuite/23_containers/multimap/modifiers/extract.cc: New.
> * testsuite/23_containers/multimap/modifiers/merge.cc: New.
> * testsuite/23_containers/multiset/modifiers/extract.cc: New.
> * testsuite/23_containers/multiset/modifiers/merge.cc: New.
> * testsuite/23_containers/set/modifiers/extract.cc: New.
> * testsuite/23_containers/set/modifiers/merge.cc: New.
> * testsuite/23_containers/unordered_map/modifiers/extract.cc: New.
> * testsuite/23_containers/unordered_map/modifiers/merge.cc: New.
> * testsuite/23_containers/unordered_multimap/modifiers/extract.cc:
> New.
> * testsuite/23_containers/unordered_multimap/modifiers/merge.cc: New.
> * testsuite/23_containers/unordered_multiset/modifiers/extract.cc:
> New.
> * testsuite/23_containers/unordered_multiset/modifiers/merge.cc: New.
> * testsuite/23_containers/unordered_set/modifiers/extract.cc: New.
> * testsuite/23_containers/unordered_set/modifiers/merge.cc: New.
> * testsuite/23_containers/unordered_set/instantiation_neg.cc: Adjust
> dg-error lineno.
> * testsuite/libstdc++-prettyprinters/cxx17.cc: Test node handles.
More information about the Libstdc++
mailing list