//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++98, c++03, c++11, c++14 // // class unordered_multimap // template // void merge(unordered_map& source); // template // void merge(unordered_map&& source); // template // void merge(unordered_multimap& source); // template // void merge(unordered_multimap&& source); #include #include #include "test_macros.h" #include "Counter.h" template bool map_equal(const Map& map, Map other) { return map == other; } #ifndef TEST_HAS_NO_EXCEPTIONS template struct throw_hasher { bool& should_throw_; throw_hasher(bool& should_throw) : should_throw_(should_throw) {} size_t operator()(const T& p) const { if (should_throw_) throw 0; return std::hash()(p); } }; #endif int main(int, char**) { { std::unordered_multimap src{{1, 0}, {3, 0}, {5, 0}}; std::unordered_multimap dst{{2, 0}, {4, 0}, {5, 0}}; dst.merge(src); assert(map_equal(src, {})); assert(map_equal(dst, {{1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}, {5, 0}})); } #ifndef TEST_HAS_NO_EXCEPTIONS { bool do_throw = false; typedef std::unordered_multimap, int, throw_hasher>> map_type; map_type src({{1, 0}, {3, 0}, {5, 0}}, 0, throw_hasher>(do_throw)); map_type dst({{2, 0}, {4, 0}, {5, 0}}, 0, throw_hasher>(do_throw)); assert(Counter_base::gConstructed == 6); do_throw = true; try { dst.merge(src); } catch (int) { do_throw = false; } assert(!do_throw); assert(map_equal(src, map_type({{1, 0}, {3, 0}, {5, 0}}, 0, throw_hasher>(do_throw)))); assert(map_equal(dst, map_type({{2, 0}, {4, 0}, {5, 0}}, 0, throw_hasher>(do_throw)))); } #endif assert(Counter_base::gConstructed == 0); struct equal { equal() = default; bool operator()(const Counter& lhs, const Counter& rhs) const { return lhs == rhs; } }; struct hasher { hasher() = default; size_t operator()(const Counter& p) const { return std::hash>()(p); } }; { typedef std::unordered_multimap, int, std::hash>, std::equal_to>> first_map_type; typedef std::unordered_multimap, int, hasher, equal> second_map_type; typedef std::unordered_map, int, hasher, equal> third_map_type; { first_map_type first{{1, 0}, {2, 0}, {3, 0}}; second_map_type second{{2, 0}, {3, 0}, {4, 0}}; third_map_type third{{1, 0}, {3, 0}}; assert(Counter_base::gConstructed == 8); first.merge(second); first.merge(third); assert(map_equal(first, {{1, 0}, {2, 0}, {3, 0}, {4, 0}, {2, 0}, {3, 0}, {1, 0}, {3, 0}})); assert(map_equal(second, {})); assert(map_equal(third, {})); assert(Counter_base::gConstructed == 8); } assert(Counter_base::gConstructed == 0); { first_map_type first{{1, 0}, {2, 0}, {3, 0}}; second_map_type second{{2, 0}, {3, 0}, {4, 0}}; third_map_type third{{1, 0}, {3, 0}}; assert(Counter_base::gConstructed == 8); first.merge(std::move(second)); first.merge(std::move(third)); assert(map_equal(first, {{1, 0}, {2, 0}, {3, 0}, {4, 0}, {2, 0}, {3, 0}, {1, 0}, {3, 0}})); assert(map_equal(second, {})); assert(map_equal(third, {})); assert(Counter_base::gConstructed == 8); } assert(Counter_base::gConstructed == 0); } { std::unordered_multimap first; { std::unordered_multimap second; first.merge(second); first.merge(std::move(second)); } { std::unordered_map second; first.merge(second); first.merge(std::move(second)); } } return 0; }