//===----------------------------------------------------------------------===// // // 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. // //===----------------------------------------------------------------------===// #ifndef SET_ALLOCATOR_REQUIREMENT_TEST_TEMPLATES_H #define SET_ALLOCATOR_REQUIREMENT_TEST_TEMPLATES_H // // // class set // class unordered_set // insert(...); // emplace(...); // emplace_hint(...); #include #include "test_macros.h" #include "count_new.hpp" #include "container_test_types.h" #include "assert_checkpoint.h" template void testSetInsert() { typedef typename Container::value_type ValueTp; typedef Container C; typedef std::pair R; ConstructController* cc = getConstructController(); cc->reset(); { CHECKPOINT("Testing C::insert(const value_type&)"); Container c; const ValueTp v(42); cc->expect(); assert(c.insert(v).second); assert(!cc->unchecked()); { DisableAllocationGuard g; const ValueTp v2(42); assert(c.insert(v2).second == false); } } { CHECKPOINT("Testing C::insert(value_type&)"); Container c; ValueTp v(42); cc->expect(); assert(c.insert(v).second); assert(!cc->unchecked()); { DisableAllocationGuard g; ValueTp v2(42); assert(c.insert(v2).second == false); } } { CHECKPOINT("Testing C::insert(value_type&&)"); Container c; ValueTp v(42); cc->expect(); assert(c.insert(std::move(v)).second); assert(!cc->unchecked()); { DisableAllocationGuard g; ValueTp v2(42); assert(c.insert(std::move(v2)).second == false); } } { CHECKPOINT("Testing C::insert(const value_type&&)"); Container c; const ValueTp v(42); cc->expect(); assert(c.insert(std::move(v)).second); assert(!cc->unchecked()); { DisableAllocationGuard g; const ValueTp v2(42); assert(c.insert(std::move(v2)).second == false); } } { CHECKPOINT("Testing C::insert(std::initializer_list)"); Container c; std::initializer_list il = { ValueTp(1), ValueTp(2) }; cc->expect(2); c.insert(il); assert(!cc->unchecked()); { DisableAllocationGuard g; c.insert(il); } } { CHECKPOINT("Testing C::insert(Iter, Iter) for *Iter = value_type const&"); Container c; const ValueTp ValueList[] = { ValueTp(1), ValueTp(2), ValueTp(3) }; cc->expect(3); c.insert(std::begin(ValueList), std::end(ValueList)); assert(!cc->unchecked()); { DisableAllocationGuard g; c.insert(std::begin(ValueList), std::end(ValueList)); } } { CHECKPOINT("Testing C::insert(Iter, Iter) for *Iter = value_type&&"); Container c; ValueTp ValueList[] = { ValueTp(1), ValueTp(2) , ValueTp(3) }; cc->expect(3); c.insert(std::move_iterator(std::begin(ValueList)), std::move_iterator(std::end(ValueList))); assert(!cc->unchecked()); { DisableAllocationGuard g; ValueTp ValueList2[] = { ValueTp(1), ValueTp(2) , ValueTp(3) }; c.insert(std::move_iterator(std::begin(ValueList2)), std::move_iterator(std::end(ValueList2))); } } { CHECKPOINT("Testing C::insert(Iter, Iter) for *Iter = value_type&"); Container c; ValueTp ValueList[] = { ValueTp(1), ValueTp(2) , ValueTp(3) }; cc->expect(3); c.insert(std::begin(ValueList), std::end(ValueList)); assert(!cc->unchecked()); { DisableAllocationGuard g; c.insert(std::begin(ValueList), std::end(ValueList)); } } } template void testSetEmplace() { typedef typename Container::value_type ValueTp; typedef Container C; typedef std::pair R; ConstructController* cc = getConstructController(); cc->reset(); { CHECKPOINT("Testing C::emplace(const value_type&)"); Container c; const ValueTp v(42); cc->expect(); assert(c.emplace(v).second); assert(!cc->unchecked()); { DisableAllocationGuard g; const ValueTp v2(42); assert(c.emplace(v2).second == false); } } { CHECKPOINT("Testing C::emplace(value_type&)"); Container c; ValueTp v(42); cc->expect(); assert(c.emplace(v).second); assert(!cc->unchecked()); { DisableAllocationGuard g; ValueTp v2(42); assert(c.emplace(v2).second == false); } } { CHECKPOINT("Testing C::emplace(value_type&&)"); Container c; ValueTp v(42); cc->expect(); assert(c.emplace(std::move(v)).second); assert(!cc->unchecked()); { DisableAllocationGuard g; ValueTp v2(42); assert(c.emplace(std::move(v2)).second == false); } } { CHECKPOINT("Testing C::emplace(const value_type&&)"); Container c; const ValueTp v(42); cc->expect(); assert(c.emplace(std::move(v)).second); assert(!cc->unchecked()); { DisableAllocationGuard g; const ValueTp v2(42); assert(c.emplace(std::move(v2)).second == false); } } } template void testSetEmplaceHint() { typedef typename Container::value_type ValueTp; typedef Container C; typedef typename C::iterator It; ConstructController* cc = getConstructController(); cc->reset(); { CHECKPOINT("Testing C::emplace_hint(p, const value_type&)"); Container c; const ValueTp v(42); cc->expect(); It ret = c.emplace_hint(c.end(), v); assert(ret != c.end()); assert(c.size() == 1); assert(!cc->unchecked()); { DisableAllocationGuard g; const ValueTp v2(42); It ret2 = c.emplace_hint(c.begin(), v2); assert(&(*ret2) == &(*ret)); assert(c.size() == 1); } } { CHECKPOINT("Testing C::emplace_hint(p, value_type&)"); Container c; ValueTp v(42); cc->expect(); It ret = c.emplace_hint(c.end(), v); assert(ret != c.end()); assert(c.size() == 1); assert(!cc->unchecked()); { DisableAllocationGuard g; ValueTp v2(42); It ret2 = c.emplace_hint(c.begin(), v2); assert(&(*ret2) == &(*ret)); assert(c.size() == 1); } } { CHECKPOINT("Testing C::emplace_hint(p, value_type&&)"); Container c; ValueTp v(42); cc->expect(); It ret = c.emplace_hint(c.end(), std::move(v)); assert(ret != c.end()); assert(c.size() == 1); assert(!cc->unchecked()); { DisableAllocationGuard g; ValueTp v2(42); It ret2 = c.emplace_hint(c.begin(), std::move(v2)); assert(&(*ret2) == &(*ret)); assert(c.size() == 1); } } { CHECKPOINT("Testing C::emplace_hint(p, const value_type&&)"); Container c; const ValueTp v(42); cc->expect(); It ret = c.emplace_hint(c.end(), std::move(v)); assert(ret != c.end()); assert(c.size() == 1); assert(!cc->unchecked()); { DisableAllocationGuard g; const ValueTp v2(42); It ret2 = c.emplace_hint(c.begin(), std::move(v2)); assert(&(*ret2) == &(*ret)); assert(c.size() == 1); } } } template void testMultisetInsert() { typedef typename Container::value_type ValueTp; typedef Container C; ConstructController* cc = getConstructController(); cc->reset(); { CHECKPOINT("Testing C::insert(const value_type&)"); Container c; const ValueTp v(42); cc->expect(); c.insert(v); assert(!cc->unchecked()); } { CHECKPOINT("Testing C::insert(value_type&)"); Container c; ValueTp v(42); cc->expect(); c.insert(v); assert(!cc->unchecked()); } { CHECKPOINT("Testing C::insert(value_type&&)"); Container c; ValueTp v(42); cc->expect(); c.insert(std::move(v)); assert(!cc->unchecked()); } { CHECKPOINT("Testing C::insert(std::initializer_list)"); Container c; std::initializer_list il = { ValueTp(1), ValueTp(2) }; cc->expect(2); c.insert(il); assert(!cc->unchecked()); } { CHECKPOINT("Testing C::insert(Iter, Iter) for *Iter = value_type const&"); Container c; const ValueTp ValueList[] = { ValueTp(1), ValueTp(2), ValueTp(3) }; cc->expect(3); c.insert(std::begin(ValueList), std::end(ValueList)); assert(!cc->unchecked()); } { CHECKPOINT("Testing C::insert(Iter, Iter) for *Iter = value_type&&"); Container c; ValueTp ValueList[] = { ValueTp(1), ValueTp(2) , ValueTp(3) }; cc->expect(3); c.insert(std::move_iterator(std::begin(ValueList)), std::move_iterator(std::end(ValueList))); assert(!cc->unchecked()); } { CHECKPOINT("Testing C::insert(Iter, Iter) for *Iter = value_type&"); Container c; ValueTp ValueList[] = { ValueTp(1), ValueTp(2) , ValueTp(3) }; cc->expect(3); c.insert(std::begin(ValueList), std::end(ValueList)); assert(!cc->unchecked()); } } #endif