llvm-project/libcxx/test/std/containers/associative/multiset
Eric Fiselier 5e3ea4dd79 Teach __tree how to handle map's __value_type
This patch is fairly large and contains a number of changes. The changes all work towards
allowing __tree to properly handle __value_type esspecially when inserting into the __tree.
I chose not to break this change into smaller patches because it wouldn't be possible to
write meaningful standard-compliant tests for each patch.

It is very similar to r260513 "[libcxx] Teach __hash_table how to handle unordered_map's __hash_value_type".

Changes in <map>
 * Remove __value_type's constructors because it should never be constructed directly.

 * Make map::emplace and multimap::emplace forward to __tree and remove the old definitions

 * Remove "__construct_node" map and multimap member functions. Almost all of the construction is done within __tree.

 * Fix map's move constructor to access "__value_type.__nc" directly and pass this object to __tree::insert.

Changes in <__tree>
 * Add traits to detect, handle, and unwrap, map's "__value_type".

 * Convert methods taking "value_type" to take "__container_value_type" instead. Previously these methods caused
  unwanted implicit conversions from "std::pair<Key, Value>" to "__value_type<Key, Value>".

 * Delete __tree_node and __tree_node_base's constructors and assignment operators. The node types should never be constructed
   because the "__value_" member of __tree_node must be constructed directly by the allocator.

 * Make the __tree_node_destructor class and "__construct_node" methods unwrap "__node_value_type" into "__container_value_type" before invoking the allocator. The user's allocator can only be used to construct and destroy the container's value_type. Passing it map's "__value_type" was incorrect.

 * Cleanup the "__insert" and "__emplace" methods. Have __insert forward to an __emplace function wherever possible to reduce
   code duplication. __insert_unique(value_type const&) and __insert_unique(value_type&&) forward to __emplace_unique_key_args.
   These functions will not allocate a new node if the value is already in the tree.

 * Change the __find* functions to take the "key_type" directly instead of passing in "value_type" and unwrapping the key later.
   This change allows the find functions to be used without having to construct a "value_type" first. This allows for a number
   of optimizations.

 * Teach __move_assign and __assign_multi methods to unwrap map's __value_type.

llvm-svn: 264986
2016-03-31 02:15:15 +00:00
..
multiset.cons We had two identical files named 'MoveOnly.h' in the test suite. Move one to support/, remove the other, and update all the tests that included them. No functionality change. 2015-01-28 21:22:53 +00:00
multiset.special Implement the first part of N4258: 'Cleaning up noexcept in the Library'. This patch deals with swapping containers, and implements a more strict noexcept specification (a conforming extension) than the standard mandates. 2015-07-13 20:04:56 +00:00
allocator_mismatch.fail.cpp Add static_assert to set/multiset/map/multimap/forward_list/deque that the allocator's value_type match the container's value_type. vector/unordered/list/string already do this. Add tests for all the containers to verify this. 2015-11-26 01:24:04 +00:00
clear.pass.cpp
count.pass.cpp
emplace.pass.cpp
emplace_hint.pass.cpp
empty.pass.cpp
equal_range.pass.cpp
erase_iter.pass.cpp Fix for LWG Issue 2059: C++0x ambiguity problem with map::erase 2015-05-10 13:35:00 +00:00
erase_iter_iter.pass.cpp
erase_key.pass.cpp
find.pass.cpp
incomplete_type.pass.cpp Cleanup node-type handling in the associative containers. 2016-02-20 05:28:30 +00:00
insert_allocator_requirements.pass.cpp Teach __tree how to handle map's __value_type 2016-03-31 02:15:15 +00:00
insert_cv.pass.cpp
insert_initializer_list.pass.cpp
insert_iter_cv.pass.cpp
insert_iter_iter.pass.cpp
insert_iter_rv.pass.cpp We had two identical files named 'MoveOnly.h' in the test suite. Move one to support/, remove the other, and update all the tests that included them. No functionality change. 2015-01-28 21:22:53 +00:00
insert_rv.pass.cpp We had two identical files named 'MoveOnly.h' in the test suite. Move one to support/, remove the other, and update all the tests that included them. No functionality change. 2015-01-28 21:22:53 +00:00
iterator.pass.cpp
lower_bound.pass.cpp
max_size.pass.cpp
scary.pass.cpp Fix warnings in array and assoc containers 2015-07-18 23:56:04 +00:00
size.pass.cpp
types.pass.cpp
upper_bound.pass.cpp