コード例 #1
0
TEST(fxcrt, WeakPtrNonNull) {
  PseudoDeletable thing;
  EXPECT_EQ(0, thing.delete_count());
  {
    UniquePtr unique(&thing);
    WeakPtr ptr1(std::move(unique));
    EXPECT_TRUE(ptr1);
    EXPECT_EQ(&thing, ptr1.Get());

    WeakPtr ptr2;
    EXPECT_FALSE(ptr1 == ptr2);
    EXPECT_TRUE(ptr1 != ptr2);
    {
      WeakPtr ptr3(ptr1);
      EXPECT_TRUE(ptr1 == ptr3);
      EXPECT_FALSE(ptr1 != ptr3);
      EXPECT_EQ(&thing, ptr3.Get());
      {
        WeakPtr ptr4 = ptr1;
        EXPECT_TRUE(ptr1 == ptr4);
        EXPECT_FALSE(ptr1 != ptr4);
        EXPECT_EQ(&thing, ptr4.Get());
      }
    }
    EXPECT_EQ(0, thing.delete_count());
  }
  EXPECT_EQ(1, thing.delete_count());
}
コード例 #2
0
void fit_smart_ptr_tests::test_case_get()
{
    auto ptr1 = smart_make_shared<char>(45);
    assert(ptr1.get() != nullptr);

    fit_smart_ptr<char> ptr2(nullptr);
    assert(ptr2.get() == nullptr);

    fit_smart_ptr<char> ptr3(nullptr);
    assert(ptr3.get() == nullptr);

    auto ptr4(ptr1);
    assert(ptr4.get() == ptr1.get());

    ptr2 = ptr4;
    assert(ptr2.get() == ptr4.get() && ptr4.get() == ptr1.get());
    ptr3 = ptr1;
    assert(ptr3.get() == ptr1.get());
    *ptr1 = 123;
    assert(ptr3.get() == ptr1.get());

    ptr4 = nullptr;
    assert(ptr4.get() == nullptr);
    ptr3 = fit_smart_ptr<char>(nullptr);
    assert(ptr3.get() == nullptr);

    ptr1 = ptr2 = ptr3;
    assert(ptr1.get() == nullptr);
    assert(ptr2.get() == nullptr);
}
コード例 #3
0
ファイル: test_uni1.cpp プロジェクト: zed31/exo-cpp
void	test_uni1()
{
  constexpr int	value = 101;
  my::unique_ptr<int>	ptr(value);
  if (*ptr == value)
    std::cout << "OK ";
  else
    std::cout << "KO ";
  int			*i(new int(value + value));
  my::unique_ptr<int>	ptr2(i);
  delete i;
  if (*ptr2 == value + value)
    std::cout << "OK ";
  else
    std::cout << "KO ";
  my::unique_ptr<int>	ptr3(std::move(ptr));
  if (*ptr3 == value)
    std::cout << "OK ";
  else
    std::cout << "KO ";
  if (!ptr.get())
    std::cout << "OK ";
  else
    std::cout << "KO ";
  std::cout << std::endl;
}
コード例 #4
0
void smart_ptr_tests::test_case_get()
{
    smart_ptr<char> ptr1(new char(45));
    assert(ptr1.get() != nullptr);

    smart_ptr<char> ptr2(nullptr);
    assert(ptr2.get() == nullptr);

    smart_ptr<char> ptr3(nullptr);
    assert(ptr3.get() == nullptr);

    auto ptr4(ptr1);
    assert(ptr4.get() == ptr1.get());

    ptr2 = ptr4;
    assert(ptr2.get() == ptr4.get() && ptr4.get() == ptr1.get());
    ptr3 = ptr1;
    assert(ptr3.get() == ptr1.get());
    *ptr1 = 123;
    assert(ptr3.get() == ptr1.get());

    ptr4 = nullptr;
    assert(ptr4.get() == nullptr);
    ptr3 = smart_ptr<char>(nullptr);
    assert(ptr3.get() == nullptr);

    ptr1 = ptr2 = ptr3;
    assert(ptr1.get() == nullptr);
    assert(ptr2.get() == nullptr);
}
コード例 #5
0
void smart_ptr_tests::test_case_comparisions()
{
    smart_ptr<char> ptr1(new char(45));
    assert(ptr1 != nullptr);

    smart_ptr<char> ptr2(nullptr);
    assert(ptr2 == nullptr);

    smart_ptr<char> ptr3(nullptr);
    assert(ptr3 == nullptr);

    auto ptr4 = ptr1;
    assert(ptr4 == ptr1);

    ptr2 = ptr4;
    assert(ptr2 == ptr4 && ptr4 == ptr1);
    ptr3 = ptr1;
    assert(ptr3 == ptr1);
    *ptr1 = 123;
    assert(ptr3 == ptr1);

    ptr4 = nullptr;
    assert(ptr4 == nullptr);
    ptr3 = smart_ptr<char>(nullptr);
    assert(ptr3 == nullptr);

    assert(nullptr != ptr1);
    ptr1 = ptr2 = ptr3;
    assert(ptr1 == nullptr);
    assert(ptr2 == nullptr);

    assert(nullptr == ptr1);
}
コード例 #6
0
void smart_ptr_tests::test_case_copy_and_assignment()
{
    smart_ptr<char> ptr1(new char(45));
    assert(*ptr1 == 45);

    smart_ptr<char> ptr2(nullptr);
    smart_ptr<char> ptr3(nullptr);
    auto ptr4(ptr1);
    assert(*ptr4 == 45);

    ptr2 = ptr4;
    assert(*ptr2 == 45);
    ptr3 = ptr1;
    assert(*ptr3 == 45);
    *ptr1 = 123;
    assert(*ptr2 == 123);
    ptr3 = ptr1;
    assert(*ptr3 == 123);

    // nullptr is r-value so move operator=
    ptr4 = smart_ptr<char>(nullptr);
    ptr4 = nullptr;
    ptr3 = smart_ptr<char>(nullptr);
    ptr1 = ptr2 = ptr3;

    smart_ptr<const char> ptr5(new char(12));
    ptr5 = ptr5 = ptr5;
    assert(*ptr5 == 12);
}
コード例 #7
0
void fit_smart_ptr_tests::test_case_comparisions()
{
    auto ptr1 = smart_make_shared<char>(45);
    assert(ptr1 != nullptr);

    fit_smart_ptr<char> ptr2(nullptr);
    assert(ptr2 == nullptr);

    fit_smart_ptr<char> ptr3(nullptr);
    assert(ptr3 == nullptr);

    auto ptr4 = ptr1;
    assert(ptr4 == ptr1);

    ptr2 = ptr4;
    assert(ptr2 == ptr4 && ptr4 == ptr1);
    ptr3 = ptr1;
    assert(ptr3 == ptr1);
    *ptr1 = 123;
    assert(ptr3 == ptr1);

    ptr4 = nullptr;
    assert(ptr4 == nullptr);
    ptr3 = fit_smart_ptr<char>(nullptr);
    assert(ptr3 == nullptr);

    assert(nullptr != ptr1);
    ptr1 = ptr2 = ptr3;
    assert(ptr1 == nullptr);
    assert(ptr2 == nullptr);

    assert(nullptr == ptr1);
}
コード例 #8
0
void fit_smart_ptr_tests::test_case_copy_and_assignment()
{
    auto ptr1 = smart_make_shared<char>(45);
    assert(*ptr1 == 45);
    assert(ptr1.use_count() == 1);

    fit_smart_ptr<char> ptr2(nullptr);
    fit_smart_ptr<char> ptr3(nullptr);
    auto ptr4(ptr1);
    assert(*ptr4 == 45);
    assert(ptr4.use_count() == 2);
    assert(ptr1.use_count() == 2);

    ptr2 = ptr4;
    assert(*ptr2 == 45);
    ptr3 = ptr1;
    assert(*ptr3 == 45);
    *ptr1 = 123;
    assert(*ptr2 == 123);
    ptr3 = ptr1;
    assert(*ptr3 == 123);

    // nullptr is r-value so move operator=
    ptr4 = fit_smart_ptr<char>(nullptr);
    ptr4 = nullptr;
    ptr3 = fit_smart_ptr<char>(nullptr);
    ptr1 = ptr2 = ptr3;

    fit_smart_ptr<char> ptr5 = smart_make_shared<char>(12);
    ptr5 = ptr5 = ptr5;
    assert(*ptr5 == 12);
}
コード例 #9
0
ファイル: PointerWrapper.t.cpp プロジェクト: el-bart/ACARM-ng
void testObj::test<10>(void)
{
  PointerWrapper< boost::shared_ptr<Data> > ptr(sp_);

  PointerWrapper< boost::shared_ptr<Data> >       ptr1(ptr);
  PointerWrapper< boost::shared_ptr<const Data> > ptr2(ptr);

  PointerWrapper<Data*>       ptr3(ptr);
  PointerWrapper<const Data*> ptr4(ptr);
}
コード例 #10
0
int main(int argc, char **argv) {
    HasPtr ptr1("good");
    HasPtr ptr2 = ptr1;
    HasPtr ptr3("terrible");
    std::string* str2 = new std::string("happy");
    ptr2.setPs(str2);
    ptr1 = ptr3;
    ptr1.print();
    ptr2.print();

    return 0;
}
コード例 #11
0
ファイル: PointerWrapper.t.cpp プロジェクト: el-bart/ACARM-ng
void testObj::test<9>(void)
{
  PointerWrapper< Commons::SharedPtrNotNULL<Data> > ptr(spnn_);

  PointerWrapper< Commons::SharedPtrNotNULL<Data> >       ptr1(ptr);
  PointerWrapper< Commons::SharedPtrNotNULL<const Data> > ptr2(ptr);

  PointerWrapper< boost::shared_ptr<Data> >       ptr3(ptr);
  PointerWrapper< boost::shared_ptr<const Data> > ptr4(ptr);

  PointerWrapper<Data*>       ptr5(ptr);
  PointerWrapper<const Data*> ptr6(ptr);
}
コード例 #12
0
void smart_ptr_tests::test_case_use_count()
{
    smart_ptr<char> ptr1(new char(45));
    assert(ptr1.use_count() == 1);

    smart_ptr<char> ptr2(nullptr);
    smart_ptr<char> ptr3(nullptr);
    auto ptr4(ptr1);
    assert(ptr4.use_count() == 2);
    assert(ptr3.use_count() == 0);
    assert(ptr2.use_count() == 0);
    assert(ptr1.use_count() == 2);

    ptr2 = ptr4;
    assert(ptr4.use_count() == 3);
    assert(ptr3.use_count() == 0);
    assert(ptr2.use_count() == 3);
    assert(ptr1.use_count() == 3);
    ptr3 = ptr1;
    assert(ptr3.use_count() == 4);
    assert(ptr4.use_count() == 4);
    assert(ptr2.use_count() == 4);
    assert(ptr1.use_count() == 4);
    *ptr1 = 123;
    assert(ptr3.use_count() == 4);
    assert(ptr4.use_count() == 4);
    assert(ptr2.use_count() == 4);
    assert(ptr1.use_count() == 4);


    // testing overloading for nullptr
    ptr4 = nullptr;
    assert(ptr4.use_count() == 0);
    assert(ptr3.use_count() == 3);
    assert(ptr2.use_count() == 3);
    assert(ptr1.use_count() == 3);
    // NULL is r-value so move operator=
    ptr3 = smart_ptr<char>(nullptr);
    assert(ptr4.use_count() == 0);
    assert(ptr3.use_count() == 0);
    assert(ptr2.use_count() == 2);
    assert(ptr1.use_count() == 2);
    ptr1 = ptr2 = ptr3;
    assert(ptr4.use_count() == 0);
    assert(ptr3.use_count() == 0);
    assert(ptr2.use_count() == 0);
    assert(ptr1.use_count() == 0);
}
コード例 #13
0
TEST(fxcrt, WeakPtrNull) {
  WeakPtr ptr1;
  EXPECT_FALSE(ptr1);

  WeakPtr ptr2;
  EXPECT_TRUE(ptr1 == ptr2);
  EXPECT_FALSE(ptr1 != ptr2);

  WeakPtr ptr3(ptr1);
  EXPECT_TRUE(ptr1 == ptr3);
  EXPECT_FALSE(ptr1 != ptr3);

  WeakPtr ptr4 = ptr1;
  EXPECT_TRUE(ptr1 == ptr4);
  EXPECT_FALSE(ptr1 != ptr4);
}
コード例 #14
0
ファイル: gmGCRoot.cpp プロジェクト: joechenq/multi-script
// Test the gmGCRoot system
void TestGMGCRoot()
{ 
  gmGCRootManager::Init(); // Init system
  {
    gmMachine machine1;

    gmGCRoot<gmStringObject> ptr1;
    
    gmStringObject* stringObj1 = machine1.AllocStringObject("hello");
    
    ptr1.Set(stringObj1, &machine1); // Initialize via func
    
    gmStringObject* nat1 = ptr1; // Assign pointer
    
    gmGCRoot<gmStringObject> ptr2;
    ptr2 = ptr1;
    
    ptr1 = NULL; // Assign to null
    ptr2 = NULL;
    //ptr2 = nat1; // ERROR

    gmStringObject* stringObj2 = machine1.AllocStringObject("apple");
    gmGCRoot<gmStringObject> ptr3(stringObj2, &machine1); // Initialize via constructor
    gmGCRoot<gmStringObject> ptr4(stringObj2, &machine1); // Duplicate without copy

    gmGCRoot<gmStringObject> ptr5;
    {
      gmMachine machine2;

      gmStringObject* stringObj3 = machine2.AllocStringObject("bannana");
      ptr5.Set(stringObj3, &machine2);
     
      gmGCRootManager::Get()->DestroyMachine(&machine2); // Null associated pointers
    }
    if( ptr5 )
    {
      int i=1; // Won't get here
    }
    
  }
  gmGCRootManager::Destroy();
}
コード例 #15
0
/** \brief function to test a ptr_t
 */
