共享对象的实现
来源:互联网 发布:unity3d 导入fbx 编辑:程序博客网 时间:2024/05/18 05:18
之前项目中遇到一个问题,项目用到了boost库中的sharearray(记不清是不是叫这个名字),但是苦于总是编译出错,于是乎就自己写了一个。写完发现这种思想挺好的,就花了点时间完善了一下。
直接上代码:
template<class T> class ShareObject{typedef void (*Deleter)(T*);public:inline ShareObject():m_handle(0),m_ptr(0)//,iDeleter(0){}{}ShareObject(T* ptr):m_handle(0),m_ptr(ptr)//,iDeleter(0){ typedef char type_must_be_complete[sizeof(T)?1:-1];(void) sizeof(type_must_be_complete);if (ptr){m_handle = new int(1);*m_handle = 1; }}ShareObject(T* ptr, Deleter aDeleter):m_handle(0),m_ptr(ptr)//, iDeleter(aDeleter) { if (ptr) { m_handle = new int(1); *m_handle = 1; } }ShareObject(const ShareObject& s):m_handle(s.m_handle), m_ptr(s.m_ptr)//, iDeleter(s.iDeleter){if (m_handle)(*m_handle)++;}ShareObject& operator=(const ShareObject& s){ if (s.m_handle == this->m_handle) return (*this); if (s.m_handle)(*s.m_handle)++;//s.m_handle->Ref();if (m_handle){//int r = m_handle->Deref();if (--(*m_handle) <= 0){delete m_handle;//if (iDeleter == 0)delete m_ptr;//else//iDeleter(m_ptr);}}m_handle = s.m_handle;m_ptr = s.m_ptr;//iDeleter = s.iDeleter;return *this;}ShareObject& operator=(T* ptr){if (m_handle){//int r = m_handle->Deref();if (--(*m_handle) <= 0){delete m_handle;m_handle = 0;//if (iDeleter == 0)delete m_ptr;//else//iDeleter(m_ptr);m_ptr = 0;}}//iDeleter = 0;m_ptr = ptr;if (m_ptr){ m_handle = new int(1); *m_handle = 1;}elsem_handle = 0;return *this;}~ShareObject(){if (m_handle){//int r = m_handle->Deref();if (--(*m_handle) <= 0){delete m_handle;m_handle = 0;//if (iDeleter == 0)delete m_ptr;//else//iDeleter(m_ptr);m_ptr = 0;}}}#if 0T* Peel(){delete m_handle;m_handle = 0;T* p = m_ptr;m_ptr = 0;return p;}#endifinline T* Ptr() const{return m_ptr;}inline T* get() const{return m_ptr;}inline T* operator()() const{return m_ptr;}inline bool operator!() const{return (m_ptr == 0 ? true : false);}inline T* operator->() const{return m_ptr;}inline T& Object() const{return (T&)(*m_ptr);}public:int* m_handle;T* m_ptr;//Deleter iDeleter;};/*** * */template<class T> class ShareArray{typedef void (*Deleter)(T*);public://inline ShareArray():m_handle(0),m_ptr(0),iDeleter(0){}ShareArray(T* ptr):m_handle(0),m_ptr(ptr),iDeleter(0){typedef char type_must_be_complete[sizeof(T)?1:-1];(void) sizeof(type_must_be_complete);if (ptr)m_handle = new int(1);}ShareArray(T* ptr, Deleter aDeleter):m_handle(0),m_ptr(ptr), iDeleter(aDeleter){if (ptr)m_handle = new int(1);}ShareArray(const ShareArray& s):m_handle(s.m_handle), m_ptr(s.m_ptr), iDeleter(s.iDeleter){if (m_handle)(*m_handle)++;//m_handle->Ref();}ShareArray& operator=(const ShareArray& s){ if (s.m_handle == this->m_handle) return (*this); if (s.m_handle)(*s.m_handle)++;//s.m_handle->Ref();if (m_handle){//int r = m_handle->Deref();if (--(*m_handle) <= 0){delete m_handle;if (iDeleter == 0)delete [] m_ptr;elseiDeleter(m_ptr);}}m_handle = s.m_handle;m_ptr = s.m_ptr;iDeleter = s.iDeleter;return *this;}ShareArray& operator=(T* ptr){if (m_handle){//int r = m_handle->Deref();if (--(*m_handle) <= 0){delete m_handle;m_handle = 0;if (iDeleter == 0)delete [] m_ptr;elseiDeleter(m_ptr);m_ptr = 0;}}iDeleter = 0;m_ptr = ptr;if (m_ptr) m_handle = new int (1);elsem_handle = 0;return *this;}~ShareArray(){if (m_handle){//int r = m_handle->Deref();if (--(*m_handle) <= 0){delete m_handle;m_handle = 0;if (iDeleter == 0)delete [] m_ptr;elseiDeleter(m_ptr);m_ptr = 0;}}}T* Peel(){delete m_handle;m_handle = 0;T* p = m_ptr;m_ptr = 0;return p;}inline T* Ptr() const{return m_ptr;}inline T* get() const{return m_ptr;}inline T* operator()() const{return m_ptr;}inline bool operator!() const{return (m_ptr == 0 ? true : false);}inline T* operator->() const{return m_ptr;}public:int* m_handle;T* m_ptr;Deleter iDeleter;};
- 共享对象的实现
- windows下内核对象的跨边界共享实现一
- JS-实现继承及避免原型链的对象共享
- C++类对象共享数据的两种实现方法
- C++类对象共享数据的5种实现方法
- 对象的共享
- 3 对象的共享
- 3对象的共享
- 对象的共享
- 3对象的共享
- 3. 对象的共享
- 对象的共享
- 对象的共享
- 第二章 对象的共享
- 并发之对象的共享
- 【Java 并发】对象的共享
- 【Java 并发】对象的共享
- 桌面共享的实现
- Linux下视频采集及其显示
- ACE主动对象模式
- Descriptions of Wait Events
- 这则表达式30分钟入门教程
- STL容器删除元素的陷阱
- 共享对象的实现
- oracle 执行计划(explain plan)说明
- 设置Activity的透明度及大小
- 让PHP开发者事半功倍的十个技巧
- Java程序员从笨鸟到菜鸟之(二十七)XML之Jdom和DOM4J解析 .
- Android kernel和标准Linux Kernel的差异
- HDU2874 Connections between cities LCA+DFS或并查集
- Linux常用命令全集(连接)
- 触发器