OSDN Git Service

memory/handle.hpp Add (copy from shared_object) master
authormyun2 <myun2@nwhite.info>
Tue, 18 Sep 2012 15:41:40 +0000 (00:41 +0900)
committermyun2 <myun2@nwhite.info>
Fri, 21 Sep 2012 14:11:36 +0000 (23:11 +0900)
roast/include/roast/memory/handle.hpp [new file with mode: 0644]

diff --git a/roast/include/roast/memory/handle.hpp b/roast/include/roast/memory/handle.hpp
new file mode 100644 (file)
index 0000000..45c82bd
--- /dev/null
@@ -0,0 +1,76 @@
+//     Roast+ License
+
+/*
+*/
+#ifndef __SFJP_ROAST__memory__handle_HPP__
+#define __SFJP_ROAST__memory__handle_HPP__
+
+#include "roast/algorithm/ref_count.hpp"
+
+namespace roast
+{
+       ////////////////////////////////////////////////
+       
+       // _ReleaseImpl is requires:
+       //
+       //      Methods:
+       //              void release(T* ptr);
+
+       ///////////////////////////////////////////////////////////////
+       
+       template <typename T, typename _ReleaseImpl>
+       class handle
+       {
+       private:
+               /////////////////////////////////////
+               //      Holder
+               struct holder : public ref_count
+               {
+                       T m_obj;
+                       
+                       holder(){}
+                       holder(const T& obj) : m_obj(obj){}
+                       void on_last()
+                       {
+                               _ReleaseImpl::release(m_obj);
+                               delete this;
+                       }
+               };
+               /////////////////////////////////////
+               
+               holder *m_pholder;
+       public:
+               handle() : m_pholder(new holder()){ m_pholder->up(); }
+               handle(const T& obj) : m_pholder(new holder(obj)){ m_pholder->up(); }
+               handle(const handle& from) : m_pholder(from.m_pholder){ m_pholder->up(); }
+               virtual ~handle(){ m_pholder->down(); }
+
+               /////////////////////////////////////////////////////
+               
+               T get(){ return m_pholder->m_obj; }
+               const T get() const { return m_pholder->m_obj; }
+               
+               operator T (){ return get(); }
+               operator const T () const { return get(); }
+               
+               void set(const T& obj){ m_pholder->m_obj = obj; }
+               T& operator = (const T& obj){ m_pholder->m_obj = obj; return obj; }
+               
+               //      Copy from Other handle. Current Object was release...
+               handle& operator = (const handle& from)
+               {
+                       //      Current Object was release...
+                       m_pholder->down();
+
+                       //      New Object copied and Count-Up!
+                       m_pholder = from.m_pholder;
+                       m_pholder->up();
+
+                       return *this;
+               }
+       };
+       
+       //////////////////////////////////////////////////////////////
+}
+
+#endif//__SFJP_ROAST__memory__handle_HPP__