|
Boost : |
From: davidbien_at_[hidden]
Date: 2000-04-16 21:38:43
Well, not really, but that what i happened to call them anyway (
misnomer ).
I have written some reference counted object containers, that address
STL containers of reference counted elements from a different
perspective than boost's smart pointer library.
They also support "copy-on-write" functionality ( which is kind of
cool ). This allows keys inserted into sets to have true const-ness -
which is semantically correct.
The conversion-to-pointer is harder to misuse since none of the
reference counted objects are constructable from a pointer.
I also have a polymorphic version that is not demonstrated here.
I would be interested in submitting this for inclusion in your
library.
Here is a usage example, this demonstrates the non-polymorphic
version:
// This means: garbage collected object using allocator _TyAllocator
// true: means use int's relational operators
// false would mean use the address of the object for relationals
typedef _gco< int, _TyAllocator, true > _TyGcoInt;
// This means: garbage collected pointer, holding a _TyGcoInt,
// true: means use copy-on-write, false would mean not.
typedef _gcp< int, _TyGcoInt, true > _TyGcpInt;
// This means: garbage collected reference, holding a _TyGcoInt,
// using copy-on-write:
typedef _gcr< int, _TyGcoInt, true > _TyGcrInt;
// A set of "garbage collected" int references:
typedef set< _TyGcrInt, less< _TyGcrInt >, _TyAllocator > _TySetInt;
typedef pair< _TySetInt::iterator, bool > _TyPibInt;
_TySetInt setInts;
_TyGcrInt gcrInt = 1; // Implicit construction from an int.
_TyPibInt pibInt = setInts.insert( gcrInt );
assert( pibInt.second );
gcrInt = 2; // causes "copy-on-write" to fire.
pibInt = setInts.insert( gcrInt );
assert( pibInt.second );
gcrInt = 3; // causes "copy-on-write"
pibInt = setInts.insert( gcrInt );
assert( pibInt.second );
gcrInt = 2; // copy-on-write
pibInt = setInts.insert( gcrInt );
assert( !pibInt.second ); // this was already in the collection.
// No copy on write on this call - the gcrInt did not
// get inserted in the set in the last:
gcrInt = 1;
Sincerely,
David Bien
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk