#include <cassert>
#include <iostream>
using namespace std;
template <typename T>
class scoped_ptr {
public:
scoped_ptr() = delete;
explicit scoped_ptr(T *ptr) : _ptr(ptr) {}
virtual ~scoped_ptr() { reset(); }
scoped_ptr(const scoped_ptr &p) = delete;
scoped_ptr &operator=(const scoped_ptr &p) = delete;
T* operator->() const { return _ptr; }
T& operator*() const { return *_ptr; }
T* get() const { return _ptr; }
void reset(T* p = nullptr) {
if (_ptr == p) {
return;
}
delete _ptr;
_ptr = p;
}
private:
T* _ptr;
};
struct ObjectCounter {
static int _object_count;
ObjectCounter() {
++_object_count;
}
virtual ~ObjectCounter() {
--_object_count;
}
};
int ObjectCounter::_object_count = 0;
int main() {
{
scoped_ptr<ObjectCounter> ptr(new ObjectCounter());
assert(ObjectCounter::_object_count == 1);
}
assert(ObjectCounter::_object_count == 0);
return 0;
}
I2luY2x1ZGUgPGNhc3NlcnQ+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3Mgc2NvcGVkX3B0ciB7CiBwdWJsaWM6CiAgc2NvcGVkX3B0cigpID0gZGVsZXRlOwogIGV4cGxpY2l0IHNjb3BlZF9wdHIoVCAqcHRyKSA6IF9wdHIocHRyKSB7fQogIHZpcnR1YWwgfnNjb3BlZF9wdHIoKSB7IHJlc2V0KCk7IH0KCiAgc2NvcGVkX3B0cihjb25zdCBzY29wZWRfcHRyICZwKSA9IGRlbGV0ZTsKICBzY29wZWRfcHRyICZvcGVyYXRvcj0oY29uc3Qgc2NvcGVkX3B0ciAmcCkgPSBkZWxldGU7CgogIFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBfcHRyOyB9CiAgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKl9wdHI7IH0KICBUKiBnZXQoKSBjb25zdCB7IHJldHVybiBfcHRyOyB9CiAgdm9pZCByZXNldChUKiBwID0gbnVsbHB0cikgewogIAlpZiAoX3B0ciA9PSBwKSB7CiAgCSAgcmV0dXJuOwogIAl9CiAgICBkZWxldGUgX3B0cjsKICAgIF9wdHIgPSBwOwogIH0KCiBwcml2YXRlOgogIFQqIF9wdHI7Cn07CgpzdHJ1Y3QgT2JqZWN0Q291bnRlciB7CiAgc3RhdGljIGludCBfb2JqZWN0X2NvdW50OwogIE9iamVjdENvdW50ZXIoKSB7CiAgCSsrX29iamVjdF9jb3VudDsKICB9CiAgdmlydHVhbCB+T2JqZWN0Q291bnRlcigpIHsKICAJLS1fb2JqZWN0X2NvdW50OwogIH0KfTsKCmludCBPYmplY3RDb3VudGVyOjpfb2JqZWN0X2NvdW50ID0gMDsKCmludCBtYWluKCkgewogIHsKICAgIHNjb3BlZF9wdHI8T2JqZWN0Q291bnRlcj4gcHRyKG5ldyBPYmplY3RDb3VudGVyKCkpOwogICAgYXNzZXJ0KE9iamVjdENvdW50ZXI6Ol9vYmplY3RfY291bnQgPT0gMSk7CiAgfQogIGFzc2VydChPYmplY3RDb3VudGVyOjpfb2JqZWN0X2NvdW50ID09IDApOwogIHJldHVybiAwOwp9