forked from boostorg/smart_ptr
library. Changing includes to include the new individual smart pointer headers. Replacing old smart pointer library with an include of the new smart pointer headers. Simplify ifdefs that involve the member templates macros now that BOOST_MSVC6_MEMBER_TEMPLATES is also guaranteed to bet set for platforms that have full member templates. [SVN r12647]
97 lines
2.4 KiB
C++
97 lines
2.4 KiB
C++
// Boost shared_ptr_example.cpp --------------------------------------------//
|
|
|
|
// (C) Copyright Beman Dawes 2001. Permission to copy,
|
|
// use, modify, sell and distribute this software is granted provided this
|
|
// copyright notice appears in all copies. This software is provided "as is"
|
|
// without express or implied warranty, and with no claim as to its
|
|
// suitability for any purpose.
|
|
|
|
// See http://www.boost.org for most recent version including documentation.
|
|
|
|
// Revision History
|
|
// 21 May 01 Initial complete version (Beman Dawes)
|
|
|
|
// The original code for this example appeared in the shared_ptr documentation.
|
|
// Ray Gallimore pointed out that foo_set was missing a Compare template
|
|
// argument, so would not work as intended. At that point the code was
|
|
// turned into an actual .cpp file so it could be compiled and tested.
|
|
|
|
#include <vector>
|
|
#include <set>
|
|
#include <iostream>
|
|
#include <algorithm>
|
|
#include <boost/shared_ptr.hpp>
|
|
|
|
// The application will produce a series of
|
|
// objects of type Foo which later must be
|
|
// accessed both by occurrence (std::vector)
|
|
// and by ordering relationship (std::set).
|
|
|
|
struct Foo
|
|
{
|
|
Foo( int _x ) : x(_x) {}
|
|
~Foo() { std::cout << "Destructing a Foo with x=" << x << "\n"; }
|
|
int x;
|
|
/* ... */
|
|
};
|
|
|
|
typedef boost::shared_ptr<Foo> FooPtr;
|
|
|
|
struct FooPtrOps
|
|
{
|
|
bool operator()( const FooPtr & a, const FooPtr & b )
|
|
{ return a->x > b->x; }
|
|
void operator()( const FooPtr & a )
|
|
{ std::cout << a->x << "\n"; }
|
|
};
|
|
|
|
int main()
|
|
{
|
|
std::vector<FooPtr> foo_vector;
|
|
std::set<FooPtr,FooPtrOps> foo_set; // NOT multiset!
|
|
|
|
FooPtr foo_ptr( new Foo( 2 ) );
|
|
foo_vector.push_back( foo_ptr );
|
|
foo_set.insert( foo_ptr );
|
|
|
|
foo_ptr.reset( new Foo( 1 ) );
|
|
foo_vector.push_back( foo_ptr );
|
|
foo_set.insert( foo_ptr );
|
|
|
|
foo_ptr.reset( new Foo( 3 ) );
|
|
foo_vector.push_back( foo_ptr );
|
|
foo_set.insert( foo_ptr );
|
|
|
|
foo_ptr.reset ( new Foo( 2 ) );
|
|
foo_vector.push_back( foo_ptr );
|
|
foo_set.insert( foo_ptr );
|
|
|
|
std::cout << "foo_vector:\n";
|
|
std::for_each( foo_vector.begin(), foo_vector.end(), FooPtrOps() );
|
|
|
|
std::cout << "\nfoo_set:\n";
|
|
std::for_each( foo_set.begin(), foo_set.end(), FooPtrOps() );
|
|
std::cout << "\n";
|
|
|
|
// Expected output:
|
|
//
|
|
// foo_vector:
|
|
// 2
|
|
// 1
|
|
// 3
|
|
// 2
|
|
//
|
|
// foo_set:
|
|
// 3
|
|
// 2
|
|
// 1
|
|
//
|
|
// Destructing a Foo with x=2
|
|
// Destructing a Foo with x=1
|
|
// Destructing a Foo with x=3
|
|
// Destructing a Foo with x=2
|
|
|
|
return 0;
|
|
}
|
|
|