| //===----------------------------------------------------------------------===// | 
 | // | 
 | // 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 | 
 |  | 
 | // <set> | 
 |  | 
 | // class multiset | 
 |  | 
 | // multiset& operator=(multiset&& s); | 
 |  | 
 | #include <set> | 
 | #include <cassert> | 
 |  | 
 | #include "MoveOnly.h" | 
 | #include "../../../test_compare.h" | 
 | #include "test_allocator.h" | 
 | #include "min_allocator.h" | 
 |  | 
 | int main() | 
 | { | 
 |     { | 
 |         typedef MoveOnly V; | 
 |         typedef test_compare<std::less<MoveOnly> > C; | 
 |         typedef test_allocator<V> A; | 
 |         typedef std::multiset<MoveOnly, C, A> M; | 
 |         typedef std::move_iterator<V*> I; | 
 |         V a1[] = | 
 |         { | 
 |             V(1), | 
 |             V(1), | 
 |             V(1), | 
 |             V(2), | 
 |             V(2), | 
 |             V(2), | 
 |             V(3), | 
 |             V(3), | 
 |             V(3) | 
 |         }; | 
 |         M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A(7)); | 
 |         V a2[] = | 
 |         { | 
 |             V(1), | 
 |             V(1), | 
 |             V(1), | 
 |             V(2), | 
 |             V(2), | 
 |             V(2), | 
 |             V(3), | 
 |             V(3), | 
 |             V(3) | 
 |         }; | 
 |         M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A(7)); | 
 |         M m3(C(3), A(7)); | 
 |         m3 = std::move(m1); | 
 |         assert(m3 == m2); | 
 |         assert(m3.get_allocator() == A(7)); | 
 |         assert(m3.key_comp() == C(5)); | 
 |         assert(m1.empty()); | 
 |     } | 
 |     { | 
 |         typedef MoveOnly V; | 
 |         typedef test_compare<std::less<MoveOnly> > C; | 
 |         typedef test_allocator<V> A; | 
 |         typedef std::multiset<MoveOnly, C, A> M; | 
 |         typedef std::move_iterator<V*> I; | 
 |         V a1[] = | 
 |         { | 
 |             V(1), | 
 |             V(1), | 
 |             V(1), | 
 |             V(2), | 
 |             V(2), | 
 |             V(2), | 
 |             V(3), | 
 |             V(3), | 
 |             V(3) | 
 |         }; | 
 |         M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A(7)); | 
 |         V a2[] = | 
 |         { | 
 |             V(1), | 
 |             V(1), | 
 |             V(1), | 
 |             V(2), | 
 |             V(2), | 
 |             V(2), | 
 |             V(3), | 
 |             V(3), | 
 |             V(3) | 
 |         }; | 
 |         M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A(7)); | 
 |         M m3(C(3), A(5)); | 
 |         m3 = std::move(m1); | 
 |         assert(m3 == m2); | 
 |         assert(m3.get_allocator() == A(5)); | 
 |         assert(m3.key_comp() == C(5)); | 
 |         assert(m1.empty()); | 
 |     } | 
 |     { | 
 |         typedef MoveOnly V; | 
 |         typedef test_compare<std::less<MoveOnly> > C; | 
 |         typedef other_allocator<V> A; | 
 |         typedef std::multiset<MoveOnly, C, A> M; | 
 |         typedef std::move_iterator<V*> I; | 
 |         V a1[] = | 
 |         { | 
 |             V(1), | 
 |             V(1), | 
 |             V(1), | 
 |             V(2), | 
 |             V(2), | 
 |             V(2), | 
 |             V(3), | 
 |             V(3), | 
 |             V(3) | 
 |         }; | 
 |         M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A(7)); | 
 |         V a2[] = | 
 |         { | 
 |             V(1), | 
 |             V(1), | 
 |             V(1), | 
 |             V(2), | 
 |             V(2), | 
 |             V(2), | 
 |             V(3), | 
 |             V(3), | 
 |             V(3) | 
 |         }; | 
 |         M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A(7)); | 
 |         M m3(C(3), A(5)); | 
 |         m3 = std::move(m1); | 
 |         assert(m3 == m2); | 
 |         assert(m3.get_allocator() == A(7)); | 
 |         assert(m3.key_comp() == C(5)); | 
 |         assert(m1.empty()); | 
 |     } | 
 |     { | 
 |         typedef MoveOnly V; | 
 |         typedef test_compare<std::less<MoveOnly> > C; | 
 |         typedef min_allocator<V> A; | 
 |         typedef std::multiset<MoveOnly, C, A> M; | 
 |         typedef std::move_iterator<V*> I; | 
 |         V a1[] = | 
 |         { | 
 |             V(1), | 
 |             V(1), | 
 |             V(1), | 
 |             V(2), | 
 |             V(2), | 
 |             V(2), | 
 |             V(3), | 
 |             V(3), | 
 |             V(3) | 
 |         }; | 
 |         M m1(I(a1), I(a1+sizeof(a1)/sizeof(a1[0])), C(5), A()); | 
 |         V a2[] = | 
 |         { | 
 |             V(1), | 
 |             V(1), | 
 |             V(1), | 
 |             V(2), | 
 |             V(2), | 
 |             V(2), | 
 |             V(3), | 
 |             V(3), | 
 |             V(3) | 
 |         }; | 
 |         M m2(I(a2), I(a2+sizeof(a2)/sizeof(a2[0])), C(5), A()); | 
 |         M m3(C(3), A()); | 
 |         m3 = std::move(m1); | 
 |         assert(m3 == m2); | 
 |         assert(m3.get_allocator() == A()); | 
 |         assert(m3.key_comp() == C(5)); | 
 |         assert(m1.empty()); | 
 |     } | 
 | } |