]> git.lyx.org Git - features.git/blobdiff - boost/boost/smart_ptr/detail/shared_array_nmt.hpp
boost: add eol property
[features.git] / boost / boost / smart_ptr / detail / shared_array_nmt.hpp
index d811a0562a9da768b5695b52f30c334b029286e9..450c9bcf595a6c818a34d934624f8be99cef95a1 100644 (file)
-#ifndef BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED\r
-#define BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED\r
-\r
-//\r
-//  detail/shared_array_nmt.hpp - shared_array.hpp without member templates\r
-//\r
-//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.\r
-//  Copyright (c) 2001, 2002 Peter Dimov\r
-//\r
-//  Distributed under the Boost Software License, Version 1.0. (See\r
-//  accompanying file LICENSE_1_0.txt or copy at\r
-//  http://www.boost.org/LICENSE_1_0.txt)\r
-//\r
-//  See http://www.boost.org/libs/smart_ptr/shared_array.htm for documentation.\r
-//\r
-\r
-#include <boost/assert.hpp>\r
-#include <boost/checked_delete.hpp>\r
-#include <boost/throw_exception.hpp>\r
-#include <boost/smart_ptr/detail/atomic_count.hpp>\r
-\r
-#include <cstddef>          // for std::ptrdiff_t\r
-#include <algorithm>        // for std::swap\r
-#include <functional>       // for std::less\r
-#include <new>              // for std::bad_alloc\r
-\r
-namespace boost\r
-{\r
-\r
-template<class T> class shared_array\r
-{\r
-private:\r
-\r
-    typedef detail::atomic_count count_type;\r
-\r
-public:\r
-\r
-    typedef T element_type;\r
-      \r
-    explicit shared_array(T * p = 0): px(p)\r
-    {\r
-#ifndef BOOST_NO_EXCEPTIONS\r
-\r
-        try  // prevent leak if new throws\r
-        {\r
-            pn = new count_type(1);\r
-        }\r
-        catch(...)\r
-        {\r
-            boost::checked_array_delete(p);\r
-            throw;\r
-        }\r
-\r
-#else\r
-\r
-        pn = new count_type(1);\r
-\r
-        if(pn == 0)\r
-        {\r
-            boost::checked_array_delete(p);\r
-            boost::throw_exception(std::bad_alloc());\r
-        }\r
-\r
-#endif\r
-    }\r
-\r
-    ~shared_array()\r
-    {\r
-        if(--*pn == 0)\r
-        {\r
-            boost::checked_array_delete(px);\r
-            delete pn;\r
-        }\r
-    }\r
-\r
-    shared_array(shared_array const & r) : px(r.px)  // never throws\r
-    {\r
-        pn = r.pn;\r
-        ++*pn;\r
-    }\r
-\r
-    shared_array & operator=(shared_array const & r)\r
-    {\r
-        shared_array(r).swap(*this);\r
-        return *this;\r
-    }\r
-\r
-    void reset(T * p = 0)\r
-    {\r
-        BOOST_ASSERT(p == 0 || p != px);\r
-        shared_array(p).swap(*this);\r
-    }\r
-\r
-    T * get() const  // never throws\r
-    {\r
-        return px;\r
-    }\r
-\r
-    T & operator[](std::ptrdiff_t i) const  // never throws\r
-    {\r
-        BOOST_ASSERT(px != 0);\r
-        BOOST_ASSERT(i >= 0);\r
-        return px[i];\r
-    }\r
-\r
-    long use_count() const  // never throws\r
-    {\r
-        return *pn;\r
-    }\r
-\r
-    bool unique() const  // never throws\r
-    {\r
-        return *pn == 1;\r
-    }\r
-\r
-    void swap(shared_array<T> & other)  // never throws\r
-    {\r
-        std::swap(px, other.px);\r
-        std::swap(pn, other.pn);\r
-    }\r
-\r
-private:\r
-\r
-    T * px;            // contained pointer\r
-    count_type * pn;   // ptr to reference counter\r
-      \r
-};  // shared_array\r
-\r
-template<class T, class U> inline bool operator==(shared_array<T> const & a, shared_array<U> const & b)\r
-{\r
-    return a.get() == b.get();\r
-}\r
-\r
-template<class T, class U> inline bool operator!=(shared_array<T> const & a, shared_array<U> const & b)\r
-{\r
-    return a.get() != b.get();\r
-}\r
-\r
-template<class T> inline bool operator<(shared_array<T> const & a, shared_array<T> const & b)\r
-{\r
-    return std::less<T*>()(a.get(), b.get());\r
-}\r
-\r
-template<class T> void swap(shared_array<T> & a, shared_array<T> & b)\r
-{\r
-    a.swap(b);\r
-}\r
-\r
-} // namespace boost\r
-\r
-#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED\r
+#ifndef BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED
+#define BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED
+
+//
+//  detail/shared_array_nmt.hpp - shared_array.hpp without member templates
+//
+//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
+//  Copyright (c) 2001, 2002 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  See http://www.boost.org/libs/smart_ptr/shared_array.htm for documentation.
+//
+
+#include <boost/assert.hpp>
+#include <boost/checked_delete.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/smart_ptr/detail/atomic_count.hpp>
+
+#include <cstddef>          // for std::ptrdiff_t
+#include <algorithm>        // for std::swap
+#include <functional>       // for std::less
+#include <new>              // for std::bad_alloc
+
+namespace boost
+{
+
+template<class T> class shared_array
+{
+private:
+
+    typedef detail::atomic_count count_type;
+
+public:
+
+    typedef T element_type;
+      
+    explicit shared_array(T * p = 0): px(p)
+    {
+#ifndef BOOST_NO_EXCEPTIONS
+
+        try  // prevent leak if new throws
+        {
+            pn = new count_type(1);
+        }
+        catch(...)
+        {
+            boost::checked_array_delete(p);
+            throw;
+        }
+
+#else
+
+        pn = new count_type(1);
+
+        if(pn == 0)
+        {
+            boost::checked_array_delete(p);
+            boost::throw_exception(std::bad_alloc());
+        }
+
+#endif
+    }
+
+    ~shared_array()
+    {
+        if(--*pn == 0)
+        {
+            boost::checked_array_delete(px);
+            delete pn;
+        }
+    }
+
+    shared_array(shared_array const & r) : px(r.px)  // never throws
+    {
+        pn = r.pn;
+        ++*pn;
+    }
+
+    shared_array & operator=(shared_array const & r)
+    {
+        shared_array(r).swap(*this);
+        return *this;
+    }
+
+    void reset(T * p = 0)
+    {
+        BOOST_ASSERT(p == 0 || p != px);
+        shared_array(p).swap(*this);
+    }
+
+    T * get() const  // never throws
+    {
+        return px;
+    }
+
+    T & operator[](std::ptrdiff_t i) const  // never throws
+    {
+        BOOST_ASSERT(px != 0);
+        BOOST_ASSERT(i >= 0);
+        return px[i];
+    }
+
+    long use_count() const  // never throws
+    {
+        return *pn;
+    }
+
+    bool unique() const  // never throws
+    {
+        return *pn == 1;
+    }
+
+    void swap(shared_array<T> & other)  // never throws
+    {
+        std::swap(px, other.px);
+        std::swap(pn, other.pn);
+    }
+
+private:
+
+    T * px;            // contained pointer
+    count_type * pn;   // ptr to reference counter
+      
+};  // shared_array
+
+template<class T, class U> inline bool operator==(shared_array<T> const & a, shared_array<U> const & b)
+{
+    return a.get() == b.get();
+}
+
+template<class T, class U> inline bool operator!=(shared_array<T> const & a, shared_array<U> const & b)
+{
+    return a.get() != b.get();
+}
+
+template<class T> inline bool operator<(shared_array<T> const & a, shared_array<T> const & b)
+{
+    return std::less<T*>()(a.get(), b.get());
+}
+
+template<class T> void swap(shared_array<T> & a, shared_array<T> & b)
+{
+    a.swap(b);
+}
+
+} // namespace boost
+
+#endif  // #ifndef BOOST_SMART_PTR_DETAIL_SHARED_ARRAY_NMT_HPP_INCLUDED