diff DEPENDENCIES/generic/include/boost/locale/hold_ptr.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DEPENDENCIES/generic/include/boost/locale/hold_ptr.hpp	Tue Aug 05 11:11:38 2014 +0100
@@ -0,0 +1,93 @@
+//
+//  Copyright (c) 2010 Artyom Beilis (Tonkikh)
+//
+//  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)
+//
+#ifndef BOOST_LOCALE_HOLD_PTR_H
+#define BOOST_LOCALE_HOLD_PTR_H
+
+namespace boost { 
+namespace locale {
+    ///
+    /// \brief a smart pointer similar to std::auto_ptr but it is non-copyable and the
+    /// underlying object has the same constness as the pointer itself (unlike an ordinary pointer).
+    ///
+    template<typename T>
+    class hold_ptr {
+        hold_ptr(hold_ptr const &other); // non copyable 
+        hold_ptr const &operator=(hold_ptr const &other); // non assignable
+    public:
+        ///
+        /// Create new empty pointer
+        ///
+        hold_ptr() : ptr_(0) {}
+        ///
+        /// Create a pointer that holds \a v, ownership is transferred to smart pointer
+        ///
+        explicit hold_ptr(T *v) : ptr_(v) {}
+
+        ///
+        /// Destroy smart pointer and the object it owns.
+        ///
+        ~hold_ptr() 
+        {
+            delete ptr_;
+        }
+
+        ///
+        /// Get a const pointer to the object
+        ///
+        T const *get() const { return ptr_; }
+        ///
+        /// Get a mutable pointer to the object 
+        ///
+        T *get() { return ptr_; }
+
+        /// 
+        /// Get a const reference to the object
+        ///
+        T const &operator *() const { return *ptr_; }
+        /// 
+        /// Get a mutable reference to the object
+        ///
+        T &operator *() { return *ptr_; }
+        ///
+        /// Get a const pointer to the object
+        ///
+        T const *operator->() const { return ptr_; }
+        ///
+        /// Get a mutable pointer to the object 
+        ///
+        T *operator->() { return ptr_; }
+
+        ///
+        /// Transfer an ownership on the pointer to user
+        ///
+        T *release() { T *tmp=ptr_; ptr_=0; return tmp; }
+
+        ///
+        /// Set new value to pointer, previous object is destroyed, ownership on new object is transferred
+        ///
+        void reset(T *p=0)
+        {
+            if(ptr_) delete ptr_;
+            ptr_=p;
+        }
+        /// Swap two pointers
+        void swap(hold_ptr &other)
+        {
+            T *tmp=other.ptr_;
+            other.ptr_=ptr_;
+            ptr_=tmp;
+        }
+    private:
+        T *ptr_;
+    };
+
+} // locale
+} // boost
+
+#endif
+// vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4