1 //  Boost shared_ptr_example.cpp  --------------------------------------------//
2 
3 //  Copyright Beman Dawes 2001.  Distributed under the Boost
4 //  Software License, Version 1.0. (See accompanying file
5 //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 
7 
8 //  See http://www.boost.org/libs/smart_ptr for documentation.
9 
10 //  Revision History
11 //  21 May 01  Initial complete version (Beman Dawes)
12 
13 //  The original code for this example appeared in the shared_ptr documentation.
14 //  Ray Gallimore pointed out that foo_set was missing a Compare template
15 //  argument, so would not work as intended.  At that point the code was
16 //  turned into an actual .cpp file so it could be compiled and tested.
17 
18 #include <vector>
19 #include <set>
20 #include <iostream>
21 #include <algorithm>
22 #include <boost/shared_ptr.hpp>
23 
24 //  The application will produce a series of
25 //  objects of type Foo which later must be
26 //  accessed both by occurrence (std::vector)
27 //  and by ordering relationship (std::set).
28 
29 struct Foo
30 {
FooFoo31   Foo( int _x ) : x(_x) {}
~FooFoo32   ~Foo() { std::cout << "Destructing a Foo with x=" << x << "\n"; }
33   int x;
34   /* ... */
35 };
36 
37 typedef boost::shared_ptr<Foo> FooPtr;
38 
39 struct FooPtrOps
40 {
operator ()FooPtrOps41   bool operator()( const FooPtr & a, const FooPtr & b )
42     { return a->x > b->x; }
operator ()FooPtrOps43   void operator()( const FooPtr & a )
44     { std::cout << a->x << "\n"; }
45 };
46 
main()47 int main()
48 {
49   std::vector<FooPtr>         foo_vector;
50   std::set<FooPtr,FooPtrOps>  foo_set; // NOT multiset!
51 
52   FooPtr foo_ptr( new Foo( 2 ) );
53   foo_vector.push_back( foo_ptr );
54   foo_set.insert( foo_ptr );
55 
56   foo_ptr.reset( new Foo( 1 ) );
57   foo_vector.push_back( foo_ptr );
58   foo_set.insert( foo_ptr );
59 
60   foo_ptr.reset( new Foo( 3 ) );
61   foo_vector.push_back( foo_ptr );
62   foo_set.insert( foo_ptr );
63 
64   foo_ptr.reset ( new Foo( 2 ) );
65   foo_vector.push_back( foo_ptr );
66   foo_set.insert( foo_ptr );
67 
68   std::cout << "foo_vector:\n";
69   std::for_each( foo_vector.begin(), foo_vector.end(), FooPtrOps() );
70 
71   std::cout << "\nfoo_set:\n";
72   std::for_each( foo_set.begin(), foo_set.end(), FooPtrOps() );
73   std::cout << "\n";
74 
75 //  Expected output:
76 //
77 //   foo_vector:
78 //   2
79 //   1
80 //   3
81 //   2
82 //
83 //   foo_set:
84 //   3
85 //   2
86 //   1
87 //
88 //   Destructing a Foo with x=2
89 //   Destructing a Foo with x=1
90 //   Destructing a Foo with x=3
91 //   Destructing a Foo with x=2
92 
93   return 0;
94 }
95 
96