#include <iostream>
#include <memory>
#include <vector>
#include <list>
#include <map>
#include <string>
using namespace std;
template<class T, class D>
auto make_unique_ptr(T* p, D d) { return unique_ptr<T,D>(p,d); }
struct X {
X(string s) : s(s) { cout << (void*)this << " -> ctor: " << s << endl; }
~X() { cout << (void*)this << " -> dtor: " << s << endl; }
string s;
};
int main() {
vector<X*> v;
list<X*> l;
map<X*,X*> m;
auto vcleaner = make_unique_ptr(&v,
[](auto pvs) {
for(auto v : *pvs) delete v;
}
);
auto lcleaner = make_unique_ptr(&l,
[](auto pvs) {
for(auto v : *pvs) delete v;
}
);
auto mcleaner = make_unique_ptr(&m,
[](auto pkvs) {
for(const auto& kv : *pkvs) {
delete kv.first;
delete kv.second;
}
}
);
cout << "---- fill the map ----" << endl;
m[new X("k1")] = new X("w1");
m[new X("k2")] = new X("w2");
cout << "---- fill the vector ----" << endl;
v.push_back(new X("v1"));
v.push_back(new X("v2"));
cout << "---- fill the list ----" << endl;
l.push_back(new X("l1"));
cout << "---- release the vector ----" << endl;
vcleaner.release();
cout << "---- goodbye! ----" << endl;
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPG1hcD4KI2luY2x1ZGUgPHN0cmluZz4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIEQ+CmF1dG8gbWFrZV91bmlxdWVfcHRyKFQqIHAsIEQgZCkgeyByZXR1cm4gdW5pcXVlX3B0cjxULEQ+KHAsZCk7IH0KCnN0cnVjdCBYIHsKCVgoc3RyaW5nIHMpIDogcyhzKSAgeyBjb3V0IDw8ICh2b2lkKil0aGlzIDw8ICIgLT4gY3RvcjogIiA8PCBzIDw8IGVuZGw7IH0KCX5YKCkgICAgICAgICAgICAgICAgeyBjb3V0IDw8ICh2b2lkKil0aGlzIDw8ICIgLT4gZHRvcjogIiA8PCBzIDw8IGVuZGw7IH0KCQoJc3RyaW5nIHM7Cn07CgppbnQgbWFpbigpIHsKCXZlY3RvcjxYKj4gdjsKCWxpc3Q8WCo+IGw7CgltYXA8WCosWCo+IG07CgkKCWF1dG8gdmNsZWFuZXIgPSBtYWtlX3VuaXF1ZV9wdHIoJnYsCgkJW10oYXV0byBwdnMpIHsKCQkJZm9yKGF1dG8gdiA6ICpwdnMpIGRlbGV0ZSB2OwoJCX0KCSk7CgoJYXV0byBsY2xlYW5lciA9IG1ha2VfdW5pcXVlX3B0cigmbCwKCQlbXShhdXRvIHB2cykgewoJCQlmb3IoYXV0byB2IDogKnB2cykgZGVsZXRlIHY7CgkJfQoJKTsKCQoJYXV0byBtY2xlYW5lciA9IG1ha2VfdW5pcXVlX3B0cigmbSwKCQlbXShhdXRvIHBrdnMpIHsKCQkJZm9yKGNvbnN0IGF1dG8mIGt2IDogKnBrdnMpIHsKCQkJCWRlbGV0ZSBrdi5maXJzdDsKCQkJCWRlbGV0ZSBrdi5zZWNvbmQ7CgkJCX0KCQl9CgkpOwoJCgljb3V0IDw8ICItLS0tIGZpbGwgdGhlIG1hcCAtLS0tIiA8PCBlbmRsOwoJbVtuZXcgWCgiazEiKV0gPSBuZXcgWCgidzEiKTsKCW1bbmV3IFgoImsyIildID0gbmV3IFgoIncyIik7Cgljb3V0IDw8ICItLS0tIGZpbGwgdGhlIHZlY3RvciAtLS0tIiA8PCBlbmRsOwoJdi5wdXNoX2JhY2sobmV3IFgoInYxIikpOwoJdi5wdXNoX2JhY2sobmV3IFgoInYyIikpOwoJY291dCA8PCAiLS0tLSBmaWxsIHRoZSBsaXN0IC0tLS0iIDw8IGVuZGw7CglsLnB1c2hfYmFjayhuZXcgWCgibDEiKSk7Cgljb3V0IDw8ICItLS0tIHJlbGVhc2UgdGhlIHZlY3RvciAtLS0tIiA8PCBlbmRsOwoJdmNsZWFuZXIucmVsZWFzZSgpOwoJY291dCA8PCAiLS0tLSBnb29kYnllISAtLS0tIiA8PCBlbmRsOwoJCgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCglyZXR1cm4gMDsKfQ==