summaryrefslogtreecommitdiff
path: root/ACE/ace/Intrusive_Auto_Ptr.h
diff options
context:
space:
mode:
Diffstat (limited to 'ACE/ace/Intrusive_Auto_Ptr.h')
-rw-r--r--ACE/ace/Intrusive_Auto_Ptr.h165
1 files changed, 165 insertions, 0 deletions
diff --git a/ACE/ace/Intrusive_Auto_Ptr.h b/ACE/ace/Intrusive_Auto_Ptr.h
new file mode 100644
index 00000000000..215553524c5
--- /dev/null
+++ b/ACE/ace/Intrusive_Auto_Ptr.h
@@ -0,0 +1,165 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Intrusive_Auto_Ptr.h
+ *
+ * $Id$
+ *
+ * @author Iliyan Jeliazkov <iliyan@ociweb.com>
+ *
+ * @note Modeled on http://www.boost.org/boost/intrusive_ptr.hpp
+ */
+//=============================================================================
+
+#ifndef ACE_INTRUSIVE_AUTO_PTR_H
+#define ACE_INTRUSIVE_AUTO_PTR_H
+
+#include /**/ "ace/pre.h"
+
+#include "ace/Auto_Ptr.h"
+#include "ace/Atomic_Op.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+ACE_BEGIN_VERSIONED_NAMESPACE_DECL
+
+// Forward decl.
+template <class X> class ACE_Intrusive_Auto_Ptr;
+
+/**
+ * @class ACE_Intrusive_Auto_Ptr
+ *
+ * @brief This class implements support for a reference counted
+ * auto_ptr. It assumes reference counting abilities of the
+ * parameterizing class.
+ *
+ * Assigning or copying instances of an ACE_Intrusive_Auto_Ptr will
+ * automatically increment the reference count. When the last instance
+ * that references a ACE_Intrusive_Auto_Ptr instance is destroyed or
+ * overwritten, it will invoke delete on its underlying pointer.
+ *
+ * The ACE_Intrusive_Auto_Ptr works by maintaining a reference to a
+ * separate representation object, ACE_Intrusive_Auto_Ptr_Rep. That
+ * separate representation object contains the reference count and the
+ * actual pointer value.
+ */
+template <class X>
+class ACE_Intrusive_Auto_Ptr
+{
+protected:
+
+ /// Used to define a proper boolean conversion for "if (sp) ..."
+ static void unspecified_bool(ACE_Intrusive_Auto_Ptr<X>***){};
+ typedef void (*unspecified_bool_type)(ACE_Intrusive_Auto_Ptr<X>***);
+
+public:
+
+ /// Enables "if (sp) ..."
+ operator unspecified_bool_type() const
+ {
+ return rep_ == 0 ? 0: unspecified_bool;
+ }
+
+
+ // = Initialization and termination methods.
+
+ /// Constructor that initializes an ACE_Intrusive_Auto_Ptr to
+ /// the specified pointer value.
+ ACE_Intrusive_Auto_Ptr (X *p = 0, bool addref = true);
+
+ /// Copy constructor binds the new ACE_Intrusive_Auto_Ptr to the
+ /// representation object referenced by @a r.
+ /// An ACE_Intrusive_Auto_Ptr_Rep is created if necessary.
+ ACE_Intrusive_Auto_Ptr (const ACE_Intrusive_Auto_Ptr<X> &r);
+
+ // Derived class copy ctor
+ template<class U> ACE_Intrusive_Auto_Ptr(const ACE_Intrusive_Auto_Ptr<U> & rhs);
+
+ /// Destructor. Releases the reference to the underlying representation.
+ /// If the release of that reference causes its reference count to reach 0,
+ /// the representation object will also be destroyed.
+ virtual ~ACE_Intrusive_Auto_Ptr (void);
+
+ /// Assignment operator that binds the current object and @a r to the same
+ /// ACE_Intrusive_Auto_Ptr_Rep. An ACE_Intrusive_Auto_Ptr_Rep
+ /// is created if necessary.
+ void operator = (const ACE_Intrusive_Auto_Ptr<X> &r);
+
+ /// Redirection operator
+ X *operator-> (void) const;
+
+ /// Accessor method.
+ X &operator *() const;
+
+ /// Releases the reference to the underlying representation object.
+ /// @retval The pointer value prior to releasing it.
+ X *release (void);
+
+ /// Releases the current pointer value and then sets a new
+ /// pointer value specified by @a p.
+ void reset (X *p = 0);
+
+ /// Get the pointer value.
+ X *get (void) const;
+
+ /// Get the reference count value.
+ long count (void) const;
+
+ /// Returns @c true if this object does not contain a valid pointer.
+ // bool null (void) const;
+
+ /// Declare the dynamic allocation hooks.
+ ACE_ALLOC_HOOK_DECLARE;
+
+protected:
+
+ /// Protect operations on the ACE_Intrusive_Auto_Ptr.
+ X *rep_;
+};
+
+ /// Equality operator that returns @c true if both
+ /// ACE_Intrusive_Auto_Ptr objects point to the same underlying
+ /// representation. It does not compare the actual pointers.
+ /**
+ * @note It also returns @c true if both objects have just been
+ * instantiated and not used yet.
+ */
+template<class T, class U>
+bool operator==(ACE_Intrusive_Auto_Ptr<T> const & a, ACE_Intrusive_Auto_Ptr<U> const & b);
+
+/// Inequality operator, which is the opposite of equality.
+template<class T, class U>
+bool operator!=(ACE_Intrusive_Auto_Ptr<T> const & a, ACE_Intrusive_Auto_Ptr<U> const & b);
+
+template<class T, class U>
+bool operator==(ACE_Intrusive_Auto_Ptr<T> const & a, U * b);
+
+template<class T, class U>
+bool operator!=(ACE_Intrusive_Auto_Ptr<T> & a, U * b);
+
+template<class T, class U>
+bool operator==(T * a, ACE_Intrusive_Auto_Ptr<U> const & b);
+
+template<class T, class U>
+bool operator!=(T * a, ACE_Intrusive_Auto_Ptr<U> const & b);
+
+ACE_END_VERSIONED_NAMESPACE_DECL
+
+#if defined (__ACE_INLINE__)
+#include "ace/Intrusive_Auto_Ptr.inl"
+#endif /* __ACE_INLINE __ */
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "ace/Intrusive_Auto_Ptr.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Intrusive_Auto_Ptr.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include /**/ "ace/post.h"
+
+#endif /* ACE_INTRUSIVE_AUTO_PTR_H */