diff options
author | schmidt <douglascraigschmidt@users.noreply.github.com> | 2000-12-08 16:48:57 +0000 |
---|---|---|
committer | schmidt <douglascraigschmidt@users.noreply.github.com> | 2000-12-08 16:48:57 +0000 |
commit | 913824e5e462f44dda679324c416776b05cecabb (patch) | |
tree | 4d767e709120fce9a4814791c485359993cc94c8 /ace/Refcounted_Auto_Ptr.h | |
parent | dd0e127683088e889b58a523e9be7c847db33f84 (diff) | |
download | ATCD-913824e5e462f44dda679324c416776b05cecabb.tar.gz |
ChangeLogTag:Fri Dec 8 10:34:32 2000 Douglas C. Schmidt <schmidt@ace.cs.wustl.edu>
Diffstat (limited to 'ace/Refcounted_Auto_Ptr.h')
-rw-r--r-- | ace/Refcounted_Auto_Ptr.h | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/ace/Refcounted_Auto_Ptr.h b/ace/Refcounted_Auto_Ptr.h new file mode 100644 index 00000000000..a935dd38e20 --- /dev/null +++ b/ace/Refcounted_Auto_Ptr.h @@ -0,0 +1,174 @@ +/* -*- C++ -*- */ + +//============================================================================= +/** + * @file Refcounted_Auto_Ptr.h + * + * $Id$ + * + * @author John Tucker <JTucker@infoglide.com> + */ +//============================================================================= + + +#ifndef ACE_REFCOUNTED_AUTO_PTR_H +#define ACE_REFCOUNTED_AUTO_PTR_H +#include "ace/pre.h" + +#include "ace/OS.h" + +#if !defined (ACE_LACKS_PRAGMA_ONCE) +# pragma once +#endif /* ACE_LACKS_PRAGMA_ONCE */ + +// Forward decl. +template <class X, class ACE_LOCK> class ACE_Refcounted_Auto_Ptr_Rep; +template <class X, class ACE_LOCK> class ACE_Refcounted_Auto_Ptr; + +/** + * @class ACE_Refcounted_Auto_Ptr + * + * @brief This class implements support for a reference counted auto_ptr. + * Assigning or copying instances of an ACE_Refcounted_Auto_Ptr + * will automatically increment the reference count. When the last + * instance that references a ACE_Refcounted_Auto_Ptr instance is + * destroyed or overwritten, it will invoke delete on its underlying + * pointer. + */ +template <class X, class ACE_LOCK> +class ACE_Refcounted_Auto_Ptr +{ +public: + + // = Initialization and termination methods. + + /// Constructor that initializes an <ACE_Refcounted_Auto_Ptr> to + /// point to the result <r> immediately. + ACE_Refcounted_Auto_Ptr (X *p = 0); + + /// Copy constructor binds <this> and <r> to the same + /// <ACE_Refcounted_Auto_Ptr_Rep>. An <ACE_Refcounted_Auto_Ptr_Rep> + /// is created if necessary. + ACE_Refcounted_Auto_Ptr (const ACE_Refcounted_Auto_Ptr<X, ACE_LOCK> &r); + + /// Destructor. + ~ACE_Refcounted_Auto_Ptr (void); + + /// Assignment operator that binds <this> and <r> to the same + /// <ACE_Refcounted_Auto_Ptr_Rep>. An <ACE_Refcounted_Auto_Ptr_Rep> + /// is created if necessary. + void operator = (const ACE_Refcounted_Auto_Ptr<X, ACE_LOCK> &r); + + /// Equality operator that returns 1 if both + /// ACE_Refcounted_Auto_Ptr<X, ACE_LOCK> objects point to the same + /// ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK> object. Attention: It + /// also returns 1 if both objects have just been instantiated and + /// not used yet. + int operator == (const ACE_Refcounted_Auto_Ptr<X, ACE_LOCK> &r) const; + + /// Inequality operator, which is the opposite of equality. + int operator != (const ACE_Refcounted_Auto_Ptr<X, ACE_LOCK> &r) const; + + /// Redirection operator + X *operator-> (void) const; + + // = Accessor methods. + + X &operator *() const; + + /// Sets the pointer value to 0 and returns its old value. + X *release (void); + + /// Invokes delete on the previous pointer value and then sets the + /// pointer value to the specified value. + void reset (X *p = 0); + + /// Get the pointer value. + X *get (void); + + /// Declare the dynamic allocation hooks. + ACE_ALLOC_HOOK_DECLARE; + +private: + /// the ACE_Refcounted_Auto_Ptr_Rep + typedef ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK> AUTO_REFCOUNTED_PTR_REP; + + /// Protect operations on the <ACE_Refcounted_Auto_Ptr>. + AUTO_REFCOUNTED_PTR_REP *rep_; +}; + +/** + * @class ACE_Refcounted_Auto_Ptr_Rep + * + * @brief An ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK> object + * incapsulates a pointer to an object of type X. It is pointed to by + * ACE_Refcounted_Auto_Ptr<X, ACE_LOCK> object[s] and only accessible + * through them. + */ +template <class X, class ACE_LOCK> +class ACE_Refcounted_Auto_Ptr_Rep +{ +private: + friend class ACE_Refcounted_Auto_Ptr<X, ACE_LOCK>; + + /// Sets the pointer value to 0 and returns its old value. + X *release (void); + + /// Invokes delete on the previous pointer value and then + /// sets the pointer value to the specified value. + void reset (X *p = 0); + + /// Get the pointer value. + X *get (void); + + /// Declare the dynamic allocation hooks. + ACE_ALLOC_HOOK_DECLARE; + + // = Encapsulate reference count and object lifetime of instances. + // These methods must go after the others to work around a bug with + // Borland's C++ Builder... + + /// Create a ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK> and initialize + /// the reference count. + static ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK> *create (X *p); + + /// Increase the reference count and return argument. Uses the + /// attribute "ace_lock_" to synchronize reference count updating. + /// + /// Precondition (rep != 0). + static ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK> *attach (ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK> *&rep); + + /// Decreases the reference count and and deletes rep if there are no + /// more references to rep. + /// + /// Precondition (rep != 0) + static void detach (ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK> *&rep); + + /// Decreases the rep's reference count and and deletes rep if there + /// are no more references to rep. Then assigns new_rep to rep. + /// + /// Precondition (rep != 0 && new_rep != 0) + static void assign (ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK> *&rep, + ACE_Refcounted_Auto_Ptr_Rep<X, ACE_LOCK> *new_rep); + + /// Pointer to the result. + ACE_Auto_Basic_Ptr<X> ptr_; + + /// Reference count. + int ref_count_; + + // = Mutex variable to protect the <ptr_>. + + /// Synchronization variable for the MT_SAFE <ACE_Hash_Map_Manager_Ex>. + ACE_LOCK lock_; + +private: + // = Constructor and destructor private. + ACE_Refcounted_Auto_Ptr_Rep (X *p = 0); + ~ACE_Refcounted_Auto_Ptr_Rep (void); +}; + +#include "ace/Refcounted_Auto_Ptr.i" + +#include "ace/post.h" +#endif /* ACE_AUTO_PTR_H */ |