mirror of https://github.com/cutefishos/calamares
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			210 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
			
		
		
	
	
			210 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			C++
		
	
/*
 | 
						|
 *   SPDX-License-Identifier: LGPL-2.0-only
 | 
						|
 *   License-Filename: LICENSES/LGPLv2-KDAB
 | 
						|
 *
 | 
						|
 *   The KD Tools Library is Copyright (C) 2001-2010 Klaralvdalens Datakonsult AB.
 | 
						|
 */
 | 
						|
#include "pimpl_ptr.h"
 | 
						|
 | 
						|
/*!
 | 
						|
  \class pimpl_ptr:
 | 
						|
  \ingroup core smartptr
 | 
						|
  \brief Owning pointer for private implementations
 | 
						|
  \since_c 2.1
 | 
						|
 | 
						|
  (The exception safety of this class has not been evaluated yet.)
 | 
						|
 | 
						|
  pimpl_ptr is a smart immutable pointer, which owns the contained object. Unlike other smart pointers,
 | 
						|
  it creates a standard constructed object when instanciated via the
 | 
						|
  \link pimpl_ptr() standard constructor\endlink.
 | 
						|
  Additionally, pimpl_ptr respects constness of the pointer object and returns \c const \c T* for
 | 
						|
  a const pimpl_ptr object.
 | 
						|
 | 
						|
  The content of a pimpl_ptr cannot be changed during it's lifetime.
 | 
						|
 | 
						|
  \section general-use General Use
 | 
						|
 | 
						|
  The general use case of pimpl_ptr is the "Pimpl Idiom", i.e. hiding the private implementation of a class
 | 
						|
  from the user's compiler which see \c MyClass as
 | 
						|
 | 
						|
  \code
 | 
						|
  class MyClass
 | 
						|
  {
 | 
						|
  public:
 | 
						|
      MyClass();
 | 
						|
      ~MyClass();
 | 
						|
 | 
						|
      // public class API
 | 
						|
      int value() const;
 | 
						|
 | 
						|
  private:
 | 
						|
      class Private; // defined later
 | 
						|
      kdtools::pimpl_ptr< Private > d;
 | 
						|
  };
 | 
						|
  \endcode
 | 
						|
 | 
						|
  but not the private parts of it. These can only be seen (and accessed) by the code knowing \c MyClass::Private:
 | 
						|
 | 
						|
  \code
 | 
						|
  class MyClass::Private
 | 
						|
  {
 | 
						|
  public:
 | 
						|
      int value;
 | 
						|
  };
 | 
						|
 | 
						|
  MyClass::MyClass()
 | 
						|
  {
 | 
						|
      // d was automatically filled with new Private
 | 
						|
      d->value = 42;
 | 
						|
  }
 | 
						|
 | 
						|
  MyClass::~MyClass()
 | 
						|
  {
 | 
						|
      // the content of d gets deleted automatically
 | 
						|
  }
 | 
						|
 | 
						|
  int MyClass::value() const
 | 
						|
  {
 | 
						|
      // access the private part:
 | 
						|
      // since MyClass::value() is const, the returned pointee is const, too
 | 
						|
      return d->value;
 | 
						|
  }
 | 
						|
  \endcode
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
/*!
 | 
						|
  \fn pimpl_ptr::pimpl_ptr()
 | 
						|
 | 
						|
  Default constructor. Constructs a pimpl_tr that contains (owns) a standard constructed
 | 
						|
  instance of \c T.
 | 
						|
 | 
						|
  \post \c *this owns a new object.
 | 
						|
*/
 | 
						|
 | 
						|
/*!
 | 
						|
  \fn pimpl_ptr::pimpl_ptr( T * t )
 | 
						|
 | 
						|
  Constructor. Constructs a pimpl_ptr that contains (owns) \a t.
 | 
						|
 | 
						|
  \post get() == obj
 | 
						|
*/
 | 
						|
 | 
						|
/*!
 | 
						|
  \fn pimpl_ptr::~pimpl_ptr()
 | 
						|
 | 
						|
  Destructor.
 | 
						|
 | 
						|
  \post The object previously owned by \c *this has been deleted.
 | 
						|
*/
 | 
						|
 | 
						|
