#include <iostream>
#define STRING(str) #str
class Object
{
int __refs;
public:
Object() : __refs(1)
{
}
virtual ~Object(){}
int AddRef()
{
return this->__refs++;
}
void Release()
{
if( --this->__refs <= 0)
delete this;
}
};
class Resource
: public Object
{
public:
Resource() : Object()
{
std::cout<<STRING(Resource::Resource())<<std::endl;
}
~Resource()
{
std::cout<<STRING(Resource::~Resource())<<std::endl;
}
};
class Factory
{
public:
static Resource* CreateResource()
{
return new Resource();
}
};
void gimeSomeResource(Resource* res)
{
res->AddRef();
//... work with it
res->Release();
}
void moreResourceForWork(Resource* res)
{
res->AddRef();
gimeSomeResource(res);
gimeSomeResource(res);
res->Release();
}
int main()
{
Resource* someRes = Factory::CreateResource();
gimeSomeResource(someRes);
moreResourceForWork(someRes);
someRes->Release();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKI2RlZmluZSBTVFJJTkcoc3RyKSAjc3RyCgpjbGFzcyBPYmplY3QKewoJaW50IF9fcmVmczsKcHVibGljOgoJT2JqZWN0KCkgOiBfX3JlZnMoMSkKCXsKCX0KCXZpcnR1YWwgfk9iamVjdCgpe30KCWludCBBZGRSZWYoKQoJewoJCXJldHVybiB0aGlzLT5fX3JlZnMrKzsKCX0KCXZvaWQgUmVsZWFzZSgpCgl7CgkJaWYoIC0tdGhpcy0+X19yZWZzIDw9IDApCgkJCWRlbGV0ZSB0aGlzOwoJfQp9OwoKCmNsYXNzIFJlc291cmNlCgk6IHB1YmxpYyBPYmplY3QKewpwdWJsaWM6CglSZXNvdXJjZSgpIDogT2JqZWN0KCkKCXsKCQlzdGQ6OmNvdXQ8PFNUUklORyhSZXNvdXJjZTo6UmVzb3VyY2UoKSk8PHN0ZDo6ZW5kbDsKCX0KCX5SZXNvdXJjZSgpCgl7CgkJc3RkOjpjb3V0PDxTVFJJTkcoUmVzb3VyY2U6On5SZXNvdXJjZSgpKTw8c3RkOjplbmRsOwoJfQp9OwoKCmNsYXNzIEZhY3RvcnkKewpwdWJsaWM6CglzdGF0aWMgUmVzb3VyY2UqIENyZWF0ZVJlc291cmNlKCkKCXsKCQlyZXR1cm4gbmV3IFJlc291cmNlKCk7Cgl9Cn07Cgp2b2lkIGdpbWVTb21lUmVzb3VyY2UoUmVzb3VyY2UqIHJlcykKewoJcmVzLT5BZGRSZWYoKTsKCS8vLi4uIHdvcmsgd2l0aCBpdAoJcmVzLT5SZWxlYXNlKCk7Cn0Kdm9pZCBtb3JlUmVzb3VyY2VGb3JXb3JrKFJlc291cmNlKiByZXMpCnsKCXJlcy0+QWRkUmVmKCk7CglnaW1lU29tZVJlc291cmNlKHJlcyk7CglnaW1lU29tZVJlc291cmNlKHJlcyk7CglyZXMtPlJlbGVhc2UoKTsKfQoKCmludCBtYWluKCkKewoKCVJlc291cmNlKiBzb21lUmVzID0gRmFjdG9yeTo6Q3JlYXRlUmVzb3VyY2UoKTsKCWdpbWVTb21lUmVzb3VyY2Uoc29tZVJlcyk7Cgltb3JlUmVzb3VyY2VGb3JXb3JrKHNvbWVSZXMpOwoKCXNvbWVSZXMtPlJlbGVhc2UoKTsKCglyZXR1cm4gMDsKfQo=