diff options
author | Erik Pilkington <erik.pilkington@gmail.com> | 2018-08-01 01:33:38 +0000 |
---|---|---|
committer | Erik Pilkington <erik.pilkington@gmail.com> | 2018-08-01 01:33:38 +0000 |
commit | b0386a515b60c2f43eaaef986bd5b1cdc4448244 (patch) | |
tree | bf43e7a1f1c135df7a7873d08381e77c70c1416e /libcxx/test/std/containers/associative/multiset/extract_iterator.pass.cpp | |
parent | 9057546c5bf2015414186c1a1f0660cd32344362 (diff) | |
download | bcm5719-llvm-b0386a515b60c2f43eaaef986bd5b1cdc4448244.tar.gz bcm5719-llvm-b0386a515b60c2f43eaaef986bd5b1cdc4448244.zip |
First half of C++17's splicing maps and sets
This commit adds a node handle type, (located in __node_handle), and adds
extract() and insert() members to all map and set types, as well as their
implementations in __tree and __hash_table.
The second half of this feature is adding merge() members, which splice nodes
in bulk from one container into another. This will be committed in a follow-up.
Differential revision: https://reviews.llvm.org/D46845
llvm-svn: 338472
Diffstat (limited to 'libcxx/test/std/containers/associative/multiset/extract_iterator.pass.cpp')
-rw-r--r-- | libcxx/test/std/containers/associative/multiset/extract_iterator.pass.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/libcxx/test/std/containers/associative/multiset/extract_iterator.pass.cpp b/libcxx/test/std/containers/associative/multiset/extract_iterator.pass.cpp new file mode 100644 index 00000000000..0f41169e9fe --- /dev/null +++ b/libcxx/test/std/containers/associative/multiset/extract_iterator.pass.cpp @@ -0,0 +1,60 @@ +//===----------------------------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03, c++11, c++14 + +// <set> + +// class multiset + +// node_type extract(const_iterator); + +#include <set> +#include "min_allocator.h" +#include "Counter.h" + +template <class Container> +void test(Container& c) +{ + size_t sz = c.size(); + + for (auto first = c.cbegin(); first != c.cend();) + { + auto key_value = *first; + typename Container::node_type t = c.extract(first++); + --sz; + assert(t.value() == key_value); + assert(t.get_allocator() == c.get_allocator()); + assert(sz == c.size()); + } + + assert(c.size() == 0); +} + +int main() +{ + { + using set_type = std::multiset<int>; + set_type m = {1, 2, 3, 4, 5, 6}; + test(m); + } + + { + std::multiset<Counter<int>> m = {1, 2, 3, 4, 5, 6}; + assert(Counter_base::gConstructed == 6); + test(m); + assert(Counter_base::gConstructed == 0); + } + + { + using min_alloc_set = std::multiset<int, std::less<int>, min_allocator<int>>; + min_alloc_set m = {1, 2, 3, 4, 5, 6}; + test(m); + } +} |