template myHandle::myHandle(const T& in) { data = new myBody(in); data->addRef(); } template myHandle::myHandle(const myHandle& in) { data = in.data; data->addRef(); } template myHandle::~myHandle() { if(data->getNumRef() > 1) data->removeRef(); else delete data; } template T& myHandle::operator*() { if(data->getNumRef() > 1) { data->removeRef(); data = new myBody(data->getData()); data->addRef(); } if(data->getNumRef() > 0) return data->getData(); } template T* myHandle::operator->() { if(data->getNumRef() > 1) { data->removeRef(); data = new myBody(data->getData()); data->addRef(); } if(data->getNumRef() > 0) return &data->getData(); else return 0; } template const T& myHandle::operator*() const { if(data->getNumRef() > 0) return data->getData(); } template const T* myHandle::operator->() const { if(data->getNumRef() > 0) return &data->getData(); else return 0; } template myHandle& myHandle::operator=(const T& rh) { if(data->getNumRef() > 1) { data->removeRef(); data = new myBody(rh); } else data->setData(rh); return *this; } template bool myHandle::operator==(const myHandle& rh) { if(data->getNumRef() > 0) return (data->getData() == *rh); else return false; } template bool myHandle::operator!=(const myHandle& rh) { if(data->getNumRef() > 0) return (data->getData() != *rh); else return true; }