/*!
 | 
						|
  \fn const T * pimpl_ptr::get() const
 | 
						|
 | 
						|
  \returns a const pointer to the contained (owned) object.
 | 
						|
  \overload
 | 
						|
*/
 | 
						|
 | 
						|
/*!
 | 
						|
  \fn T * pimpl_ptr::get()
 | 
						|
 | 
						|
  \returns a pointer to the contained (owned) object.
 | 
						|
*/
 | 
						|
 | 
						|
/*!
 | 
						|
  \fn const T & pimpl_ptr::operator*() const
 | 
						|
 | 
						|
  Dereference operator. Returns \link get() *get()\endlink.
 | 
						|
  \overload
 | 
						|
*/
 | 
						|
 | 
						|
/*!
 | 
						|
  \fn T & pimpl_ptr::operator*()
 | 
						|
 | 
						|
  Dereference operator. Returns \link get() *get()\endlink.
 | 
						|
*/
 | 
						|
 | 
						|
/*!
 | 
						|
  \fn const T * pimpl_ptr::operator->() const
 | 
						|
 | 
						|
  Member-by-pointer operator. Returns get().
 | 
						|
  \overload
 | 
						|
*/
 | 
						|
 | 
						|
/*!
 | 
						|
  \fn T * pimpl_ptr::operator->()
 | 
						|
 | 
						|
  Member-by-pointer operator. Returns get().
 | 
						|
*/
 | 
						|
 | 
						|
#ifdef KDTOOLSCORE_UNITTESTS
 | 
						|
 | 
						|
#include <kdunittest/test.h>
 | 
						|
 | 
						|
#include <QObject>
 | 
						|
#include <QPointer>
 | 
						|
 | 
						|
namespace
 | 
						|
{
 | 
						|
    struct ConstTester
 | 
						|
    {
 | 
						|
        bool isConst()
 | 
						|
        {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        bool isConst() const
 | 
						|
        {
 | 
						|
            return true;
 | 
						|
        }
 | 
						|
    };
 | 
						|
}
 | 
						|
 | 
						|
KDAB_UNITTEST_SIMPLE( pimpl_ptr, "kdcoretools" ) {
 | 
						|
 | 
						|
    {
 | 
						|
        kdtools::pimpl_ptr< QObject > p;
 | 
						|
        assertNotNull( p.get() );
 | 
						|
        assertNull( p->parent() );
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    {
 | 
						|
        QPointer< QObject > o;
 | 
						|
        {
 | 
						|
            kdtools::pimpl_ptr< QObject > qobject( new QObject );
 | 
						|
            o = qobject.get();
 | 
						|
            assertEqual( o, qobject.operator->() );
 | 
						|
            assertEqual( o, &(qobject.operator*()) );
 | 
						|
        }
 | 
						|
        assertNull( o );
 | 
						|
    }
 | 
						|
 | 
						|
    {
 | 
						|
        const kdtools::pimpl_ptr< QObject > qobject( new QObject );
 | 
						|
        const QObject* o = qobject.get();
 | 
						|
        assertEqual( o, qobject.operator->() );
 | 
						|
        assertEqual( o, &(qobject.operator*()) );
 | 
						|
    }
 | 
						|
 | 
						|
    {
 | 
						|
        kdtools::pimpl_ptr< QObject > o1;
 | 
						|
        assertTrue( o1 );
 | 
						|
        kdtools::pimpl_ptr< QObject > o2( 0 );
 | 
						|
        assertFalse( o2 );
 | 
						|
    }
 | 
						|
 | 
						|
    {
 | 
						|
        const kdtools::pimpl_ptr< ConstTester > o1;
 | 
						|
        kdtools::pimpl_ptr< ConstTester > o2;
 | 
						|
        assertTrue( o1->isConst() );
 | 
						|
        assertFalse( o2->isConst() );
 | 
						|
        assertTrue( (*o1).isConst() );
 | 
						|
        assertFalse( (*o2).isConst() );
 | 
						|
        assertTrue( o1.get()->isConst() );
 | 
						|
        assertFalse( o2.get()->isConst() );
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
#endif // KDTOOLSCORE_UNITTESTS
 |