]> git.saurik.com Git - wxWidgets.git/blobdiff - interface/ptr_scpd.h
Ticket #9592: gtk-choice-setcolumns.2.diff
[wxWidgets.git] / interface / ptr_scpd.h
index 13e6202ad5e6e8d3a2cc97e1b2da12c81138546f..11180b1a5565cc28350759a747102f0ed92e54dc 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        ptr_scpd.h
-// Purpose:     documentation for wxScopedPtr class
+// Purpose:     interface of wxScopedPtr
 // Author:      wxWidgets team
 // RCS-ID:      $Id$
 // Licence:     wxWindows license
     @wxheader{ptr_scpd.h}
 
     This is a simple scoped smart pointer implementation that is similar to
-    the Boost smart pointers but rewritten to
-    use macros instead.
+    the Boost smart pointers (see http://www.boost.org) but rewritten
+    to use macros instead.
 
     Since wxWidgets 2.9.0 there is also a templated version of this class
-    with the same name. See wxScopedPtrT.
+    with the same name. See wxScopedPtr<T>.
 
     A smart pointer holds a pointer to an object. The memory used by the object is
     deleted when the smart pointer goes out of scope. This class is different from
-    the @c std::auto_ptr in so far as it doesn't provide copy constructor
+    the @c std::auto_ptr<> in so far as it doesn't provide copy constructor
     nor assignment operator. This limits what you can do with it but is much less
-    surprizing than the "destructive copy'' behaviour of the standard class.
+    surprizing than the "destructive copy" behaviour of the standard class.
+
+    @b Example:
+
+    Below is an example of using a wxWidgets scoped smart pointer and pointer array.
+
+    @code
+    class MyClass{ ... };
+
+    // declare a smart pointer to a MyClass called wxMyClassPtr
+    wxDECLARE_SCOPED_PTR(MyClass, wxMyClassPtr)
+    // declare a smart pointer to an array of chars
+    wxDECLARE_SCOPED_ARRAY(char, wxCharArray)
+
+    ...
+
+    // define the first pointer class, must be complete
+    wxDEFINE_SCOPED_PTR(MyClass, wxMyClassPtr)
+    // define the second pointer class
+    wxDEFINE_SCOPED_ARRAY(char, wxCharArray)
+
+    // create an object with a new pointer to MyClass
+    wxMyClassPtr theObj(new MyClass());
+    // reset the pointer (deletes the previous one)
+    theObj.reset(new MyClass());
+
+    // access the pointer
+    theObj->MyFunc();
+
+    // create an object with a new array of chars
+    wxCharArray theCharObj(new char[100]);
+
+    // access the array
+    theCharObj[0] = "!";
+    @endcode
+
+    @section wxscopedptr_newpointers Declaring new smart pointer types
+
+    To declare the smart pointer class @c CLASSNAME containing pointes to
+    a (possibly incomplete) type @c TYPE you should use
+    @code
+        wxDECLARE_SCOPED_PTR( TYPE,        // type of the values
+                              CLASSNAME ); // name of the class
+    @endcode
+    And later, when @c TYPE is fully defined, you must also use
+    @code
+        wxDEFINE_SCOPED_PTR( TYPE, CLASSNAME );
+    @endcode
+    to implement the scoped pointer class.
+
+    The first argument of these macro is the pointer type, the second is the name
+    of the new smart pointer class being created. Below we will use wxScopedPtr
+    to represent the scoped pointer class, but the user may create the class with
+    any legal name.
+
+    Alternatively, if you don't have to separate the point of declaration and
+    definition of this class and if you accept the standard naming convention,
+    that is that the scoped pointer for the class @c Foo is called @c FooPtr,
+    you can use a single macro which replaces two macros above:
+    @code
+        wxDEFINE_SCOPED_PTR_TYPE( TYPE );
+    @endcode
+    Once again, in this cass @c CLASSNAME will be @c TYPEPtr.
 
     @library{wxbase}
-    @category{FIXME}
+    @category{smartpointers}
 
-    @seealso
-    wxScopedArray
+    @see wxScopedArray
 */
 class wxScopedPtr
 {
 public:
     /**
-        Creates the smart pointer with the given pointer or none if @NULL.  On
-        compilers that support it, this uses the explicit keyword.
+        Creates the smart pointer with the given pointer or none if @NULL.
+
+        On compilers that support it, this uses the explicit keyword.
     */
-    explicit wxScopedPtr(type T = @NULL);
+    explicit wxScopedPtr(type* T = NULL);
 
     /**
         Destructor frees the pointer help by this object if it is not @NULL.
@@ -44,59 +106,116 @@ public:
     ~wxScopedPtr();
 
     /**
-        This operator gets the pointer stored in the smart pointer or returns @NULL if
-        there is none.
+        This operator gets the pointer stored in the smart pointer or returns
+        @NULL if there is none.
     */
     const T* get();
 
     /**
         This operator works like the standard C++ pointer operator to return the object
-        being pointed to by the pointer.  If the pointer is @NULL or invalid this will
-        crash.
+        being pointed to by the pointer.
+
+        @note
+        If the pointer is @NULL or invalid this will crash.
     */
-    const T operator *();
+    const T& operator *();
 
     /**
         This operator works like the standard C++ pointer operator to return the pointer
         in the smart pointer or @NULL if it is empty.
     */
-    const T* operator -();
+    const T* operator ->();
 
     /**
         Returns the currently hold pointer and resets the smart pointer object to
-        @NULL. After a call to this function the caller is responsible for
-        deleting the pointer.
+        @NULL.
+
+        @remarks
+        After a call to this function the caller is responsible for deleting the
+        pointer.
     */
-    T * release();
+    T* release();
 
     /**
-        Deletes the currently held pointer and sets it to @e p or to @NULL if no
-        arguments are specified. This function does check to make sure that the
-        pointer you are assigning is not the same pointer that is already stored.
+        Deletes the currently held pointer and sets it to @a p or to @NULL if no
+        arguments are specified.
+
+        @note
+        This function does check to make sure that the pointer you are assigning
+        is not the same pointer that is already stored.
     */
-    reset(T p  = @NULL);
+    reset(T* p  = NULL);
 
     /**
-        Swap the pointer inside the smart pointer with @e other. The pointer being
+        Swap the pointer inside the smart pointer with @a other. The pointer being
         swapped must be of the same type (hence the same class name).
     */
-    swap(wxScopedPtr amp; other);
+    swap(wxScopedPtr& other);
 };
 
 
+
 /**
     @class wxScopedArray
     @wxheader{ptr_scpd.h}
 
     This is a simple scoped smart pointer array implementation that is similar to
-    the Boost smart pointers but rewritten to
+    the Boost smart pointers (see http://www.boost.org/) but rewritten to
     use macros instead.
 
+    @b Example:
+
+    Below is an example of using a wxWidgets scoped smart pointer and pointer array.
+
+    @code
+    class MyClass { ... };
+
+    // declare a smart pointer to a MyClass called wxMyClassPtr
+    wxDECLARE_SCOPED_PTR(MyClass, wxMyClassPtr)
+    // declare a smart pointer to an array of chars
+    wxDECLARE_SCOPED_ARRAY(char, wxCharArray)
+
+    ...
+
+    // define the first pointer class, must be complete
+    wxDEFINE_SCOPED_PTR(MyClass, wxMyClassPtr)
+    // define the second pointer class
+    wxDEFINE_SCOPED_ARRAY(char, wxCharArray)
+
+    // create an object with a new pointer to MyClass
+    wxMyClassPtr theObj(new MyClass());
+    // reset the pointer (deletes the previous one)
+    theObj.reset(new MyClass());
+
+    // access the pointer
+    theObj->MyFunc();
+
+    // create an object with a new array of chars
+    wxCharArray theCharObj(new char[100]);
+
+    // access the array
+    theCharObj[0] = "!";
+    @endcode
+
+    <b>Declaring new smart pointer types:</b>
+    @code
+    wxDECLAR_SCOPED_ARRAY( TYPE,        // type of the values
+                           CLASSNAME ); // name of the class
+    @endcode
+
+    A smart pointer holds a pointer to an object (which must be complete when
+    wxDEFINE_SCOPED_ARRAY() is called).
+
+    The memory used by the object is deleted when the smart pointer goes out of
+    scope. The first argument of the macro is the pointer type, the second is the
+    name of the new smart pointer class being created. Below we will use wxScopedArray
+    to represent the scoped pointer array class, but the user may create the class with
+    any legal name.
+
     @library{wxbase}
-    @category{FIXME}
+    @category{smartpointers}
 
-    @seealso
-    wxScopedPtr
+    @see wxScopedPtr
 */
 class wxScopedArray
 {
@@ -105,7 +224,7 @@ public:
         Creates the smart pointer with the given pointer or none if @NULL.  On
         compilers that support it, this uses the explicit keyword.
     */
-    wxScopedArray(type T = @NULL);
+    wxScopedArray(type*  T = NULL);
 
     /**
         This operator gets the pointer stored in the smart pointer or returns @NULL if
@@ -117,127 +236,133 @@ public:
         This operator acts like the standard [] indexing operator for C++ arrays.  The
         function does not do bounds checking.
     */
-    const T operator [](long int i);
+    const T& operator [](long int i);
 
     /**
         Deletes the currently held pointer and sets it to 'p' or to @NULL if no
         arguments are specified. This function does check to make sure that the
         pointer you are assigning is not the same pointer that is already stored.
     */
-    reset(T p  = @NULL);
+    reset(T* p  = NULL);
 
     /**
-        Swap the pointer inside the smart pointer with 'ot'. The pointer being swapped
+        Swap the pointer inside the smart pointer with @a ot. The pointer being swapped
         must be of the same type (hence the same class name).
     */
-    swap(wxScopedPtr amp; ot);
+    swap(wxScopedPtr& ot);
 };
 
 
+
 /**
     @class wxScopedTiedPtr
     @wxheader{ptr_scpd.h}
 
-    This is a variation on the topic of wxScopedPtr. This
-    class is also a smart pointer but in addition it "ties'' the pointer value to
-    another variable. In other words, during the life time of this class the value
-    of that variable is set to be the same as the value of the pointer itself and
-    it is reset to its old value when the object is destroyed. This class is
-    especially useful when converting the existing code (which may already store
-    the pointers value in some variable) to the smart pointers.
+    This is a variation on the topic of wxScopedPtr. This class is also a smart pointer
+    but in addition it "ties" the pointer value to another variable. In other words,
+    during the life time of this class the value of that variable is set to be the same
+    as the value of the pointer itself and it is reset to its old value when the object
+    is destroyed. This class is especially useful when converting the existing code
+    (which may already store the pointers value in some variable) to the smart pointers.
 
     @library{wxbase}
-    @category{FIXME}
+    @category{smartpointers}
 */
-class wxScopedTiedPtr
+class wxScopedTiedPtr : public wxScopedPtr
 {
 public:
     /**
-        Constructor creates a smart pointer initialized with @e ptr and stores
-        @e ptr in the location specified by @e ppTie which must not be
-        @NULL.
+        Constructor creates a smart pointer initialized with @a ptr and stores
+        @a ptr in the location specified by @a ppTie which must not be @NULL.
     */
-    wxScopedTiedPtr(T ** ppTie, T * ptr);
+    wxScopedTiedPtr(T** ppTie, T* ptr);
 
     /**
         Destructor frees the pointer help by this object and restores the value stored
         at the tied location (as specified in the @ref ctor() constructor)
         to the old value.
-        
-        Warning: this location may now contain an uninitialized value if it hadn't been
-        initialized previously, in particular don't count on it magically being
-        @NULL!
+
+        @warning
+        This location may now contain an uninitialized value if it hadn't been
+        initialized previously, in particular don't count on it magically being @NULL!
     */
     ~wxScopedTiedPtr();
 };
 
 
+
 /**
-    @class wxScopedPtrT
     @wxheader{ptr_scpd.h}
 
     A scoped pointer template class. It is the template version of
-    the old-style @ref overview_wxscopedptr "scoped pointer macros".
+    the old-style @ref classwx_scoped_ptr "scoped pointer macros".
 
     @library{wxbase}
-    @category{FIXME}
+    @category{smartpointers}
 
-    @seealso
-    wxSharedPtr, wxWeakRef
+    @see wxSharedPtr<T>, wxWeakRef<T>
 */
+template<typename T>
 class wxScopedPtr<T>
 {
 public:
     /**
         Constructor.
     */
-    wxScopedPtrT(T * ptr = @NULL);
+    wxScopedPtr(T* ptr = NULL);
 
     /**
         Destructor.
     */
-    ~wxScopedPtrT();
+    ~wxScopedPtr();
 
     /**
         Returns pointer to object or @NULL.
     */
-    T * get();
+    T* get() const;
 
     /**
         Conversion to a boolean expression (in a variant which is not
-        convertable to anything but a boolean expression). If this class
-        contains a valid pointer it will return @e @true, if it contains
-        a @NULL pointer it will return @e @false.
+        convertable to anything but a boolean expression).
+
+        If this class contains a valid pointer it will return @true, if it contains
+        a @NULL pointer it will return @false.
     */
-    operator unspecified_bool_type();
+    operator unspecified_bool_type() const;
 
     /**
-        Returns a reference to the object. If the internal pointer is @NULL
-        this method will cause an assert in debug mode.
+        Returns a reference to the object.
+
+        @note
+        If the internal pointer is @NULL this method will cause an assert
+        in debug mode.
     */
-    T operator*();
+    T operator*() const;
 
     /**
         Returns pointer to object. If the pointer is @NULL this method will
         cause an assert in debug mode.
     */
-    T * operator-();
+    T* operator->() const;
 
     /**
         Releases the current pointer and returns it.
+
+        @remarks
         Afterwards the caller is responsible for deleting
         the data contained in the scoped pointer before.
     */
     T* release();
 
     /**
-        Reset pointer to the value of @e ptr. The
-        previous pointer will be deleted.
+        Reset pointer to the value of @a ptr.
+        The previous pointer will be deleted.
     */
-    void reset(T * ptr = @NULL);
+    void reset(T* ptr = NULL);
 
     /**
         Swaps pointers.
     */
-    void swap(wxScopedPtr<T> & ot);
+    void swap(wxScopedPtr<T>& ot);
 };
+