/
BirdLeon
/
ROBLOX2016
Обзор
Документация
Войти
/
BirdLeon
/
ROBLOX2016
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
Library/boost/libs/move/test/unique_ptr_default_deleter.cpp
204 строки
4 KB
PatoFlamejanteTV
full source code
19 дек 2024, 19:11
19 дек 2024, 19:11
05db15d
Код
Авторство
О чём код?
////////////////////////////////////////////////////////////////////////////// // // (C) Copyright Howard Hinnant 2009 // (C) Copyright Ion Gaztanaga 2014-2014. // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/move for documentation. // ////////////////////////////////////////////////////////////////////////////// #include <boost/move/default_delete.hpp> #include <boost/core/lightweight_test.hpp> ////////////////////////////////////////////// // // The initial implementation of these tests // was written by Howard Hinnant. // // These test were later refactored grouping // and porting them to Boost.Move. // // Many thanks to Howard for releasing his C++03 // unique_ptr implementation with such detailed // test cases. // ////////////////////////////////////////////// //////////////////////////////// // unique_ptr_dltr_dflt_convert_ctor //////////////////////////////// namespace bml = ::boost::movelib; struct A { static int count; A() {++count;} A(const A&) {++count;} virtual ~A() {--count;} }; int A::count = 0; struct B : public A { static int count; B() : A() {++count;} B(const B&) : A() {++count;} virtual ~B() {--count;} }; int B::count = 0; void reset_counters() { A::count = B::count = 0; } namespace unique_ptr_dltr_dflt_convert_ctor{ void test() { //Single element deleter { reset_counters(); bml::default_delete<B> d2; bml::default_delete<A> d1 = d2; A* p = new B; BOOST_TEST(A::count == 1); BOOST_TEST(B::count == 1); d1(p); BOOST_TEST(A::count == 0); BOOST_TEST(B::count == 0); } //Array element deleter { reset_counters(); bml::default_delete<A[]> d2; bml::default_delete<const A[]> d1 = d2; const A* p = new const A[2]; BOOST_TEST(A::count == 2); d1(p); BOOST_TEST(A::count == 0); } //Bounded array element deleter { reset_counters(); bml::default_delete<A[2]> d2; bml::default_delete<const A[2]> d1 = d2; const A* p = new const A[2]; BOOST_TEST(A::count == 2); d1(p); bml::default_delete<const A[]> d0 = d1; d0(0); BOOST_TEST(A::count == 0); } } } //namespace unique_ptr_dltr_dflt_convert_ctor{ //////////////////////////////// // unique_ptr_dltr_dflt_convert_assign //////////////////////////////// namespace unique_ptr_dltr_dflt_convert_assign{ void test() { //Single element deleter { reset_counters(); bml::default_delete<B> d2; bml::default_delete<A> d1; d1 = d2; A* p = new B; BOOST_TEST(A::count == 1); BOOST_TEST(B::count == 1); d1(p); BOOST_TEST(A::count == 0); BOOST_TEST(B::count == 0); } //Array element deleter { reset_counters(); bml::default_delete<A[]> d2; bml::default_delete<const A[]> d1; d1 = d2; const A* p = new const A[2]; BOOST_TEST(A::count == 2); d1(p); BOOST_TEST(A::count == 0); } //Bounded array element deleter { reset_counters(); bml::default_delete<A[2]> d2; bml::default_delete<const A[2]> d1; d1 = d2; const A* p = new const A[2]; BOOST_TEST(A::count == 2); d1(p); bml::default_delete<const A[]> d0; d0 = d1; d0(0); BOOST_TEST(A::count == 0); } } } //namespace unique_ptr_dltr_dflt_convert_assign{ //////////////////////////////// // unique_ptr_dltr_dflt_default //////////////////////////////// namespace unique_ptr_dltr_dflt_default{ void test() { { //Single element deleter reset_counters(); bml::default_delete<A> d; A* p = new A; BOOST_TEST(A::count == 1); d(p); BOOST_TEST(A::count == 0); } { //Array element deleter reset_counters(); bml::default_delete<A[]> d; A* p = new A[2]; BOOST_TEST(A::count == 2); d(p); BOOST_TEST(A::count == 0); } { //Bounded Array element deleter reset_counters(); bml::default_delete<A[10]> d; A* p = new A[10]; BOOST_TEST(A::count == 10); d(p); BOOST_TEST(A::count == 0); } } } //namespace unique_ptr_dltr_dflt_default{ //////////////////////////////// // main //////////////////////////////// int main() { unique_ptr_dltr_dflt_convert_ctor::test(); unique_ptr_dltr_dflt_convert_assign::test(); unique_ptr_dltr_dflt_default::test(); //Test results return boost::report_errors(); }