nunit_res_t	ptr_testclass_t::ptr_cow(const nunit_testclass_ftor_t &testclass_ftor) throw()
{
	// log to debug
	KLOG_DBG("enter");
	
	// create a ptr_cow_t
	const ptr_cow_t<std::string>	ptr1(nipmem_new std::string("hello world."));
	// run some check on ptr1
	NUNIT_ASSERT( ptr1.get_ptr() != NULL );
	NUNIT_ASSERT( ptr1.count() == 1 );
	NUNIT_ASSERT( *ptr1 == "hello world." );
	
	// copy the ptr1 into const ptr2 INSIDE bracket to ctor/dtor
{
	const ptr_cow_t<std::string>	ptr2(ptr1);
	// run some check on ptr2
	NUNIT_ASSERT( ptr2.get_ptr() == ptr1.get_ptr() );
	NUNIT_ASSERT( *ptr2 == "hello world." );
	// as ptr2 is const, using it doesnt trigger the copy-on-write
	NUNIT_ASSERT( ptr1.count() == 2 );
	NUNIT_ASSERT( ptr2.count() == 2 );
}

	// copy the ptr1 into ptr3 INSIDE bracket to ctor/dtor
{
	ptr_cow_t<std::string>	ptr3(ptr1);
	// at this point, ptr3 is still shared with ptr1
	NUNIT_ASSERT( ptr1.count() == 2 );
	NUNIT_ASSERT( ptr3.count() == 2 );
	// this trigger the usage of ptr3, as it is non const, it trigger the copy on write too
	NUNIT_ASSERT( *ptr3 == "hello world." );
	NUNIT_ASSERT( ptr1.count() == 1 );
	NUNIT_ASSERT( ptr3.count() == 1 );
}
	
	// return no error
	return NUNIT_RES_OK;
}
コード例 #16
0
TEST(fxcrt, MaybeOwnedMove) {
  int delete_count = 0;
  PseudoDeletable thing1(100, &delete_count);
  {
    CFX_MaybeOwned<PseudoDeletable> ptr1(&thing1);
    CFX_MaybeOwned<PseudoDeletable> ptr2(
        pdfium::MakeUnique<PseudoDeletable>(200, &delete_count));
    EXPECT_FALSE(ptr1.IsOwned());
    EXPECT_TRUE(ptr2.IsOwned());

    CFX_MaybeOwned<PseudoDeletable> ptr3(std::move(ptr1));
    CFX_MaybeOwned<PseudoDeletable> ptr4(std::move(ptr2));
    EXPECT_FALSE(ptr1.IsOwned());
    EXPECT_FALSE(ptr2.IsOwned());
    EXPECT_FALSE(ptr3.IsOwned());
    EXPECT_TRUE(ptr4.IsOwned());
    EXPECT_EQ(0, delete_count);
    EXPECT_EQ(nullptr, ptr1.Get());
    EXPECT_EQ(nullptr, ptr2.Get());
    EXPECT_EQ(100, ptr3->GetID());
    EXPECT_EQ(200, ptr4->GetID());

    CFX_MaybeOwned<PseudoDeletable> ptr5;
    CFX_MaybeOwned<PseudoDeletable> ptr6;
    ptr5 = std::move(ptr3);
    ptr6 = std::move(ptr4);
    EXPECT_FALSE(ptr3.IsOwned());
    EXPECT_FALSE(ptr4.IsOwned());
    EXPECT_FALSE(ptr5.IsOwned());
    EXPECT_TRUE(ptr6.IsOwned());
    EXPECT_EQ(0, delete_count);
    EXPECT_EQ(nullptr, ptr3.Get());
    EXPECT_EQ(nullptr, ptr4.Get());
    EXPECT_EQ(100, ptr5->GetID());
    EXPECT_EQ(200, ptr6->GetID());
  }
  EXPECT_EQ(1, delete_count);
}
コード例 #17
0
ファイル: FourTree.cpp プロジェクト: Kurangceret/Decoupling
FourTree::FourTree(int maxObjects, int maxLevels, sf::FloatRect bounds, int currentLevel)
:mMaxLevels(maxLevels),
mMaxObjects(maxObjects),
mBounds(bounds),
mCurrentLevel(currentLevel),
isSpilt(false),
mWorldLocation(0.f, 0.f)
{
	for (int i = 0; i < LocationCount; i++)
		mNodes[i] = NULL;

	if (mCurrentLevel < mMaxLevels){
		float subWidth = mBounds.width / 2;
		float subHeight = mBounds.height / 2;
		float x = mBounds.left;
		float y = mBounds.top;
		//top right
		FourTree::Ptr ptr1(new FourTree(maxObjects, maxLevels, 
			sf::FloatRect(x + subWidth, y, subWidth, subHeight), mCurrentLevel + 1));
		//top left
		FourTree::Ptr ptr2(new FourTree(maxObjects, maxLevels, 
			sf::FloatRect(x, y, subWidth, subHeight), mCurrentLevel + 1));
		//bottom left
		FourTree::Ptr ptr3(new FourTree(maxObjects, maxLevels, 
			sf::FloatRect(x, y + subHeight, subWidth, subHeight), mCurrentLevel + 1));
		//bottom right
		FourTree::Ptr ptr4(new FourTree(maxObjects, maxLevels, 
			sf::FloatRect(x + subWidth, y + subHeight, subWidth, subHeight), mCurrentLevel + 1));

		mNodes[Top_Right] = std::move(ptr1);
		mNodes[Top_Left] = std::move(ptr2);
		mNodes[Bottom_Left] = std::move(ptr3);
		mNodes[Bottom_Right] = std::move(ptr4);
	}
			
	
}
コード例 #18
0
ファイル: test_ptr.cpp プロジェクト: cargabsj175/bombono-dvd
void TestPtr()
{
    bool b = false;

    // конструкторы
    {
        Ptr<set_bool> ptr1;
        Ptr<set_bool> ptr2((set_bool*)0);

        Ptr<set_bool> ptr3(new set_bool(b));
        BOOST_CHECK( b );
    }
    BOOST_CHECK( !b );

    // get(), operator =
    {
        Ptr<set_bool> ptr;
        BOOST_CHECK( !ptr.get() );

        set_bool* p_sb = new set_bool(b); 
        ptr = p_sb;

        BOOST_CHECK( ptr.get() == p_sb );
        BOOST_CHECK( b );

        Ptr<set_bool> new_ptr(ptr);
        BOOST_CHECK( new_ptr.get() == p_sb );
        BOOST_CHECK( b );
    }
    BOOST_CHECK( !b );

    // reset()
    {
        Ptr<set_bool> ptr(new set_bool(b)); 

        ptr.reset((set_bool*)0);
        BOOST_CHECK( !b );

        ptr.reset( new set_bool(b) );
        BOOST_CHECK( b );
    }

    // if( ptr )
    // operator *
    {
        Ptr<int> ptr;
        if( ptr )
            BOOST_CHECK( false );

        int* p_int = new int(5);
        ptr = p_int;

        if( ptr )
            BOOST_CHECK( true );
        BOOST_CHECK( 5 == *ptr );
    }

    // operator ->
    {
        typedef std::pair<int, int> iint;
        Ptr<iint> pair_ptr(new iint(1,2));
        BOOST_CHECK( pair_ptr->first  == 1 );
        BOOST_CHECK( pair_ptr->second == 2 );
    }
}
コード例 #19
0
void tst_QSharedPointer::customDeleter()
{
    {
        QSharedPointer<Data> ptr(new Data, &Data::doDelete);
        QSharedPointer<Data> ptr2(new Data, &Data::alsoDelete);
        QSharedPointer<Data> ptr3(new Data, &Data::virtualDelete);
    }
    {
        QSharedPointer<DerivedData> ptr(new DerivedData, &Data::doDelete);
        QSharedPointer<DerivedData> ptr2(new DerivedData, &Data::alsoDelete);
        QSharedPointer<DerivedData> ptr3(new DerivedData, &Data::virtualDelete);
    }

    customDeleterFnCallCount = 0;
    {
        QSharedPointer<Data> ptr = QSharedPointer<Data>(new Data, customDeleterFn);
        ptr.data();
        QCOMPARE(customDeleterFnCallCount, 0);
    }
    QCOMPARE(customDeleterFnCallCount, 1);

    customDeleterFnCallCount = 0;
    {
        QSharedPointer<Data> ptr = QSharedPointer<Data>(new Data, customDeleterFn);
        QCOMPARE(customDeleterFnCallCount, 0);
        ptr.clear();
        QCOMPARE(customDeleterFnCallCount, 1);
    }
    QCOMPARE(customDeleterFnCallCount, 1);

    customDeleterFnCallCount = 0;
    {
        QSharedPointer<Data> ptr = QSharedPointer<Data>(new Data, customDeleterFn);
        QCOMPARE(customDeleterFnCallCount, 0);
        ptr = QSharedPointer<Data>(new Data);
        QCOMPARE(customDeleterFnCallCount, 1);
    }
    QCOMPARE(customDeleterFnCallCount, 1);

    customDeleterFnCallCount = 0;
    {
        QSharedPointer<Data> ptr = QSharedPointer<Data>(new DerivedData, customDeleterFn);
        ptr.data();
        QCOMPARE(customDeleterFnCallCount, 0);
    }
    QCOMPARE(customDeleterFnCallCount, 1);

    customDeleterFnCallCount = 0;
    {
        QSharedPointer<DerivedData> ptr = QSharedPointer<DerivedData>(new DerivedData, customDeleterFn);
        ptr.data();
        QCOMPARE(customDeleterFnCallCount, 0);
    }
    QCOMPARE(customDeleterFnCallCount, 1);

    customDeleterFnCallCount = 0;
    {
        QSharedPointer<Data> other;
        {
            QSharedPointer<Data> ptr = QSharedPointer<Data>(new Data, customDeleterFn);
            other = ptr;
            QCOMPARE(customDeleterFnCallCount, 0);
        }
        QCOMPARE(customDeleterFnCallCount, 0);
    }
    QCOMPARE(customDeleterFnCallCount, 1);

    customDeleterFnCallCount = 0;
    {
        QSharedPointer<Data> other;
        {
            QSharedPointer<DerivedData> ptr = QSharedPointer<DerivedData>(new DerivedData, customDeleterFn);
            other = ptr;
            QCOMPARE(customDeleterFnCallCount, 0);
        }
        QCOMPARE(customDeleterFnCallCount, 0);
    }
    QCOMPARE(customDeleterFnCallCount, 1);

    CustomDeleter<Data> dataDeleter;
    dataDeleter.callCount = 0;
    {
        QSharedPointer<Data> ptr = QSharedPointer<Data>(new Data, dataDeleter);
        ptr.data();
        QCOMPARE(dataDeleter.callCount, 0);
    }
    QCOMPARE(dataDeleter.callCount, 1);

    dataDeleter.callCount = 0;
    {
        QSharedPointer<Data> ptr = QSharedPointer<Data>(new Data, dataDeleter);
        QSharedPointer<Data> other = ptr;
        other.clear();
        QCOMPARE(dataDeleter.callCount, 0);
    }
    QCOMPARE(dataDeleter.callCount, 1);

    dataDeleter.callCount = 0;
    {
        QSharedPointer<Data> other;
        {
            QSharedPointer<Data> ptr = QSharedPointer<Data>(new Data, dataDeleter);
            other = ptr;
            QCOMPARE(dataDeleter.callCount, 0);
        }
        QCOMPARE(dataDeleter.callCount, 0);
    }
    QCOMPARE(dataDeleter.callCount, 1);

    dataDeleter.callCount = 0;
    {
        QSharedPointer<DerivedData> ptr = QSharedPointer<DerivedData>(new DerivedData, dataDeleter);
        ptr.data();
        QCOMPARE(dataDeleter.callCount, 0);
    }
    QCOMPARE(dataDeleter.callCount, 1);

    CustomDeleter<DerivedData> derivedDataDeleter;
    derivedDataDeleter.callCount = 0;
    dataDeleter.callCount = 0;
    {
        QSharedPointer<DerivedData> ptr = QSharedPointer<DerivedData>(new DerivedData, derivedDataDeleter);
        ptr.data();
        QCOMPARE(dataDeleter.callCount, 0);
        QCOMPARE(derivedDataDeleter.callCount, 0);
    }
    QCOMPARE(dataDeleter.callCount, 0);
    QCOMPARE(derivedDataDeleter.callCount, 1);

    derivedDataDeleter.callCount = 0;
    dataDeleter.callCount = 0;
    {
        QSharedPointer<Data> other;
        {
            QSharedPointer<DerivedData> ptr = QSharedPointer<DerivedData>(new DerivedData, dataDeleter);
            other = ptr;
            QCOMPARE(dataDeleter.callCount, 0);
            QCOMPARE(derivedDataDeleter.callCount, 0);
        }
        QCOMPARE(dataDeleter.callCount, 0);
        QCOMPARE(derivedDataDeleter.callCount, 0);
    }
    QCOMPARE(dataDeleter.callCount, 1);
    QCOMPARE(derivedDataDeleter.callCount, 0);

    derivedDataDeleter.callCount = 0;
    dataDeleter.callCount = 0;
    {
        QSharedPointer<Data> other;
        {
            QSharedPointer<DerivedData> ptr = QSharedPointer<DerivedData>(new DerivedData, derivedDataDeleter);
            other = ptr;
            QCOMPARE(dataDeleter.callCount, 0);
            QCOMPARE(derivedDataDeleter.callCount, 0);
        }
        QCOMPARE(dataDeleter.callCount, 0);
        QCOMPARE(derivedDataDeleter.callCount, 0);
    }
    QCOMPARE(dataDeleter.callCount, 0);
    QCOMPARE(derivedDataDeleter.callCount, 1);
}