BDE 4.14.0 Production release
|
Provide an out-of-place implementation of bslma::SharedPtrRep
.
shared_ptr
imp.This component provides a class template, bslstl::SharedPtrAllocateOutofplaceRep
, which is a concrete implementation of bslma::SharedPtrRep
for managing objects of the parameterized TYPE
that are stored outside of the representation. When all references to the out-of-place object are released using releaseRef
, the deleter of the parameterized DELETER
type is invoked to delete the shared object. Memory is supplied and reclaimed by an allocator of the parameterized ALLOCATOR
type.
bslstl::SharedPtrAllocateOutofplaceRep
is thread-safe provided that disposeObject
and disposeRep
are not called explicitly, meaning that all non-creator operations other than disposeObject
and disposeRep
on a given instance can be safely invoked simultaneously from multiple threads (disposeObject
and disposeRep
are meant to be invoked only by releaseRef
and releaseWeakRef
). Note that there is no thread safety guarantees for operations on the managed object.
When the last shared reference to a shared object is released, the object is destroyed using the "deleter" provided when the associated shared pointer representation was created. bslstl::SharedPtrAllocateOutofplaceRep
supports two kinds of "deleter" objects, which vary in how they are invoked. A "function-like" deleter is any language entity that can be invoked such that the expression deleterInstance(objectPtr)
is a valid expression, and a "factory" deleter is any language entity that can be invoked such that the expression deleterInstance.deleteObject(objectPtr)
is a valid expression, where deleterInstance
is an instance of the "deleter" object, and objectPtr
is a pointer to the shared object. In summary:
The following are examples of function-like deleters that delete an object of MyType
:
The following on the other hand is an example of a factory deleter:
Note that deleteObject
is provided by all bslma
allocators and by any object that implements the bdlma::Deleter
protocol. Thus, any of these objects can be used as a factory deleter. The purpose of this design is to allow bslma
allocators and factories to be used seamlessly as deleters.
The selection of which expression is used by bslstl::SharedPtrAllocateOutofplaceRep
to destroy a shared object is based on how the deleter is passed to the shared pointer object: Deleters that are passed by address are assumed to be factory deleters, while those that are passed by value are assumed to be function-like. Note that if the wrong interface is used for a deleter, i.e., if a function-like deleter is passed by pointer, or a factory deleter is passed by value, and the expression used to delete the object is invalid, a compiler diagnostic will be emitted indicating the error.
The following example demonstrates how to implement a shared bdlt::Datetime
object using bslstl::SharedPtrAllocateOutofplaceRep
:
Finally, we define the implementation.