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;
  }