#include <iostream>
#include <memory>
#include <functional>
using namespace std;
struct cleanup {
void operator( ) ( int * i) {
std:: cout << "Cleaning up resource: " << i << "(" << * i << ")"
<< std:: endl ;
// Do the work for releasing resource
delete i;
}
} ;
void use_temporary_resource( std:: shared_ptr < int > resource,
const int & proof, const int & multiple) {
int & i = * resource;
std:: cout << "Proof " << proof << ", using the resource: " << i << std:: endl ;
std:: cout << i << "*" << multiple << "=" << i* multiple << std:: endl ;
}
int main( ) {
std:: shared_ptr < int > tempResource1( new int ( 1 ) , cleanup( ) ) ;
std:: cout << "Resource 1 created: "
<< tempResource1.get ( ) << "(" << * tempResource1 << ")" << std:: endl ;
// Resource is held onto with bind
std:: function < void ( int i) > proof1 = std:: bind ( use_temporary_resource,
tempResource1,
1 ,
std:: placeholders :: _1) ;
// If it wasn't this would close the resource
tempResource1.reset ( ) ;
proof1( 1 ) ;
proof1( 2 ) ;
{
std:: shared_ptr < int > tempResource2( new int ( 2 ) , cleanup( ) ) ;
// Resource is held onto with bind
std:: function < void ( int i) > proof2 = std:: bind ( use_temporary_resource,
tempResource2,
2 ,
std:: placeholders :: _1) ;
// If it wasn't this would close the resource
tempResource2.reset ( ) ;
proof2( 10 ) ;
proof2( 20 ) ;
} // Once scope goes away from proof2, the resource is released.
std:: cout << "Resource 2 should have been released after exiting scope containing proof2 (here)."
<< std:: endl ;
std:: shared_ptr < int > tempResource3( new int ( 3 ) , cleanup( ) ) ;
std:: cout << "Resource 3 created: "
<< tempResource3.get ( ) << "(" << * tempResource3 << ")" << std:: endl ;
// Show that normally a resource will disapear if not placed in bind
tempResource3.reset ( ) ;
std:: cout << "Exiting..." << std:: endl ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgY2xlYW51cCB7Cgl2b2lkIG9wZXJhdG9yKCkgKGludCAqaSkgewoJCXN0ZDo6Y291dCA8PCAiQ2xlYW5pbmcgdXAgcmVzb3VyY2U6ICIgPDwgaSA8PCAiKCIgPDwgKmkgPDwgIikiCgkJICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsJCiAgICAgICAgLy8gRG8gdGhlIHdvcmsgZm9yIHJlbGVhc2luZyByZXNvdXJjZQogICAgICAgIGRlbGV0ZSBpOwoJfQp9OwoKdm9pZCB1c2VfdGVtcG9yYXJ5X3Jlc291cmNlKHN0ZDo6c2hhcmVkX3B0cjxpbnQ+IHJlc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICZwcm9vZiwgY29uc3QgaW50ICZtdWx0aXBsZSkgewoJaW50ICZpID0gKnJlc291cmNlOwoJc3RkOjpjb3V0IDw8ICJQcm9vZiAiIDw8IHByb29mIDw8ICIsIHVzaW5nIHRoZSByZXNvdXJjZTogIiA8PCBpIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBpIDw8ICIqIiA8PCBtdWx0aXBsZSA8PCAiPSIgPDwgaSptdWx0aXBsZSA8PCBzdGQ6OmVuZGw7Cn0KCmludCBtYWluKCkgewoJc3RkOjpzaGFyZWRfcHRyPGludD4gdGVtcFJlc291cmNlMShuZXcgaW50KDEpLCBjbGVhbnVwKCkpOwoJc3RkOjpjb3V0IDw8ICJSZXNvdXJjZSAxIGNyZWF0ZWQ6ICIgCgkgICAgICAgICAgPDwgdGVtcFJlc291cmNlMS5nZXQoKSA8PCAiKCIgPDwgKnRlbXBSZXNvdXJjZTEgPDwgIikiIDw8IHN0ZDo6ZW5kbDsKCgkvLyBSZXNvdXJjZSBpcyBoZWxkIG9udG8gd2l0aCBiaW5kCglzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50IGkpPiBwcm9vZjEgPSBzdGQ6OmJpbmQodXNlX3RlbXBvcmFyeV9yZXNvdXJjZSwKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUmVzb3VyY2UxLAoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xKTsKICAgIC8vIElmIGl0IHdhc24ndCB0aGlzIHdvdWxkIGNsb3NlIHRoZSByZXNvdXJjZQogICAgdGVtcFJlc291cmNlMS5yZXNldCgpOwogICAgcHJvb2YxKDEpOwogICAgcHJvb2YxKDIpOyAKCXsKCXN0ZDo6c2hhcmVkX3B0cjxpbnQ+IHRlbXBSZXNvdXJjZTIobmV3IGludCgyKSwgY2xlYW51cCgpKTsKCS8vIFJlc291cmNlIGlzIGhlbGQgb250byB3aXRoIGJpbmQKCXN0ZDo6ZnVuY3Rpb248dm9pZChpbnQgaSk+IHByb29mMiA9IHN0ZDo6YmluZCh1c2VfdGVtcG9yYXJ5X3Jlc291cmNlLAoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFJlc291cmNlMiwKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpOwoJLy8gSWYgaXQgd2Fzbid0IHRoaXMgd291bGQgY2xvc2UgdGhlIHJlc291cmNlCiAgICB0ZW1wUmVzb3VyY2UyLnJlc2V0KCk7CiAgICBwcm9vZjIoMTApOwogICAgcHJvb2YyKDIwKTsKCX0gIC8vIE9uY2Ugc2NvcGUgZ29lcyBhd2F5IGZyb20gcHJvb2YyLCB0aGUgcmVzb3VyY2UgaXMgcmVsZWFzZWQuCglzdGQ6OmNvdXQgPDwgIlJlc291cmNlIDIgc2hvdWxkIGhhdmUgYmVlbiByZWxlYXNlZCBhZnRlciBleGl0aW5nIHNjb3BlIGNvbnRhaW5pbmcgcHJvb2YyIChoZXJlKS4iCgkgICAgICAgICAgPDwgc3RkOjplbmRsOwoJICAgICAgICAgIAoJc3RkOjpzaGFyZWRfcHRyPGludD4gdGVtcFJlc291cmNlMyhuZXcgaW50KDMpLCBjbGVhbnVwKCkpOwoJCXN0ZDo6Y291dCA8PCAiUmVzb3VyY2UgMyBjcmVhdGVkOiAiIAoJICAgICAgICAgICAgICA8PCB0ZW1wUmVzb3VyY2UzLmdldCgpIDw8ICIoIiA8PCAqdGVtcFJlc291cmNlMyA8PCAiKSIgPDwgc3RkOjplbmRsOwoJLy8gU2hvdyB0aGF0IG5vcm1hbGx5IGEgcmVzb3VyY2Ugd2lsbCBkaXNhcGVhciBpZiBub3QgcGxhY2VkIGluIGJpbmQKCXRlbXBSZXNvdXJjZTMucmVzZXQoKTsKCXN0ZDo6Y291dCA8PCAiRXhpdGluZy4uLiIgIDw8IHN0ZDo6ZW5kbDsgCglyZXR1cm4gMDsKfQo=