Listing 4
#include <memory>
#include <algorithm>
#include <map>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <ostream>
#include <string>
using std::tr1::shared_ptr; using std::tr1::weak_ptr;
using std::string; using std::map; using std::make_pair;
using std::ostream_iterator; using std::copy;
using std::basic_ostream; using std::cout; using std::setw;
typedef weak_ptr<void> address;
typedef map<address, string> name_list;
typedef name_list::value_type element;
typedef name_list::iterator iter;
template <class Ty> void add(name_list& names,
shared_ptr<Ty> val, string name)
{ // add an element to the list of names
names.insert(make_pair(address(val), name));
}
namespace std { // add to overload set for operator<<
template <class Elem, class Traits>
basic_ostream<Elem, Traits>& operator<<(
basic_ostream<Elem, Traits>& str, const element& elt)
{ // insert element into stream
return str << elt.first.lock() << ", " << elt.second;
}
}
void show_element(string title, iter it, iter last)
{ // show an element if found
cout << setw(6) << title;
if (it == last)
cout << " not found\n";
else
cout << setw(10) << *it << '\n';
}
void show_contents(iter first, iter last)
{ // show elements in half-open range [first, last)
cout << " Contents: ";
copy(first, last, ostream_iterator<element>(cout, "; "));
cout << '\n';
}
int main()
{ // demonstrate operator< for weak_ptr objects
name_list names;
shared_ptr<int> sp0(new int(3));
add(names, sp0, "int");
shared_ptr<double> sp1(new double(3.14159));
add(names, sp1, "double");
shared_ptr<long> sp2(new long(-1L));
add(names, sp2, "long");
cout << "After inserting three resources:\n";
show_contents(names.begin(), names.end());
show_element("sp0", names.find(sp0), names.end());
show_element("sp1", names.find(sp1), names.end());
show_element("sp2", names.find(sp2), names.end());
sp1.reset();
cout << "After releasing one resource:\n";
show_contents(names.begin(), names.end());
show_element("sp0", names.find(sp0), names.end());
show_element("sp1", names.find(sp1), names.end());
show_element("sp2", names.find(sp2), names.end());
return 0;
}