[#BloombergLP-bslma-SharedPtrInplaceRep]
= xref:BloombergLP.adoc[BloombergLP]::xref:BloombergLP/bslma.adoc[bslma]::SharedPtrInplaceRep
:relfileprefix: ../../
:mrdocs:

This class provides a concrete implementation of the `SharedPtrRep` protocol for &quot;in&hyphen;place&quot; instances of the parameterized `TYPE`&period; Upon destruction of this object, the destructor of `TYPE` is invoked&period;

== Synopsis

Declared in `&lt;bslma&lowbar;sharedptrinplacerep&period;h&gt;`

[source,cpp,subs="verbatim,replacements,macros,-callouts"]
----
template&lt;class TYPE&gt;
class SharedPtrInplaceRep
    : public xref:BloombergLP/bslma/SharedPtrRep.adoc[SharedPtrRep]
----

== Base Classes

[cols="1,4"]
|===
| Name| Description
| `xref:BloombergLP/bslma/SharedPtrRep.adoc[SharedPtrRep]`
| This class provides a partially implemented shared pointer representation (&quot;letter&quot;) protocol&period; The class provides two counters for storing the number of shared and weak references, and functions to increment and decrement these counters&period; In addition, this class provides protocol methods that allow concrete implementations to specify what action should be taken when these counts reach zero&period; The function `disposeRep` is responsible for destroying this object, it is called when the reference count to this object reaches zero&period; Thus, the destructor of this object is declared as protected and should never be invoked&period;
|===

== Member Functions

[cols="1,4"]
|===
| Name| Description
| xref:BloombergLP/bslma/SharedPtrInplaceRep/2constructor.adoc[`SharedPtrInplaceRep`]         [.small]#[constructor]#
| Create a `SharedPtrInplaceRep` object having an &quot;in&hyphen;place&quot; instance of the parameterized `TYPE` using the `TYPE` constructor that takes the specified arguments, `args&period;&period;&period;`&period; Use the specified `basicAllocator` to supply memory and, upon a call to `disposeRep`, to destroy this representation (and the &quot;in&hyphen;place&quot; shared object)&period; If construction of `TYPE` with `args` does not throw, then invocation of this constructor does not throw&period;
| xref:BloombergLP/bslma/SharedPtrRep/acquireRef.adoc[`acquireRef`] 
| Atomically acquire a shared reference to the shared object referred to by this representation&period; The behavior is undefined unless `0 &lt; numReferences()`&period;
| xref:BloombergLP/bslma/SharedPtrRep/acquireWeakRef.adoc[`acquireWeakRef`] 
| Atomically acquire a weak reference to the shared object referred to by this representation&period; The behavior is undefined unless `0 &lt; numWeakReferences() &verbar;&verbar; 0 &lt; numReferences()`&period;
| xref:BloombergLP/bslma/SharedPtrInplaceRep/disposeObject.adoc[`disposeObject`]  [.small]#[virtual]#
| Destroy the object being referred to by this representation&period; This method is automatically invoked by `releaseRef` when the number of shared references reaches zero and should not be explicitly invoked otherwise&period; Note that this function calls the destructor for the shared object, but does not deallocate its footprint&period;
| xref:BloombergLP/bslma/SharedPtrInplaceRep/disposeRep.adoc[`disposeRep`]  [.small]#[virtual]#
| Deallocate the memory associated with this representation object (including the shared object&apos;s footprint)&period; This method is automatically invoked by `releaseRef` and `releaseWeakRef` when the number of weak references and the number of shared references both reach zero and should not be explicitly invoked otherwise&period; The behavior is undefined unless `disposeObject` has already been called for this representation&period; Note that this `disposeRep` method effectively serves as the representation object&apos;s destructor&period;
| xref:BloombergLP/bslma/SharedPtrInplaceRep/getDeleter.adoc[`getDeleter`]  [.small]#[virtual]#
| Return a null pointer&period; Note that the specified `type` is not used as an in&hyphen;place representation for a shared pointer can never store a user&hyphen;supplied deleter (there is no function that might try to create one)&period;
| xref:BloombergLP/bslma/SharedPtrRep/hasUniqueOwner.adoc[`hasUniqueOwner`] 
| Return `true` if there is only one shared reference and no weak references to the object referred to by this representation, and `false` otherwise&period;
| xref:BloombergLP/bslma/SharedPtrRep/incrementRefs.adoc[`incrementRefs`] 
| Atomically increment the number of shared references to the shared object referred to by this representation by the optionally specified `incrementAmount`&period; The behavior is undefined unless `0 &lt; incrementAmount` and `0 &lt; numReferences()`&period;
| xref:BloombergLP/bslma/SharedPtrRep/numReferences.adoc[`numReferences`] 
| Return a &quot;snapshot&quot; of the current number of shared references to the shared object referred to by this representation object&period;
| xref:BloombergLP/bslma/SharedPtrRep/numWeakReferences.adoc[`numWeakReferences`] 
| Return a &quot;snapshot&quot; of the current number of weak references to the shared object referred to by this representation object&period;
| xref:BloombergLP/bslma/SharedPtrInplaceRep/originalPtr.adoc[`originalPtr`]  [.small]#[virtual]#
| Return the (untyped) address of the modifiable (in&hyphen;place) object referred to by this representation object&period;
| xref:BloombergLP/bslma/SharedPtrInplaceRep/ptr.adoc[`ptr`] 
| Return the address of the modifiable (in&hyphen;place) object referred to by this representation object&period;
| xref:BloombergLP/bslma/SharedPtrRep/releaseRef.adoc[`releaseRef`] 
| Atomically release a shared reference to the shared object referred to by this representation, disposing of the shared object if all the shared references to that object are released, and disposing of this representation if all (shared and weak) references to that object are released&period; The behavior is undefined unless `0 &lt; numReferences()`&period;
| xref:BloombergLP/bslma/SharedPtrRep/releaseWeakRef.adoc[`releaseWeakRef`] 
| Atomically release a weak reference to the shared object referred to by this representation, disposing of this representation if all (shared and weak) references to the shared object are released&period; The behavior is undefined unless `0 &lt; numWeakReferences()`&period;
| xref:BloombergLP/bslma/SharedPtrRep/resetCountsRaw.adoc[`resetCountsRaw`] 
| Reset the number of shared references and the number of weak references stored by this representation to the specified `numSharedReferences` and `numWeakReferences` respectively&period; This function is _not_ thread&hyphen;safe and users must ensure that they serialize access to the `SharedPtrRep` object when calling this function&period; Note that this function updates the counts, but does not dispose of the representation or the object irrespective of the values of `numSharedReferences` and `numWeakReferences`&period;
| xref:BloombergLP/bslma/SharedPtrRep/tryAcquireRef.adoc[`tryAcquireRef`] 
| Atomically acquire a shared reference to the shared object referred to by this representation, if the number of shared references is greater than 0, and do nothing otherwise&period; Return `true` if the acquire succeeds, and `false` otherwise&period; The behavior is undefined unless `0 &lt; numWeakReferences() &verbar;&verbar; 0 &lt; numReferences()`&period;
|===


== Static Member Functions

[cols="1,4"]
|===
| Name| Description
| xref:BloombergLP/bslma/SharedPtrRep/managedPtrDeleter.adoc[`managedPtrDeleter`] 
| Release the shared reference to an object held by the `SharedPtrRep` object that is pointed to be by specified `rep`&period; The behavior is undefined unless `rep` points to an object whose complete type publicly and unambiguously derives from `SharedPtrRep`&period; Note that the first argument is ignored&period; Also note that this function serves as the `ManagedPtr` deleter when converting a `bsl&colon;&colon;shared&lowbar;ptr` to a `bslma&colon;&colon;ManagedPtr`&period;
| xref:BloombergLP/bslma/SharedPtrRep/managedPtrEmptyDeleter.adoc[`managedPtrEmptyDeleter`] 
| This function has no effect&period; The behavior is undefined unless `rep` is null&period; Note that this function serves as the managed ptr deleter when converting an empty or null `bsl&colon;&colon;shared&lowbar;ptr` to a `bslma&colon;&colon;ManagedPtr`&period;
|===



[.small]#Created with https://www.mrdocs.com[MrDocs]#
