123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- #ifndef ICPTRHOLDER_CXX_H
- #define ICPTRHOLDER_CXX_H
- #include <cassert>
- template < class T > class ICPointerHolder {
- public:
- ICPointerHolder()
- : ptr(0)
- {
- }
- ICPointerHolder(T *p)
- : ptr(p)
- {
- }
-
- ICPointerHolder(const ICPointerHolder &ip)
- : ptr(ip.ptr)
- {
-
-
-
- ICPointerHolder *ipp = const_cast < ICPointerHolder * >(&ip);
- ipp->ptr = 0;
- };
- ~ICPointerHolder()
- {
- release();
- }
- ICPointerHolder & operator=(T *p)
- {
- this->release();
- ptr = p;
- return *this;
- }
- ICPointerHolder &operator=(ICPointerHolder &p)
- {
- this->release();
- ptr = p.ptr;
- p.ptr = 0;
- return *this;
- }
- int operator!=(T *p)
- {
- return (ptr != p);
- }
- int operator==(T *p)
- {
- return (ptr == p);
- }
- operator T *() const
- {
- return ptr;
- }
- T *operator->() const
- {
- assert(ptr);
- return ptr;
- }
- T &operator*()
- {
- assert(ptr);
- return *ptr;
- }
- private:
- void release()
- {
- if (ptr != 0) {
- ptr->detach();
- delete ptr;
- ptr = 0;
- }
- }
- T *ptr;
- };
- #endif
|