// bslma_managedptr_cpp03.h                                           -*-C++-*-

// Automatically generated file.  **DO NOT EDIT**

#ifndef INCLUDED_BSLMA_MANAGEDPTR_CPP03
#define INCLUDED_BSLMA_MANAGEDPTR_CPP03

//@PURPOSE: Provide C++03 implementation for bslma_managedptr.h
//
//@CLASSES: See bslma_managedptr.h for list of classes
//
//@SEE_ALSO: bslma_managedptr
//
//@DESCRIPTION:  This component is the C++03 translation of a C++11 component,
// generated by the 'sim_cpp11_features.pl' program.  If the original header
// contains any specially delimited regions of C++11 code, then this generated
// file contains the C++03 equivalent, i.e., with variadic templates expanded
// and rvalue-references replaced by 'bslmf::MovableRef' objects.  The header
// code in this file is designed to be '#include'd into the original header
// when compiling with a C++03 compiler.  If there are no specially delimited
// regions of C++11 code, then this header contains no code and is not
// '#include'd in the original header.
//
// Generated on Mon Oct 17 10:42:50 2022
// Command line: sim_cpp11_features.pl bslma_managedptr.h

#ifdef COMPILING_BSLMA_MANAGEDPTR_H

namespace BloombergLP {
namespace bslma {

                  // =================================
                  // private struct ManagedPtr_ImpUtil
                  // =================================

struct ManagedPtr_ImpUtil {
    // This 'struct' provides a namespace for utility functions used to obtain
    // the necessary types of pointers.

    // CLASS METHODS
    template <class TYPE>
    static void *voidify(TYPE *address) BSLS_KEYWORD_NOEXCEPT;
        // Return the specified 'address' cast as a pointer to 'void', even if
        // (the template parameter) 'TYPE' is cv-qualified.

    template <class TYPE>
    static TYPE *unqualify(const volatile TYPE *address) BSLS_KEYWORD_NOEXCEPT;
        // Return the specified 'address' of a potentially cv-qualified object
        // of the given (template parameter) 'TYPE', cast as a pointer to
        // non-cv-qualified 'TYPE'.
};
                    // ============================
                    // private class ManagedPtr_Ref
                    // ============================

template <class TARGET_TYPE>
class ManagedPtr_Ref {
    // This class holds a managed pointer reference, returned by the implicit
    // conversion operator in the class 'ManagedPtr'.  This class is used to
    // allow the construction of managed pointers from temporary managed
    // pointer objects, since temporaries cannot bind to the reference to a
    // modifiable object used in the copy constructor and copy-assignment
    // operator for 'ManagedPtr'.  Note that while no members or methods of
    // this class template depend on the specified 'TARGET_TYPE', it is
    // important to carry this type into conversions to support passing
    // ownership of 'ManagedPtr_Members' pointers when assigning or
    // constructing 'ManagedPtr' objects.

    // DATA
    ManagedPtr_Members *d_base_p;  // non-null pointer to the managed state of
                                   // a 'ManagedPtr' object

    TARGET_TYPE        *d_cast_p;  // safely-cast pointer to the referenced
                                   // object

  public:
    // CREATORS
    ManagedPtr_Ref(ManagedPtr_Members *base, TARGET_TYPE *target);
        // Create a 'ManagedPtr_Ref' object having the specified 'base' value
        // for its 'base' attribute, and the specified 'target' for its
        // 'target' attribute.  Note that 'target' (but not 'base') may be
        // null.

    //! ManagedPtr_Ref(const ManagedPtr_Ref& original) = default;
        // Create a 'ManagedPtr_Ref' object having the same 'd_base_p' value as
        // the specified 'original'.  Note that this trivial constructor's
        // definition is compiler generated.

    ~ManagedPtr_Ref();
        // Destroy this object.  Note that the referenced managed object is
        // *not* destroyed.

    // MANIPULATORS
    //! ManagedPtr_Ref& operator=(const ManagedPtr_Ref& original) = default;
        // Create a 'ManagedPtr_Ref' object having the same 'd_base_p' as the
        // specified 'original'.  Note that this trivial copy-assignment
        // operator's definition is compiler generated.

    // ACCESSORS
    ManagedPtr_Members *base() const;
        // Return a pointer to the managed state of a 'ManagedPtr' object.

    TARGET_TYPE *target() const;
        // Return a pointer to the referenced object.
};

                    // =========================================
                    // private struct ManagedPtr_TraitConstraint
                    // =========================================

struct ManagedPtr_TraitConstraint {
    // This 'struct' is an empty type that exists solely to enable constructor
    // access to be constrained by type trait.
};
                           // ================
                           // class ManagedPtr
                           // ================

template <class TARGET_TYPE>
class ManagedPtr {
    // This class is a "smart pointer" that refers to a *target* object
    // accessed via a pointer to the specified parameter type, 'TARGET_TYPE',
    // and that supports sole ownership of a *managed* object that is
    // potentially of a different type, and may be an entirely different object
    // from the target object.  A managed pointer ensures that the object it
    // manages is destroyed when the managed pointer is destroyed (or
    // re-assigned), using the "deleter" supplied along with the managed
    // object.  The target object referenced by a managed pointer may be
    // accessed using either the '->' operator, or the dereference operator
    // ('operator *').  The specified 'TARGET_TYPE' may be 'const'-qualified,
    // but may not be 'volatile'-qualified, nor may it be a reference type.
    //
    // A managed pointer may be *empty*, in which case it neither refers to a
    // target object nor owns a managed object.  An empty managed pointer is
    // the equivalent of a null pointer: Such a managed pointer is not
    // de-referenceable, and tests as 'false' in boolean expressions.
    //
    // A managed pointer for which the managed object is not the same object as
    // the target is said to *alias* the managed object (see the section
    // "Aliasing" in the component-level documentation).

  public:
    // INTERFACE TYPES
    typedef ManagedPtrDeleter::Deleter DeleterFunc;
        // Alias for a function-pointer type for functions used to destroy the
        // object managed by a 'ManagedPtr' object.

    typedef TARGET_TYPE element_type;
        // Alias to the 'TARGET_TYPE' template parameter.

  private:
    // PRIVATE TYPES
    typedef typename bsls::UnspecifiedBool<ManagedPtr>::BoolType BoolType;
        // 'BoolType' is an alias for an unspecified type that is implicitly
        // convertible to 'bool', but will not promote to 'int'.  This (opaque)
        // type can be used as an "unspecified boolean type" for converting a
        // managed pointer to 'bool' in contexts such as 'if (mp) { ... }'
        // without actually having a conversion to 'bool' or being less-than
        // comparable (either of which would also enable undesirable implicit
        // comparisons of managed pointers to 'int' and less-than comparisons).

    typedef bslmf::MovableRefUtil                                MoveUtil;
        // This 'typedef' is a convenient alias for the utility associated with
        // movable references.

    // DATA
    ManagedPtr_Members d_members;  // state managed by this object

    // PRIVATE CLASS METHODS
    static void *stripBasePointerType(TARGET_TYPE *ptr);
        // Return the value of the specified 'ptr' as a 'void *', after
        // stripping all 'const' and 'volatile' qualifiers from 'TARGET_TYPE'.
        // This function avoids accidental type-safety errors when performing
        // the necessary sequence of casts.  Note that calling this function
        // implies a conversion of the calling pointer to 'TARGET_TYPE *',
        // which, in rare cases, may involve some adjustment of the pointer
        // value, e.g., in the case of multiple inheritance where 'TARGET_TYPE'
        // is not a left-most base of the complete object type.

    template <class MANAGED_TYPE>
    static void *stripCompletePointerType(MANAGED_TYPE *ptr);
        // Return the value of the specified 'ptr' as a 'void *', after
        // stripping all 'const' and 'volatile' qualifiers from 'MANAGED_TYPE'.
        // This function avoids accidental type-safety errors when performing
        // the necessary sequence of casts.

    // PRIVATE MANIPULATORS
    template <class MANAGED_TYPE>
    void loadImp(MANAGED_TYPE *ptr, void *cookie, DeleterFunc deleter);
        // Destroy the currently managed object, if any.  Then, set the target
        // object of this managed pointer to be that referenced by the
        // specified 'ptr', take ownership of '*ptr' as the currently managed
        // object, and set a deleter that will invoke the specified 'deleter'
        // with the address of the currently managed object, and with the
        // specified 'cookie' (that the deleter can use for its own purposes),
        // unless '0 == ptr', in which case reset this managed pointer to
        // empty.  The behavior is undefined if 'ptr' is already managed by
        // another object, or if '0 == deleter && 0 != ptr'.

  private:
    // NOT IMPLEMENTED
    template <class MANAGED_TYPE>
    ManagedPtr(MANAGED_TYPE *, bsl::nullptr_t);
        // It is never defined behavior to pass a null pointer literal as a
        // factory, unless the specified 'ptr' is also a null pointer literal.

  private:
    // NOT IMPLEMENTED
    template <class MANAGED_TYPE, class COOKIE_TYPE>
    ManagedPtr(MANAGED_TYPE *, COOKIE_TYPE *, bsl::nullptr_t);
        // It is never defined behavior to pass a null literal as a deleter,
        // unless the 'object' pointer is also a null pointer literal.

  private:
    // NOT IMPLEMENTED
    template <class MANAGED_TYPE>
    void load(MANAGED_TYPE *, bsl::nullptr_t, bsl::nullptr_t);
    template <class COOKIE_TYPE>
    void load(TARGET_TYPE *, COOKIE_TYPE *, bsl::nullptr_t);
        // It is never defined behavior to pass a null literal as a deleter,
        // unless the 'object' pointer is also a null pointer literal.

  private:
    // NOT IMPLEMENTED
    void operator==(const ManagedPtr&) const;
    void operator!=(const ManagedPtr&) const;
        // These two operator overloads are declared as 'private' but never
        // defined in order to eliminate accidental equality comparisons that
        // would occur through the implicit conversion to 'BoolType'.  Note
        // that the return type of 'void' is chosen as it will often produce a
        // clearer error message than relying on the 'private' control failure.
        // Also note that these private operators will not be needed with
        // C++11, where an 'explicit operator bool()' conversion operator would
        // be preferred.

    // FRIENDS
    template <class ALIASED_TYPE>
    friend class ManagedPtr;  // required only for alias support

  public:
    // CREATORS
    ManagedPtr();
        // Create an empty managed pointer.

    template <class MANAGED_TYPE>
    explicit ManagedPtr(MANAGED_TYPE *ptr);
        // Create a managed pointer having a target object referenced by the
        // specified 'ptr', owning the managed object '*ptr', and having a
        // deleter that will call 'delete ptr' to destroy the managed object
        // when invoked (e.g., when this managed pointer object is destroyed),
        // unless '0 == ptr', in which case create an empty managed pointer.
        // The deleter will invoke the destructor of 'MANAGED_TYPE' rather than
        // the destructor of 'TARGET_TYPE'.  This constructor will not compile
        // unless 'MANAGED_TYPE *' is convertible to 'TARGET_TYPE *'.  Note
        // that this behavior allows 'ManagedPtr' to be defined for 'void'
        // pointers, and to call the correct destructor for the managed object,
        // even if the destructor for 'TARGET_TYPE' is not declared as
        // 'virtual'.  The behavior is undefined unless the managed object (if
        // any) can be destroyed by 'delete', or if the lifetime of the managed
        // object is already managed by another object.

    ManagedPtr(ManagedPtr_Ref<TARGET_TYPE> ref)
                                             BSLS_KEYWORD_NOEXCEPT; // IMPLICIT
        // Create a managed pointer having the same target object as the
        // managed pointer referenced by the specified 'ref', transfer
        // ownership of the managed object owned by the managed pointer
        // referenced by 'ref', and reset the managed pointer referenced by
        // 'ref' to empty.  This constructor is used to create a managed
        // pointer from a managed pointer rvalue, or from a managed pointer to
        // a "compatible" type, where "compatible" means a built-in conversion
        // from 'COMPATIBLE_TYPE *' to 'TARGET_TYPE *' is defined, e.g.,
        // 'derived *' to 'base *', 'T *' to 'const T *', or 'T *' to 'void *'.

    ManagedPtr(ManagedPtr& original)                   BSLS_KEYWORD_NOEXCEPT;
    ManagedPtr(bslmf::MovableRef<ManagedPtr> original) BSLS_KEYWORD_NOEXCEPT;
        // Create a managed pointer having the same target object as the
        // specified 'original', transfer ownership of the object managed by
        // 'original' (if any) to this managed pointer, and reset 'original' to
        // empty.

#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
    template <class BDE_OTHER_TYPE>
    ManagedPtr(ManagedPtr<BDE_OTHER_TYPE>&& original,
               typename bsl::enable_if<
                   bsl::is_convertible<BDE_OTHER_TYPE *, TARGET_TYPE *>::value,
                   ManagedPtr_TraitConstraint>::type =
                       ManagedPtr_TraitConstraint())
        BSLS_KEYWORD_NOEXCEPT;
#elif defined(BSLS_PLATFORM_CMP_SUN) && BSLS_PLATFORM_CMP_VERSION < 0x5130
    // sun compiler version 12.3 and earlier
    template <class BDE_OTHER_TYPE>
    ManagedPtr(bslmf::MovableRef<ManagedPtr<BDE_OTHER_TYPE> > original)
        BSLS_KEYWORD_NOEXCEPT;
#else // c++03 except old (version <= 12.3) sun compilers
    template <class BDE_OTHER_TYPE>
    ManagedPtr(bslmf::MovableRef<ManagedPtr<BDE_OTHER_TYPE> > original,
               typename bsl::enable_if<
                 bsl::is_convertible<BDE_OTHER_TYPE *, TARGET_TYPE *>::value,
                 ManagedPtr_TraitConstraint>::type =
                     ManagedPtr_TraitConstraint())
        BSLS_KEYWORD_NOEXCEPT;
#endif
        // Create a managed pointer having the same target object as the
        // specified 'original', transfer ownership of the object managed by
        // 'original' (if any) to this managed pointer, and reset 'original' to
        // empty.  'TARGET_TYPE' must be an accessible and unambiguous base of
        // 'BDE_OTHER_TYPE'

    template <class ALIASED_TYPE>
    ManagedPtr(ManagedPtr<ALIASED_TYPE>& alias, TARGET_TYPE *ptr);
    template <class ALIASED_TYPE>
#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
    ManagedPtr(ManagedPtr<ALIASED_TYPE>&&                    alias,
#else
    ManagedPtr(bslmf::MovableRef<ManagedPtr<ALIASED_TYPE> >  alias,
#endif
               TARGET_TYPE                                  *ptr);
        // Create a managed pointer that takes ownership of the object managed
        // by the specified 'alias', but which uses the specified 'ptr' to
        // refer to its target object, unless '0 == ptr', in which case create
        // an empty managed pointer.  Reset 'alias' to empty if ownership of
        // its managed object is transferred.  The behavior is undefined if
        // 'alias' is empty, but '0 != ptr'.  Note that destroying or
        // re-assigning a managed pointer created with this constructor will
        // destroy the object originally managed by 'alias' (unless 'release'
        // is called first); the destructor for '*ptr' is not called directly.

    template <class MANAGED_TYPE, class FACTORY_TYPE>
    ManagedPtr(MANAGED_TYPE *ptr, FACTORY_TYPE *factory);
        // Create a managed pointer having a target object referenced by the
        // specified 'ptr', owning the managed object '*ptr', and having a
        // deleter that will call 'factory->deleteObject(ptr)' to destroy the
        // managed object when invoked (e.g., when this managed pointer object
        // is destroyed), unless '0 == ptr', in which case create an empty
        // managed pointer.  The deleter will invoke the destructor of
        // 'MANAGED_TYPE' rather than the destructor of 'TARGET_TYPE'.  This
        // constructor will not compile unless 'MANAGED_TYPE *' is convertible
        // to 'TARGET_TYPE *'.  The behavior is undefined unless the managed
        // object (if any) can be destroyed by the specified 'factory', or if
        // '0 == factory && 0 != ptr', or if the lifetime of the managed object
        // is already managed by another object.  Note that 'bslma::Allocator',
        // and any class publicly and unambiguously derived from
        // 'bslma::Allocator', meets the requirements for 'FACTORY_TYPE'.

    explicit ManagedPtr(bsl::nullptr_t, bsl::nullptr_t = 0);
        // Create an empty managed pointer.  Note that this constructor is
        // necessary to match null-pointer literal arguments, in order to break
        // ambiguities and provide valid type deduction with the other
        // constructor templates in this class.

    template <class FACTORY_TYPE>
    ManagedPtr(bsl::nullptr_t, FACTORY_TYPE *factory);
        // Create an empty managed pointer.  Note that the specified 'factory'
        // is ignored, as an empty managed pointer does not call its deleter.

    ManagedPtr(TARGET_TYPE *ptr, void *cookie, DeleterFunc deleter);
        // Create a managed pointer having a target object referenced by the
        // specified 'ptr', owning the managed object '*ptr', and having a
        // deleter that will invoke the specified 'deleter' with the address of
        // the currently managed object, and with the specified 'cookie' (that
        // the deleter can use for its own purposes), unless '0 == ptr', in
        // which case create an empty managed pointer.  The behavior is
        // undefined if 'ptr' is already managed by another object, or if
        // '0 == deleter && 0 != ptr'.  Note that this constructor is required
        // only because the deprecated overloads cause an ambiguity in its
        // absence; it should be removed when the deprecated overloads are
        // removed.

    template <class MANAGED_TYPE>
    ManagedPtr(MANAGED_TYPE *ptr, void *cookie, DeleterFunc deleter);
        // Create a managed pointer having a target object referenced by the
        // specified 'ptr', owning the managed object '*ptr', and having a
        // deleter that will invoke the specified 'deleter' with the address of
        // the currently managed object, and with the specified 'cookie' (that
        // the deleter can use for its own purposes), unless '0 == ptr', in
        // which case create an empty managed pointer.  This constructor will
        // not compile unless 'MANAGED_TYPE *' is convertible to
        // 'TARGET_TYPE *'.  The deleter will invoke the destructor of
        // 'MANAGED_TYPE' rather than the destructor of 'TARGET_TYPE'.  The
        // behavior is undefined if 'ptr' is already managed by another object,
        // or if '0 == deleter && 0 != ptr'.

#ifndef BDE_OMIT_INTERNAL_DEPRECATED
    template <class MANAGED_TYPE, class MANAGED_BASE>
    ManagedPtr(MANAGED_TYPE *ptr,
               void         *cookie,
               void        (*deleter)(MANAGED_BASE *, void *));
        // [!DEPRECATED!]: Instead, use:
        //..
        //  template <class MANAGED_TYPE>
        //  ManagedPtr(MANAGED_TYPE *ptr, void *cookie, DeleterFunc deleter);
        //..
        // Create a managed pointer having a target object referenced by the
        // specified 'ptr', owning the managed object '*ptr', and having a
        // deleter that will invoke the specified 'deleter' with the address of
        // the currently managed object, and with the specified 'cookie' (that
        // the deleter can use for its own purposes), unless '0 == ptr', in
        // which case create an empty managed pointer.  This constructor will
        // not compile unless 'MANAGED_TYPE *' is convertible to
        // 'TARGET_TYPE *', and 'MANAGED_TYPE *' is convertible to
        // 'MANAGED_BASE *'.  The deleter will invoke the destructor of
        // 'MANAGED_TYPE' rather than the destructor of 'TARGET_TYPE'.  The
        // behavior is undefined if 'ptr' is already managed by another object,
        // or if '0 == deleter && 0 != ptr'.  Note that this constructor is
        // needed only to avoid ambiguous type deductions when passing a null
        // pointer literal as the 'cookie' when the user passes a deleter
        // taking a type other than 'void *' for its object type.  Also note
        // that this function is *deprecated* as it relies on undefined
        // compiler behavior for its implementation (that luckily performs as
        // required on every platform supported by BDE).

    template <class MANAGED_TYPE,
              class MANAGED_BASE,
              class COOKIE_TYPE,
              class COOKIE_BASE>
    ManagedPtr(MANAGED_TYPE *ptr,
               COOKIE_TYPE  *cookie,
               void        (*deleter)(MANAGED_BASE *, COOKIE_BASE *));
        // [!DEPRECATED!]: Instead, use:
        //..
        //  template <class MANAGED_TYPE>
        //  ManagedPtr(MANAGED_TYPE *ptr, void *cookie, DeleterFunc deleter);
        //..
        // Create a managed pointer having a target object referenced by the
        // specified 'ptr', owning the managed object '*ptr', and having a
        // deleter that will invoke the specified 'deleter' with the address of
        // the currently managed object, and with the specified 'cookie' (that
        // the deleter can use for its own purposes), unless '0 == ptr', in
        // which case create an empty managed pointer.  This constructor will
        // not compile unless 'MANAGED_TYPE *' is convertible to
        // 'TARGET_TYPE *', and 'MANAGED_TYPE *' is convertible to
        // 'MANAGED_BASE *'.  The deleter will invoke the destructor of
        // 'MANAGED_TYPE' rather than the destructor of 'TARGET_TYPE'.  The
        // behavior is undefined if 'ptr' is already managed by another object,
        // or if '0 == deleter && 0 != ptr'.  Note that this function is
        // *deprecated* as it relies on undefined compiler behavior for its
        // implementation (that luckily performs as required on every platform
        // supported by BDE).
#endif // BDE_OMIT_INTERNAL_DEPRECATED

    ~ManagedPtr();
        // Destroy this managed pointer object.  Destroy the object managed by
        // this managed pointer by invoking the user-supplied deleter, unless
        // this managed pointer is empty, in which case the deleter will *not*
        // be called.

    // MANIPULATORS
    ManagedPtr& operator=(ManagedPtr& rhs)               BSLS_KEYWORD_NOEXCEPT;
    ManagedPtr& operator=(bslmf::MovableRef<ManagedPtr> rhs)
                                                         BSLS_KEYWORD_NOEXCEPT;
        // If this object and the specified 'rhs' manage the same object,
        // return a reference to this managed pointer; otherwise, destroy the
        // managed object owned by this managed pointer, transfer ownership of
        // the managed object owned by 'rhs' to this managed pointer, set this
        // managed pointer to point to the target object referenced by 'rhs',
        // reset 'rhs' to empty, and return a reference to this managed
        // pointer.

#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
    template <class BDE_OTHER_TYPE>
    typename bsl::enable_if<
        bsl::is_convertible<BDE_OTHER_TYPE *, TARGET_TYPE *>::value,
        ManagedPtr<TARGET_TYPE> >::type&
    operator=(ManagedPtr<BDE_OTHER_TYPE>&& rhs) BSLS_KEYWORD_NOEXCEPT;
#elif defined(BSLS_PLATFORM_CMP_SUN) && BSLS_PLATFORM_CMP_VERSION < 0x5130
    // sun compiler version 12.3 and earlier
    template <class BDE_OTHER_TYPE>
    ManagedPtr<TARGET_TYPE>&
    operator=(bslmf::MovableRef<ManagedPtr<BDE_OTHER_TYPE> > rhs)
        BSLS_KEYWORD_NOEXCEPT;
#else // c++03 except old (version <= 12.3) sun compilers
    template <class BDE_OTHER_TYPE>
    typename bsl::enable_if<
        bsl::is_convertible<BDE_OTHER_TYPE *, TARGET_TYPE *>::value,
        ManagedPtr<TARGET_TYPE> >::type&
    operator=(bslmf::MovableRef<ManagedPtr<BDE_OTHER_TYPE> > rhs)
        BSLS_KEYWORD_NOEXCEPT;
#endif
        // If this object and the specified 'rhs' manage the same object,
        // return a reference to this managed pointer; otherwise, destroy the
        // managed object owned by this managed pointer, transfer ownership of
        // the managed object owned by 'rhs' to this managed pointer, set this
        // managed pointer to point to the target object referenced by 'rhs',
        // reset 'rhs' to empty, and return a reference to this managed
        // pointer.  'TARGET_TYPE' must be an accessible and unambiguous base
        // of 'BDE_OTHER_TYPE'

    ManagedPtr& operator=(ManagedPtr_Ref<TARGET_TYPE> ref)
                                                         BSLS_KEYWORD_NOEXCEPT;
        // If this object and the managed pointer reference by the specified
        // 'ref' manage the same object, return a reference to this managed
        // pointer; otherwise, destroy the managed object owned by this managed
        // pointer, transfer ownership of the managed object owned by the
        // managed pointer referenced by 'ref', and set this managed pointer to
        // point to the target object currently referenced the managed pointer
        // referenced by 'ref'; then reset the managed pointer referenced by
        // 'ref' to empty, and return a reference to this managed pointer.
        // This operator is (implicitly) used to assign from a managed pointer
        // rvalue, or from a managed pointer to a "compatible" type, where
        // "compatible" means a built-in conversion from 'MANAGED_TYPE *' to
        // 'TARGET_TYPE *' is defined, e.g., 'derived *' to 'base *', 'T *' to
        // 'const T *', or 'T *' to 'void *'.

    ManagedPtr& operator=(bsl::nullptr_t);
        // Destroy the current managed object (if any) and reset this managed
        // pointer to empty.

    template <class REFERENCED_TYPE>
    operator ManagedPtr_Ref<REFERENCED_TYPE>();
        // Return a managed pointer reference, referring to this object.  Note
        // that this conversion operator is used implicitly to allow the
        // construction of managed pointers from rvalues because temporaries
        // cannot be passed by references offering modifiable access.

    void clear();
        // [!DEPRECATED!] Use 'reset' instead.
        //
        // Destroy the current managed object (if any) and reset this managed
        // pointer to empty.

    template <class MANAGED_TYPE>
    void load(MANAGED_TYPE *ptr);
        // Destroy the currently managed object, if any.  Then, set the target
        // object of this managed pointer to be that referenced by the
        // specified 'ptr', take ownership of '*ptr' as the currently managed
        // object, and set a deleter that uses the currently installed default
        // allocator to destroy the managed object when invoked (e.g., when
        // this managed pointer object is destroyed), unless '0 == ptr', in
        // which case reset this managed pointer to empty.  The deleter will
        // invoke the destructor of 'MANAGED_TYPE' rather than the destructor
        // of 'TARGET_TYPE'.  This function will not compile unless
        // 'MANAGED_TYPE *' is convertible to 'TARGET_TYPE *'.  The behavior is
        // undefined unless the managed object (if any) can be destroyed by the
        // currently installed default allocator, or if the lifetime of the
        // managed object is already managed by another object.

    template <class MANAGED_TYPE, class FACTORY_TYPE>
    void load(MANAGED_TYPE *ptr, FACTORY_TYPE *factory);
        // Destroy the currently managed object, if any.  Then, set the target
        // object of this managed pointer to be that referenced by the
        // specified 'ptr', take ownership of '*ptr' as the currently managed
        // object, and set a deleter that calls 'factory->deleteObject(ptr)' to
        // destroy the managed object when invoked (e.g., when this managed
        // pointer object is destroyed), unless '0 == ptr', in which case reset
        // this managed pointer to empty.  The deleter will invoke the
        // destructor of 'MANAGED_TYPE' rather than the destructor of
        // 'TARGET_TYPE'.  This function will not compile unless
        // 'MANAGED_TYPE *' is convertible to 'TARGET_TYPE *'.  The behavior is
        // undefined unless the managed object (if any) can be destroyed by the
        // specified 'factory',  or if '0 == factory && 0 != ptr', or if the
        // the lifetime of the managed object is already managed by another
        // object.  Note that 'bslma::Allocator', and any class publicly and
        // unambiguously derived from 'bslma::Allocator', meets the
        // requirements for 'FACTORY_TYPE'.

    template <class MANAGED_TYPE>
    void load(MANAGED_TYPE *ptr, void *cookie, DeleterFunc deleter);
        // Destroy the currently managed object, if any.  Then, set the target
        // object of this managed pointer to be that referenced by the
        // specified 'ptr', take ownership of '*ptr' as the currently managed
        // object, and set a deleter that will invoke the specified 'deleter'
        // with the address of the currently managed object, and with the
        // specified 'cookie' (that the deleter can use for its own purposes),
        // unless '0 == ptr', in which case reset this managed pointer to
        // empty.  The behavior is undefined if 'ptr' is already managed by
        // another object, or if '0 == deleter && 0 != ptr'.  Note that GCC 3.4
        // and earlier versions have a bug in template type deduction/overload
        // resolution that causes ambiguities if this signature is available.
        // This function will be restored on that platform once the deprecated
        // signatures are finally removed.

    void load(bsl::nullptr_t = 0, void *cookie = 0, DeleterFunc deleter = 0);
        // Destroy the current managed object (if any) and reset this managed
        // pointer to empty.  Note that the optionally specified 'cookie' and
        // 'deleter' will be ignored, as empty managed pointers do not invoke a
        // deleter.

#ifndef BDE_OMIT_INTERNAL_DEPRECATED
    template <class MANAGED_TYPE, class COOKIE_TYPE>
    void load(MANAGED_TYPE *ptr, COOKIE_TYPE *cookie, DeleterFunc deleter);

    template <class MANAGED_TYPE, class MANAGED_BASE>
    void load(MANAGED_TYPE *ptr,
              void         *cookie,
              void        (*deleter)(MANAGED_BASE *, void *));

    template <class MANAGED_TYPE,
              class MANAGED_BASE,
              class COOKIE_TYPE,
              class COOKIE_BASE>
    void load(MANAGED_TYPE *ptr,
              COOKIE_TYPE  *cookie,
              void        (*deleter)(MANAGED_BASE *, COOKIE_BASE *));
        // [!DEPRECATED!]: Instead, use:
        //..
        //  template <class MANAGED_TYPE>
        //  void load(MANAGED_TYPE *ptr, void *cookie, DeleterFunc deleter);
        //..
        // Destroy the currently managed object, if any.  Then, set the target
        // object of this managed pointer to be that referenced by the
        // specified 'ptr', take ownership of '*ptr' as the currently managed
        // object, and set a deleter that will invoke the specified 'deleter'
        // with the address of the currently managed object, and with the
        // specified 'cookie' (that the deleter can use for its own purposes),
        // unless '0 == ptr', in which case reset this managed pointer to
        // empty.  The behavior is undefined if 'ptr' is already managed by
        // another object, or if '0 == deleter && 0 != ptr'.  Note that this
        // function is *deprecated* as it relies on undefined compiler behavior
        // for its implementation, but luckily perform as required for all
        // currently supported platforms; on platforms where the non-deprecated
        // overload is not available (e.g., GCC 3.4) code should be written as
        // if it were available, as an appropriate (deprecated) overload will
        // be selected with the correct (non-deprecated) behavior.
#endif // BDE_OMIT_INTERNAL_DEPRECATED

    template <class ALIASED_TYPE>
    void loadAlias(ManagedPtr<ALIASED_TYPE>& alias, TARGET_TYPE *ptr);
        // If the specified 'alias' manages the same object as this managed
        // pointer, set the target object of this managed pointer to be that
        // referenced by the specified 'ptr'; otherwise, destroy the currently
        // managed object (if any), and if 'alias' is empty, reset this managed
        // pointer to empty; otherwise, transfer ownership (and the deleter) of
        // the object managed by 'alias', and set the target object of this
        // managed pointer to be that referenced by 'ptr'.  The behavior is
        // undefined if '0 == ptr' and 'alias' is not empty, or if '0 != ptr'
        // and 'alias' is empty, or if 'ptr' is already managed by a managed
        // pointer other than 'alias'.  Note that this establishes a managed
        // pointer where 'ptr' aliases 'alias'.  The managed object for 'alias'
        // will ultimately be destroyed, and the destructor for 'ptr' is not
        // called directly.

    ManagedPtr_PairProxy<TARGET_TYPE, ManagedPtrDeleter> release();
        // Return a raw pointer to the current target object (if any) and the
        // deleter for the currently managed object, and reset this managed
        // pointer to empty.  It is undefined behavior to run the returned
        // deleter unless the returned pointer to target object is not null.

    TARGET_TYPE *release(ManagedPtrDeleter *deleter);
        // Load the specified 'deleter' for the currently managed object and
        // reset this managed pointer to empty.  Return a raw pointer to the
        // target object (if any) managed by this pointer.  It is undefined
        // behavior to run the returned deleter unless the returned pointer to
        // target object is not null.

    void reset();
        // Destroy the current managed object (if any) and reset this managed
        // pointer to empty.

    void swap(ManagedPtr& other);
        // Exchange the value and ownership of this managed pointer with the
        // specified 'other' managed pointer.

    // ACCESSORS
    operator BoolType() const;
        // Return a value of "unspecified bool" type that evaluates to 'false'
        // if this managed pointer is empty, and 'true' otherwise.  Note that
        // this conversion operator allows a managed pointer to be used within
        // a conditional context, such as within an 'if' or 'while' statement,
        // but does *not* allow managed pointers to be compared (e.g., via '<'
        // or '>').  Also note that a superior solution is available in C++11
        // using the 'explicit operator bool()' syntax, that removes the need
        // for a special boolean-like type and private equality-comparison
        // operators.

    typename bslmf::AddReference<TARGET_TYPE>::Type operator*() const;
        // Return a reference to the target object.  The behavior is undefined
        // if this managed pointer is empty, or if 'TARGET_TYPE' is 'void' or
        // 'const void'.

    TARGET_TYPE *operator->() const;
        // Return the address of the target object, or 0 if this managed
        // pointer is empty.

    const ManagedPtrDeleter& deleter() const;
        // Return a reference to the non-modifiable deleter information
        // associated with this managed pointer.  The behavior is undefined if
        // this managed pointer is empty.

    TARGET_TYPE *get() const;
        // Return the address of the target object, or 0 if this managed
        // pointer is empty.

    TARGET_TYPE *ptr() const;
        // [!DEPRECATED!]: Use 'get' instead.
        //
        // Return the address of the target object, or 0 if this managed
        // pointer is empty.
};

// FREE FUNCTIONS
template <class TARGET_TYPE>
void swap(ManagedPtr<TARGET_TYPE>& a, ManagedPtr<TARGET_TYPE>& b);
    // Efficiently exchange the values of the specified 'a' and 'b' objects.
    // This function provides the no-throw exception-safety guarantee.

                        // =====================
                        // struct ManagedPtrUtil
                        // =====================

struct ManagedPtrUtil {
    // This utility class provides a general no-op deleter, which is useful
    // when creating managed pointers to stack-allocated objects.

    // CLASS METHODS
    static void noOpDeleter(void *, void *);
        // Deleter function that does nothing.

#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
// {{{ BEGIN GENERATED CODE
// Command line: sim_cpp11_features.pl bslma_managedptr.h
#ifndef BSLMA_MANAGEDPTR_VARIADIC_LIMIT
#define BSLMA_MANAGEDPTR_VARIADIC_LIMIT 14
#endif
#ifndef BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A
#define BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A BSLMA_MANAGEDPTR_VARIADIC_LIMIT
#endif

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 0
    template <class ELEMENT_TYPE>
    static ManagedPtr<ELEMENT_TYPE> allocateManaged(
                                              bslma::Allocator *basicAllocator);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 0

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 1
    template <class ELEMENT_TYPE, class ARGS_01>
    static ManagedPtr<ELEMENT_TYPE> allocateManaged(
                                              bslma::Allocator *basicAllocator,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 1

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 2
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02>
    static ManagedPtr<ELEMENT_TYPE> allocateManaged(
                                              bslma::Allocator *basicAllocator,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 2

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 3
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03>
    static ManagedPtr<ELEMENT_TYPE> allocateManaged(
                                              bslma::Allocator *basicAllocator,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 3

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 4
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04>
    static ManagedPtr<ELEMENT_TYPE> allocateManaged(
                                              bslma::Allocator *basicAllocator,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 4

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 5
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05>
    static ManagedPtr<ELEMENT_TYPE> allocateManaged(
                                              bslma::Allocator *basicAllocator,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 5

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 6
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05,
                                  class ARGS_06>
    static ManagedPtr<ELEMENT_TYPE> allocateManaged(
                                              bslma::Allocator *basicAllocator,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 6

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 7
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05,
                                  class ARGS_06,
                                  class ARGS_07>
    static ManagedPtr<ELEMENT_TYPE> allocateManaged(
                                              bslma::Allocator *basicAllocator,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 7

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 8
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05,
                                  class ARGS_06,
                                  class ARGS_07,
                                  class ARGS_08>
    static ManagedPtr<ELEMENT_TYPE> allocateManaged(
                                              bslma::Allocator *basicAllocator,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 8

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 9
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05,
                                  class ARGS_06,
                                  class ARGS_07,
                                  class ARGS_08,
                                  class ARGS_09>
    static ManagedPtr<ELEMENT_TYPE> allocateManaged(
                                              bslma::Allocator *basicAllocator,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 9

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 10
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05,
                                  class ARGS_06,
                                  class ARGS_07,
                                  class ARGS_08,
                                  class ARGS_09,
                                  class ARGS_10>
    static ManagedPtr<ELEMENT_TYPE> allocateManaged(
                                              bslma::Allocator *basicAllocator,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 10

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 11
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05,
                                  class ARGS_06,
                                  class ARGS_07,
                                  class ARGS_08,
                                  class ARGS_09,
                                  class ARGS_10,
                                  class ARGS_11>
    static ManagedPtr<ELEMENT_TYPE> allocateManaged(
                                              bslma::Allocator *basicAllocator,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) args_11);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 11

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 12
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05,
                                  class ARGS_06,
                                  class ARGS_07,
                                  class ARGS_08,
                                  class ARGS_09,
                                  class ARGS_10,
                                  class ARGS_11,
                                  class ARGS_12>
    static ManagedPtr<ELEMENT_TYPE> allocateManaged(
                                              bslma::Allocator *basicAllocator,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) args_11,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) args_12);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 12

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 13
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05,
                                  class ARGS_06,
                                  class ARGS_07,
                                  class ARGS_08,
                                  class ARGS_09,
                                  class ARGS_10,
                                  class ARGS_11,
                                  class ARGS_12,
                                  class ARGS_13>
    static ManagedPtr<ELEMENT_TYPE> allocateManaged(
                                              bslma::Allocator *basicAllocator,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) args_11,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) args_12,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) args_13);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 13

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 14
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05,
                                  class ARGS_06,
                                  class ARGS_07,
                                  class ARGS_08,
                                  class ARGS_09,
                                  class ARGS_10,
                                  class ARGS_11,
                                  class ARGS_12,
                                  class ARGS_13,
                                  class ARGS_14>
    static ManagedPtr<ELEMENT_TYPE> allocateManaged(
                                              bslma::Allocator *basicAllocator,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) args_11,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) args_12,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) args_13,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) args_14);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 14


#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 0
    template <class ELEMENT_TYPE>
    static ManagedPtr<ELEMENT_TYPE> makeManaged(
                              );
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 0

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 1
    template <class ELEMENT_TYPE, class ARGS_01>
    static ManagedPtr<ELEMENT_TYPE> makeManaged(
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 1

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 2
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02>
    static ManagedPtr<ELEMENT_TYPE> makeManaged(
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 2

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 3
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03>
    static ManagedPtr<ELEMENT_TYPE> makeManaged(
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 3

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 4
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04>
    static ManagedPtr<ELEMENT_TYPE> makeManaged(
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 4

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 5
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05>
    static ManagedPtr<ELEMENT_TYPE> makeManaged(
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 5

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 6
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05,
                                  class ARGS_06>
    static ManagedPtr<ELEMENT_TYPE> makeManaged(
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 6

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 7
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05,
                                  class ARGS_06,
                                  class ARGS_07>
    static ManagedPtr<ELEMENT_TYPE> makeManaged(
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 7

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 8
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05,
                                  class ARGS_06,
                                  class ARGS_07,
                                  class ARGS_08>
    static ManagedPtr<ELEMENT_TYPE> makeManaged(
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 8

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 9
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05,
                                  class ARGS_06,
                                  class ARGS_07,
                                  class ARGS_08,
                                  class ARGS_09>
    static ManagedPtr<ELEMENT_TYPE> makeManaged(
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 9

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 10
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05,
                                  class ARGS_06,
                                  class ARGS_07,
                                  class ARGS_08,
                                  class ARGS_09,
                                  class ARGS_10>
    static ManagedPtr<ELEMENT_TYPE> makeManaged(
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 10

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 11
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05,
                                  class ARGS_06,
                                  class ARGS_07,
                                  class ARGS_08,
                                  class ARGS_09,
                                  class ARGS_10,
                                  class ARGS_11>
    static ManagedPtr<ELEMENT_TYPE> makeManaged(
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) args_11);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 11

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 12
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05,
                                  class ARGS_06,
                                  class ARGS_07,
                                  class ARGS_08,
                                  class ARGS_09,
                                  class ARGS_10,
                                  class ARGS_11,
                                  class ARGS_12>
    static ManagedPtr<ELEMENT_TYPE> makeManaged(
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) args_11,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) args_12);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 12

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 13
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05,
                                  class ARGS_06,
                                  class ARGS_07,
                                  class ARGS_08,
                                  class ARGS_09,
                                  class ARGS_10,
                                  class ARGS_11,
                                  class ARGS_12,
                                  class ARGS_13>
    static ManagedPtr<ELEMENT_TYPE> makeManaged(
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) args_11,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) args_12,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) args_13);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 13

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 14
    template <class ELEMENT_TYPE, class ARGS_01,
                                  class ARGS_02,
                                  class ARGS_03,
                                  class ARGS_04,
                                  class ARGS_05,
                                  class ARGS_06,
                                  class ARGS_07,
                                  class ARGS_08,
                                  class ARGS_09,
                                  class ARGS_10,
                                  class ARGS_11,
                                  class ARGS_12,
                                  class ARGS_13,
                                  class ARGS_14>
    static ManagedPtr<ELEMENT_TYPE> makeManaged(
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) args_11,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) args_12,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) args_13,
                           BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) args_14);
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 14

#else
// The generated code below is a workaround for the absence of perfect
// forwarding in some compilers.

    template <class ELEMENT_TYPE, class... ARGS>
    static ManagedPtr<ELEMENT_TYPE> allocateManaged(
                                              bslma::Allocator *basicAllocator,
                              BSLS_COMPILERFEATURES_FORWARD_REF(ARGS)... args);

    template <class ELEMENT_TYPE, class... ARGS>
    static ManagedPtr<ELEMENT_TYPE> makeManaged(
                              BSLS_COMPILERFEATURES_FORWARD_REF(ARGS)... args);

// }}} END GENERATED CODE
#endif
};

                     // ===========================
                     // struct ManagedPtrNilDeleter
                     // ===========================

template <class TARGET_TYPE>
struct ManagedPtrNilDeleter {
    // [!DEPRECATED!]: Use 'ManagedPtrUtil::noOpDeleter' instead.
    //
    // This utility class provides a general no-op deleter, which is useful
    // when creating managed pointers to stack-allocated objects.  Note that
    // the non-template class 'ManagedPtrUtil' should be used in preference to
    // this deprecated class, avoiding both template bloat and undefined
    // behavior.

    // CLASS METHODS
    static void deleter(void *, void *);
        // Deleter function that does nothing.
};

             // ===========================================
             // private class ManagedPtr_FactoryDeleterType
             // ===========================================

template <class TARGET_TYPE, class FACTORY_TYPE>
struct ManagedPtr_FactoryDeleterType
    : bsl::conditional<
                 bsl::is_convertible<FACTORY_TYPE *, Allocator *>::value,
                 ManagedPtr_FactoryDeleter<TARGET_TYPE, Allocator>,
                 ManagedPtr_FactoryDeleter<TARGET_TYPE, FACTORY_TYPE> > {
    // This metafunction class-template provides a means to compute the
    // preferred deleter function for a factory class for those methods of
    // 'ManagedPtr' that supply only a factory, and no additional deleter
    // function.  The intent is to use a common deleter function for all
    // allocators that implement the 'bslma::Allocator' protocol, rather than
    // create a special deleter function based on the complete type of each
    // allocator, each doing the same thing (invoking the virtual function
    // 'deleteObject').
};

              // ========================================
              // private struct ManagedPtr_DefaultDeleter
              // ========================================

template <class MANAGED_TYPE>
struct ManagedPtr_DefaultDeleter {
    // This 'struct' provides a function-like managed pointer deleter that
    // invokes 'delete' with the passed pointer.

    // CLASS METHODS
    static void deleter(void *ptr, void *);
        // Cast the specified 'ptr' to (template parameter) type
        // 'MANAGED_TYPE *', and then call 'delete' with the cast pointer.
};


// ============================================================================
//                          INLINE DEFINITIONS
// ============================================================================

                      // ---------------------------------
                      // private struct ManagedPtr_ImpUtil
                      // ---------------------------------

// CLASS METHODS
template <class TYPE>
inline
void *ManagedPtr_ImpUtil::voidify(TYPE *address) BSLS_KEYWORD_NOEXCEPT
{
    return static_cast<void *>(
            const_cast<typename bsl::remove_cv<TYPE>::type *>(address));
}

template <class TYPE>
inline
TYPE *ManagedPtr_ImpUtil::unqualify(const volatile TYPE *address)
                                                          BSLS_KEYWORD_NOEXCEPT
{
    return const_cast<TYPE *>(address);
}

                      // ----------------------------
                      // private class ManagedPtr_Ref
                      // ----------------------------

// CREATORS
template <class TARGET_TYPE>
inline
ManagedPtr_Ref<TARGET_TYPE>::ManagedPtr_Ref(ManagedPtr_Members *base,
                                            TARGET_TYPE        *target)
: d_base_p(base)
, d_cast_p(target)
{
    BSLS_ASSERT_SAFE(0 != base);
}

template <class TARGET_TYPE>
inline
ManagedPtr_Ref<TARGET_TYPE>::~ManagedPtr_Ref()
{
    BSLS_ASSERT_SAFE(0 != d_base_p);
}

// ACCESSORS
template <class TARGET_TYPE>
inline
ManagedPtr_Members *ManagedPtr_Ref<TARGET_TYPE>::base() const
{
    return d_base_p;
}

template <class TARGET_TYPE>
inline
TARGET_TYPE *ManagedPtr_Ref<TARGET_TYPE>::target() const
{
    return d_cast_p;
}

                           // ----------------
                           // class ManagedPtr
                           // ----------------

template <class TARGET_TYPE>
class ManagedPtr<volatile TARGET_TYPE>;
    // This specialization is declared but not defined, in order to provide an
    // early compile-fail check to catch misuse of managed pointer to
    // 'volatile' types, which is explicitly called out as not supported in the
    // primary class template contract.

template <class TARGET_TYPE>
class ManagedPtr<TARGET_TYPE&>;
    // This specialization is declared but not defined, in order to provide an
    // early compile-fail check to catch misuse of managed pointer to reference
    // types, which is explicitly called out as not supported in the primary
    // class template contract.

#if defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES)
template <class TARGET_TYPE>
class ManagedPtr<TARGET_TYPE&&>;
    // This specialization is declared but not defined, in order to provide an
    // early compile-fail check to catch misuse of managed pointer to reference
    // types, which is explicitly called out as not supported in the primary
    // class template contract.
#endif

// PRIVATE CLASS METHODS
template <class TARGET_TYPE>
inline
void *ManagedPtr<TARGET_TYPE>::stripBasePointerType(TARGET_TYPE *ptr)
{
    return const_cast<void *>(static_cast<const void *>(ptr));
}

template <class TARGET_TYPE>
template <class MANAGED_TYPE>
inline
void *
ManagedPtr<TARGET_TYPE>::stripCompletePointerType(MANAGED_TYPE *ptr)
{
    return const_cast<void *>(static_cast<const void *>(ptr));
}

// PRIVATE MANIPULATORS
template <class TARGET_TYPE>
template <class MANAGED_TYPE>
inline
void ManagedPtr<TARGET_TYPE>::loadImp(MANAGED_TYPE *ptr,
                                      void         *cookie,
                                      DeleterFunc   deleter)
{
    BSLMF_ASSERT((bsl::is_convertible<MANAGED_TYPE *, TARGET_TYPE *>::value));
    BSLS_ASSERT_SAFE(0 != deleter || 0 == ptr);

    d_members.runDeleter();
    d_members.set(stripCompletePointerType(ptr), cookie, deleter);
    d_members.setAliasPtr(stripBasePointerType(ptr));
}

// CREATORS
template <class TARGET_TYPE>
inline
ManagedPtr<TARGET_TYPE>::ManagedPtr()
: d_members()
{
}

template <class TARGET_TYPE>
template <class MANAGED_TYPE>
inline
ManagedPtr<TARGET_TYPE>::ManagedPtr(MANAGED_TYPE *ptr)
: d_members(stripCompletePointerType(ptr),
            0,
            &ManagedPtr_DefaultDeleter<MANAGED_TYPE>::deleter,
            stripBasePointerType(ptr))
{
    BSLMF_ASSERT((bsl::is_convertible<MANAGED_TYPE *, TARGET_TYPE *>::VALUE));
}

template <class TARGET_TYPE>
inline
ManagedPtr<TARGET_TYPE>::ManagedPtr(ManagedPtr_Ref<TARGET_TYPE> ref)
                                                          BSLS_KEYWORD_NOEXCEPT
: d_members(*ref.base())
{
    d_members.setAliasPtr(stripBasePointerType(ref.target()));
}

template <class TARGET_TYPE>
inline
ManagedPtr<TARGET_TYPE>::ManagedPtr(ManagedPtr& original) BSLS_KEYWORD_NOEXCEPT
: d_members(original.d_members)
{
}

template <class TARGET_TYPE>
inline
ManagedPtr<TARGET_TYPE>::ManagedPtr(bslmf::MovableRef<ManagedPtr> original)
                                                          BSLS_KEYWORD_NOEXCEPT
: d_members(MoveUtil::access(original).d_members)
{
}

#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
    template <class TARGET_TYPE>
    template <class BDE_OTHER_TYPE>
    inline
    ManagedPtr<TARGET_TYPE>::ManagedPtr(
            ManagedPtr<BDE_OTHER_TYPE> &&original,
            typename bsl::enable_if<bsl::is_convertible<BDE_OTHER_TYPE *,
                                                        TARGET_TYPE *>::value,
                                    ManagedPtr_TraitConstraint>::type)
        BSLS_KEYWORD_NOEXCEPT
    : d_members(original.d_members)
#elif defined(BSLS_PLATFORM_CMP_SUN) && BSLS_PLATFORM_CMP_VERSION < 0x5130
    // sun compiler version 12.3 and earlier
    template <class TARGET_TYPE>
    template <class BDE_OTHER_TYPE>
    inline
    ManagedPtr<TARGET_TYPE>::ManagedPtr(
            bslmf::MovableRef<ManagedPtr<BDE_OTHER_TYPE> > original)
        BSLS_KEYWORD_NOEXCEPT
    : d_members(MoveUtil::access(original).d_members)
#else // c++03 except old (version <= 12.3) sun compilers
    template <class TARGET_TYPE>
    template <class BDE_OTHER_TYPE>
    inline
    ManagedPtr<TARGET_TYPE>::ManagedPtr(
            bslmf::MovableRef<ManagedPtr<BDE_OTHER_TYPE> > original,
            typename bsl::enable_if<bsl::is_convertible<BDE_OTHER_TYPE *,
                                                        TARGET_TYPE *>::value,
                                    ManagedPtr_TraitConstraint>::type)
        BSLS_KEYWORD_NOEXCEPT
    : d_members(MoveUtil::access(original).d_members)
#endif
{
    // This constructor cannot be constrained using a type trait on old Sun
    // compilers (version <= 12.3), so we need the check here.
    #if defined(BSLS_PLATFORM_CMP_SUN) && BSLS_PLATFORM_CMP_VERSION < 0x5130
        BSLMF_ASSERT((bsl::is_convertible<BDE_OTHER_TYPE *,
                                          TARGET_TYPE *>::VALUE));
    #endif

    // To deal with the possibility of multiple inheritance, we need to
    // "correct" the target pointer.
    d_members.setAliasPtr(
        stripBasePointerType(
            static_cast<TARGET_TYPE *>(
                static_cast<BDE_OTHER_TYPE *>(
                    d_members.pointer()))));
}


template <class TARGET_TYPE>
template <class ALIASED_TYPE>
inline
ManagedPtr<TARGET_TYPE>::ManagedPtr(ManagedPtr<ALIASED_TYPE>&  alias,
                                    TARGET_TYPE               *ptr)
: d_members()
{
    BSLS_ASSERT_SAFE(0 != alias.get() || 0 == ptr);

    if (0 != ptr) {
        d_members.move(&alias.d_members);
        d_members.setAliasPtr(stripBasePointerType(ptr));
    }
}

template <class TARGET_TYPE>
template <class ALIASED_TYPE>
inline
ManagedPtr<TARGET_TYPE>::ManagedPtr(
#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
                           ManagedPtr<ALIASED_TYPE>&&                    alias,
#else
                           bslmf::MovableRef<ManagedPtr<ALIASED_TYPE> >  alias,
#endif
                           TARGET_TYPE                                  *ptr)
: d_members()
{
    ManagedPtr<ALIASED_TYPE>& lvalue = alias;

    BSLS_ASSERT_SAFE(0 != lvalue.get() || 0 == ptr);

    if (0 != ptr) {
        d_members.move(&lvalue.d_members);
        d_members.setAliasPtr(stripBasePointerType(ptr));
    }
}

template <class TARGET_TYPE>
template <class MANAGED_TYPE, class FACTORY_TYPE>
inline
ManagedPtr<TARGET_TYPE>::ManagedPtr(MANAGED_TYPE *ptr, FACTORY_TYPE *factory)
: d_members(stripCompletePointerType(ptr),
            factory,
            &ManagedPtr_FactoryDeleterType<MANAGED_TYPE,
                                           FACTORY_TYPE>::type::deleter,
            stripBasePointerType(ptr))
{
    BSLMF_ASSERT((bsl::is_convertible<MANAGED_TYPE *, TARGET_TYPE *>::value));
    BSLS_ASSERT_SAFE(0 != factory || 0 == ptr);
}

template <class TARGET_TYPE>
inline
ManagedPtr<TARGET_TYPE>::ManagedPtr(bsl::nullptr_t, bsl::nullptr_t)
: d_members()
{
}

template <class TARGET_TYPE>
template <class FACTORY_TYPE>
inline
ManagedPtr<TARGET_TYPE>::ManagedPtr(bsl::nullptr_t, FACTORY_TYPE *)
: d_members()
{
}

template <class TARGET_TYPE>
inline
ManagedPtr<TARGET_TYPE>::ManagedPtr(TARGET_TYPE *ptr,
                                    void        *cookie,
                                    DeleterFunc  deleter)
: d_members(stripBasePointerType(ptr), cookie, deleter)
{
    BSLS_ASSERT_SAFE(0 != deleter || 0 == ptr);
}

template <class TARGET_TYPE>
template <class MANAGED_TYPE>
inline
ManagedPtr<TARGET_TYPE>::ManagedPtr(MANAGED_TYPE *ptr,
                                    void         *cookie,
                                    DeleterFunc   deleter)
: d_members(stripCompletePointerType(ptr),
            cookie,
            deleter,
            stripBasePointerType(ptr))
{
    BSLMF_ASSERT((bsl::is_convertible<MANAGED_TYPE *, TARGET_TYPE *>::value));

    BSLS_ASSERT_SAFE(0 != deleter || 0 == ptr);
}

#ifndef BDE_OMIT_INTERNAL_DEPRECATED
template <class TARGET_TYPE>
template <class MANAGED_TYPE, class MANAGED_BASE>
inline
ManagedPtr<TARGET_TYPE>::ManagedPtr(
                                MANAGED_TYPE *ptr,
                                void         *cookie,
                                void        (*deleter)(MANAGED_BASE *, void *))
: d_members(stripCompletePointerType(ptr),
            cookie,
            reinterpret_cast<DeleterFunc>(deleter),
            stripBasePointerType(ptr))
{
    BSLMF_ASSERT((bsl::is_convertible<MANAGED_TYPE *, TARGET_TYPE *>::value));
    BSLMF_ASSERT((bsl::is_convertible<MANAGED_TYPE *,
                                      const MANAGED_BASE *>::value));

    BSLS_ASSERT_SAFE(0 != deleter || 0 == ptr);
}

template <class TARGET_TYPE>
template <class MANAGED_TYPE,
          class MANAGED_BASE,
          class COOKIE_TYPE,
          class COOKIE_BASE>
inline
ManagedPtr<TARGET_TYPE>::ManagedPtr(
                         MANAGED_TYPE *ptr,
                         COOKIE_TYPE  *cookie,
                         void        (*deleter)(MANAGED_BASE *, COOKIE_BASE *))
: d_members(stripCompletePointerType(ptr),
            static_cast<COOKIE_BASE *>(cookie),
            reinterpret_cast<DeleterFunc>(deleter),
            stripBasePointerType(ptr))
{
    BSLMF_ASSERT((bsl::is_convertible<MANAGED_TYPE *, TARGET_TYPE *>::value));
    BSLMF_ASSERT((bsl::is_convertible<MANAGED_TYPE *,
                                      const MANAGED_BASE *>::value));
    BSLMF_ASSERT((bsl::is_convertible<COOKIE_TYPE *, COOKIE_BASE *>::value));

    // Note that the undefined behavior embodied in the 'reinterpret_cast'
    // above could be removed by inserting an additional forwarding function
    // truly of type 'DeleterFunc' which 'reinterpret_cast's each pointer
    // argument as part of its forwarding behavior.  We choose not to do this
    // on the grounds of simple efficiency, and there is currently no known
    // supported compiler that we use where this does not work as desired.

    BSLS_ASSERT_SAFE(0 != deleter || 0 == ptr);
}
#endif // BDE_OMIT_INTERNAL_DEPRECATED

template <class TARGET_TYPE>
inline
ManagedPtr<TARGET_TYPE>::~ManagedPtr()
{
    d_members.runDeleter();
}

// MANIPULATORS
template <class TARGET_TYPE>
inline
ManagedPtr<TARGET_TYPE>&
ManagedPtr<TARGET_TYPE>::operator=(ManagedPtr& rhs)       BSLS_KEYWORD_NOEXCEPT
{
    d_members.moveAssign(&rhs.d_members);
    return *this;
}

template <class TARGET_TYPE>
inline
ManagedPtr<TARGET_TYPE>&
ManagedPtr<TARGET_TYPE>::operator=(bslmf::MovableRef<ManagedPtr> rhs)
                                                          BSLS_KEYWORD_NOEXCEPT
{
    ManagedPtr& lvalue = rhs;
    d_members.moveAssign(&lvalue.d_members);
    return *this;
}

#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
    template <class TARGET_TYPE>
    template <class BDE_OTHER_TYPE>
    inline
    typename bsl::enable_if<
        bsl::is_convertible<BDE_OTHER_TYPE*, TARGET_TYPE*>::value,
        ManagedPtr<TARGET_TYPE> >::type&
    ManagedPtr<TARGET_TYPE>::operator =(
            ManagedPtr<BDE_OTHER_TYPE>&& rhs) BSLS_KEYWORD_NOEXCEPT
#elif defined(BSLS_PLATFORM_CMP_SUN) && BSLS_PLATFORM_CMP_VERSION < 0x5130
    // sun compiler version 12.3 and earlier
    template <class TARGET_TYPE>
    template <class BDE_OTHER_TYPE>
    inline
    ManagedPtr<TARGET_TYPE>&
    ManagedPtr<TARGET_TYPE>::operator =(
          bslmf::MovableRef<ManagedPtr<BDE_OTHER_TYPE> > rhs)
        BSLS_KEYWORD_NOEXCEPT
#else // c++03 except old (version <= 12.3) sun compilers
    template <class TARGET_TYPE>
    template <class BDE_OTHER_TYPE>
    inline
    typename bsl::enable_if<
        bsl::is_convertible<BDE_OTHER_TYPE *, TARGET_TYPE *>::value,
        ManagedPtr<TARGET_TYPE> >::type&
    ManagedPtr<TARGET_TYPE>::operator =(
          bslmf::MovableRef<ManagedPtr<BDE_OTHER_TYPE> > rhs)
        BSLS_KEYWORD_NOEXCEPT
#endif
{
    // This operator cannot be constrained using a type trait on Sun, so we
    // need the check here.
    #if defined(BSLS_PLATFORM_CMP_SUN) && BSLS_PLATFORM_CMP_VERSION < 0x5130
        BSLMF_ASSERT((bsl::is_convertible<BDE_OTHER_TYPE *,
                                          TARGET_TYPE *>::VALUE));
    #endif

    ManagedPtr<BDE_OTHER_TYPE>& lvalue = rhs;
    d_members.moveAssign(&lvalue.d_members);

    // To deal with the possibility of multiple inheritance, we need to
    // "correct" the target pointer.
    d_members.setAliasPtr(
        stripBasePointerType(
            static_cast<TARGET_TYPE *>(
                static_cast<BDE_OTHER_TYPE *>(
                    d_members.pointer()))));

    return *this;
}

template <class TARGET_TYPE>
inline
ManagedPtr<TARGET_TYPE>&
ManagedPtr<TARGET_TYPE>::operator=(ManagedPtr_Ref<TARGET_TYPE> ref)
                                                          BSLS_KEYWORD_NOEXCEPT
{
    d_members.moveAssign(ref.base());
    d_members.setAliasPtr(stripBasePointerType(ref.target()));
    return *this;
}

template <class TARGET_TYPE>
inline
ManagedPtr<TARGET_TYPE>&
ManagedPtr<TARGET_TYPE>::operator=(bsl::nullptr_t)
{
    this->reset();
    return *this;
}

template <class TARGET_TYPE>
template <class REFERENCED_TYPE>
inline
ManagedPtr<TARGET_TYPE>::operator ManagedPtr_Ref<REFERENCED_TYPE>()
{
    BSLMF_ASSERT((bsl::is_convertible<TARGET_TYPE *,
                                      REFERENCED_TYPE *>::VALUE));

    return ManagedPtr_Ref<REFERENCED_TYPE>(&d_members,
                             static_cast<REFERENCED_TYPE *>(
                             static_cast<TARGET_TYPE *>(d_members.pointer())));
}

template <class TARGET_TYPE>
inline
void ManagedPtr<TARGET_TYPE>::clear()
{
    reset();
}

template <class TARGET_TYPE>
template <class MANAGED_TYPE>
inline
void ManagedPtr<TARGET_TYPE>::load(MANAGED_TYPE *ptr)
{
    BSLMF_ASSERT((bsl::is_convertible<MANAGED_TYPE *, TARGET_TYPE *>::value));

    typedef ManagedPtr_FactoryDeleter<MANAGED_TYPE, Allocator> DeleterFactory;
    this->loadImp(ptr,
                  static_cast<void *>(Default::allocator()),
                  &DeleterFactory::deleter);
}

template <class TARGET_TYPE>
template <class MANAGED_TYPE, class FACTORY_TYPE>
inline
void ManagedPtr<TARGET_TYPE>::load(MANAGED_TYPE *ptr, FACTORY_TYPE *factory)
{
    BSLMF_ASSERT((bsl::is_convertible<MANAGED_TYPE *, TARGET_TYPE *>::value));
    BSLS_ASSERT_SAFE(0 != factory || 0 == ptr);

    typedef typename
    ManagedPtr_FactoryDeleterType<MANAGED_TYPE, FACTORY_TYPE>::type
                                                                DeleterFactory;

    this->loadImp(ptr, static_cast<void *>(factory), &DeleterFactory::deleter);
}

template <class TARGET_TYPE>
template <class MANAGED_TYPE>
inline
void ManagedPtr<TARGET_TYPE>::load(MANAGED_TYPE *ptr,
                                   void         *cookie,
                                   DeleterFunc   deleter)
{
    BSLMF_ASSERT((bsl::is_convertible<MANAGED_TYPE *, TARGET_TYPE *>::value));
    BSLS_ASSERT_SAFE(0 != deleter || 0 == ptr);

    this->loadImp(ptr, cookie, deleter);
}

template <class TARGET_TYPE>
inline
void ManagedPtr<TARGET_TYPE>::load(bsl::nullptr_t, void *, DeleterFunc)
{
    this->reset();
}

#ifndef BDE_OMIT_INTERNAL_DEPRECATED
template <class TARGET_TYPE>
template <class MANAGED_TYPE, class COOKIE_TYPE>
inline
void ManagedPtr<TARGET_TYPE>::load(MANAGED_TYPE *ptr,
                                   COOKIE_TYPE  *cookie,
                                   DeleterFunc   deleter)
{
    BSLMF_ASSERT((bsl::is_convertible<MANAGED_TYPE *, TARGET_TYPE *>::value));
    BSLS_ASSERT_SAFE(0 != deleter || 0 == ptr);

    this->loadImp(ptr, static_cast<void *>(cookie), deleter);
}

template <class TARGET_TYPE>
template <class MANAGED_TYPE, class MANAGED_BASE>
inline
void ManagedPtr<TARGET_TYPE>::load(
                                MANAGED_TYPE *ptr,
                                void         *cookie,
                                void        (*deleter)(MANAGED_BASE *, void *))
{
    BSLMF_ASSERT((bsl::is_convertible<MANAGED_TYPE *, TARGET_TYPE *>::VALUE));
    BSLMF_ASSERT((!bsl::is_void<MANAGED_BASE>::value));
    BSLMF_ASSERT((bsl::is_convertible<MANAGED_TYPE *, MANAGED_BASE *>::value));
    BSLS_ASSERT_SAFE(0 != deleter || 0 == ptr);

    this->loadImp(ptr, cookie, reinterpret_cast<DeleterFunc>(deleter));
}

template <class TARGET_TYPE>
template <class MANAGED_TYPE,
          class MANAGED_BASE,
          class COOKIE_TYPE,
          class COOKIE_BASE>
inline
void ManagedPtr<TARGET_TYPE>::load(
                         MANAGED_TYPE *ptr,
                         COOKIE_TYPE  *cookie,
                         void        (*deleter)(MANAGED_BASE *, COOKIE_BASE *))
{
    BSLMF_ASSERT((bsl::is_convertible<MANAGED_TYPE *, TARGET_TYPE *>::VALUE));
    BSLMF_ASSERT((bsl::is_convertible<MANAGED_TYPE *, MANAGED_BASE *>::VALUE));
    BSLMF_ASSERT((bsl::is_convertible<COOKIE_TYPE *, COOKIE_BASE *>::VALUE));
    BSLS_ASSERT_SAFE(0 != deleter || 0 == ptr);

    this->loadImp(ptr,
                  static_cast<void *>(static_cast<COOKIE_BASE *>(cookie)),
                  reinterpret_cast<DeleterFunc>(deleter));
}
#endif // BDE_OMIT_INTERNAL_DEPRECATED

template <class TARGET_TYPE>
template <class ALIASED_TYPE>
void ManagedPtr<TARGET_TYPE>::loadAlias(ManagedPtr<ALIASED_TYPE>&  alias,
                                        TARGET_TYPE               *ptr)
{
    BSLS_ASSERT_SAFE(!ptr == !alias.get());  // both null or both non-null

    if (ptr && alias.d_members.pointer()) {
        d_members.moveAssign(&alias.d_members);
        d_members.setAliasPtr(stripBasePointerType(ptr));
    }
    else {
        d_members.runDeleter();
        d_members.clear();
    }
}

template <class TARGET_TYPE>
ManagedPtr_PairProxy<TARGET_TYPE, ManagedPtrDeleter>
ManagedPtr<TARGET_TYPE>::release()
{
    typedef ManagedPtr_PairProxy<TARGET_TYPE, ManagedPtrDeleter> ResultType;

    TARGET_TYPE *p = get();

    // The behavior would be undefined if 'd_members.deleter()' were called
    // when 'p' is null.

    if (p) {
        ResultType result = { p, d_members.deleter() };
        d_members.clear();
        return result;                                                // RETURN
    }
    ResultType result = { p, ManagedPtrDeleter() };
    return result;
}

template <class TARGET_TYPE>
TARGET_TYPE *ManagedPtr<TARGET_TYPE>::release(ManagedPtrDeleter *deleter)
{
    BSLS_ASSERT_SAFE(deleter);

    TARGET_TYPE *result = get();

    // The behavior is undefined if 'd_members.deleter()' is called when
    // 'result' is null.

    if (result) {
        *deleter = d_members.deleter();
        d_members.clear();
    }
    return result;
}

template <class TARGET_TYPE>
inline
void ManagedPtr<TARGET_TYPE>::reset()
{
    d_members.runDeleter();
    d_members.clear();
}

template <class TARGET_TYPE>
inline
void ManagedPtr<TARGET_TYPE>::swap(ManagedPtr& other)
{
    d_members.swap(other.d_members);
}

// ACCESSORS
template <class TARGET_TYPE>
inline
#if defined(BSLS_PLATFORM_CMP_IBM)      // last confirmed with xlC 12.1
ManagedPtr<TARGET_TYPE>::operator typename ManagedPtr::BoolType() const
#else
ManagedPtr<TARGET_TYPE>::operator BoolType() const
#endif
{
    return d_members.pointer()
           ? bsls::UnspecifiedBool<ManagedPtr>::trueValue()
           : bsls::UnspecifiedBool<ManagedPtr>::falseValue();
}

template <class TARGET_TYPE>
inline
typename bslmf::AddReference<TARGET_TYPE>::Type
ManagedPtr<TARGET_TYPE>::operator*() const
{
    BSLS_ASSERT_SAFE(d_members.pointer());

    return *static_cast<TARGET_TYPE *>(d_members.pointer());
}

template <class TARGET_TYPE>
inline
TARGET_TYPE *ManagedPtr<TARGET_TYPE>::operator->() const
{
    return static_cast<TARGET_TYPE *>(d_members.pointer());
}

template <class TARGET_TYPE>
inline
const ManagedPtrDeleter& ManagedPtr<TARGET_TYPE>::deleter() const
{
    BSLS_ASSERT_SAFE(d_members.pointer());

    return d_members.deleter();
}

template <class TARGET_TYPE>
inline
TARGET_TYPE *ManagedPtr<TARGET_TYPE>::get() const
{
    return static_cast<TARGET_TYPE *>(d_members.pointer());
}

template <class TARGET_TYPE>
inline
TARGET_TYPE *ManagedPtr<TARGET_TYPE>::ptr() const
{
    return get();
}

// FREE FUNCTIONS
template <class TARGET_TYPE>
inline
void swap(ManagedPtr<TARGET_TYPE>& a, ManagedPtr<TARGET_TYPE>& b)
{
    a.swap(b);
}

                      // --------------------
                      // class ManagedPtrUtil
                      // --------------------

#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
// {{{ BEGIN GENERATED CODE
// Command line: sim_cpp11_features.pl bslma_managedptr.h
#ifndef BSLMA_MANAGEDPTR_VARIADIC_LIMIT
#define BSLMA_MANAGEDPTR_VARIADIC_LIMIT 14
#endif
#ifndef BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B
#define BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B BSLMA_MANAGEDPTR_VARIADIC_LIMIT
#endif

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 0
template <class ELEMENT_TYPE>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::allocateManaged(
                                              bslma::Allocator *basicAllocator)
{
    bslma::Allocator *allocator = bslma::Default::allocator(basicAllocator);

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                                    allocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           allocator);
    bslma::ConstructionUtil::construct(
                                 ManagedPtr_ImpUtil::unqualify(objPtr),
                                 allocator);
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, allocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 0

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 1
template <class ELEMENT_TYPE, class ARGS_01>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::allocateManaged(
                                              bslma::Allocator *basicAllocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01)
{
    bslma::Allocator *allocator = bslma::Default::allocator(basicAllocator);

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                                    allocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           allocator);
    bslma::ConstructionUtil::construct(
                                 ManagedPtr_ImpUtil::unqualify(objPtr),
                                 allocator,
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, allocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 1

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 2
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::allocateManaged(
                                              bslma::Allocator *basicAllocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02)
{
    bslma::Allocator *allocator = bslma::Default::allocator(basicAllocator);

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                                    allocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           allocator);
    bslma::ConstructionUtil::construct(
                                 ManagedPtr_ImpUtil::unqualify(objPtr),
                                 allocator,
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, allocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 2

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 3
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::allocateManaged(
                                              bslma::Allocator *basicAllocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03)
{
    bslma::Allocator *allocator = bslma::Default::allocator(basicAllocator);

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                                    allocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           allocator);
    bslma::ConstructionUtil::construct(
                                 ManagedPtr_ImpUtil::unqualify(objPtr),
                                 allocator,
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, allocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 3

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 4
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::allocateManaged(
                                              bslma::Allocator *basicAllocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04)
{
    bslma::Allocator *allocator = bslma::Default::allocator(basicAllocator);

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                                    allocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           allocator);
    bslma::ConstructionUtil::construct(
                                 ManagedPtr_ImpUtil::unqualify(objPtr),
                                 allocator,
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, allocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 4

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 5
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::allocateManaged(
                                              bslma::Allocator *basicAllocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05)
{
    bslma::Allocator *allocator = bslma::Default::allocator(basicAllocator);

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                                    allocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           allocator);
    bslma::ConstructionUtil::construct(
                                 ManagedPtr_ImpUtil::unqualify(objPtr),
                                 allocator,
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, allocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 5

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 6
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05,
                              class ARGS_06>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::allocateManaged(
                                              bslma::Allocator *basicAllocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06)
{
    bslma::Allocator *allocator = bslma::Default::allocator(basicAllocator);

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                                    allocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           allocator);
    bslma::ConstructionUtil::construct(
                                 ManagedPtr_ImpUtil::unqualify(objPtr),
                                 allocator,
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, args_06));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, allocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 6

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 7
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05,
                              class ARGS_06,
                              class ARGS_07>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::allocateManaged(
                                              bslma::Allocator *basicAllocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07)
{
    bslma::Allocator *allocator = bslma::Default::allocator(basicAllocator);

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                                    allocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           allocator);
    bslma::ConstructionUtil::construct(
                                 ManagedPtr_ImpUtil::unqualify(objPtr),
                                 allocator,
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, args_06),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, args_07));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, allocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 7

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 8
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05,
                              class ARGS_06,
                              class ARGS_07,
                              class ARGS_08>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::allocateManaged(
                                              bslma::Allocator *basicAllocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08)
{
    bslma::Allocator *allocator = bslma::Default::allocator(basicAllocator);

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                                    allocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           allocator);
    bslma::ConstructionUtil::construct(
                                 ManagedPtr_ImpUtil::unqualify(objPtr),
                                 allocator,
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, args_06),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, args_07),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, args_08));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, allocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 8

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 9
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05,
                              class ARGS_06,
                              class ARGS_07,
                              class ARGS_08,
                              class ARGS_09>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::allocateManaged(
                                              bslma::Allocator *basicAllocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09)
{
    bslma::Allocator *allocator = bslma::Default::allocator(basicAllocator);

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                                    allocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           allocator);
    bslma::ConstructionUtil::construct(
                                 ManagedPtr_ImpUtil::unqualify(objPtr),
                                 allocator,
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, args_06),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, args_07),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, args_08),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, args_09));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, allocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 9

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 10
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05,
                              class ARGS_06,
                              class ARGS_07,
                              class ARGS_08,
                              class ARGS_09,
                              class ARGS_10>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::allocateManaged(
                                              bslma::Allocator *basicAllocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10)
{
    bslma::Allocator *allocator = bslma::Default::allocator(basicAllocator);

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                                    allocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           allocator);
    bslma::ConstructionUtil::construct(
                                 ManagedPtr_ImpUtil::unqualify(objPtr),
                                 allocator,
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, args_06),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, args_07),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, args_08),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, args_09),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_10, args_10));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, allocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 10

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 11
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05,
                              class ARGS_06,
                              class ARGS_07,
                              class ARGS_08,
                              class ARGS_09,
                              class ARGS_10,
                              class ARGS_11>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::allocateManaged(
                                              bslma::Allocator *basicAllocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) args_11)
{
    bslma::Allocator *allocator = bslma::Default::allocator(basicAllocator);

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                                    allocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           allocator);
    bslma::ConstructionUtil::construct(
                                 ManagedPtr_ImpUtil::unqualify(objPtr),
                                 allocator,
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, args_06),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, args_07),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, args_08),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, args_09),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_10, args_10),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_11, args_11));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, allocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 11

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 12
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05,
                              class ARGS_06,
                              class ARGS_07,
                              class ARGS_08,
                              class ARGS_09,
                              class ARGS_10,
                              class ARGS_11,
                              class ARGS_12>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::allocateManaged(
                                              bslma::Allocator *basicAllocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) args_11,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) args_12)
{
    bslma::Allocator *allocator = bslma::Default::allocator(basicAllocator);

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                                    allocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           allocator);
    bslma::ConstructionUtil::construct(
                                 ManagedPtr_ImpUtil::unqualify(objPtr),
                                 allocator,
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, args_06),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, args_07),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, args_08),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, args_09),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_10, args_10),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_11, args_11),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_12, args_12));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, allocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 12

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 13
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05,
                              class ARGS_06,
                              class ARGS_07,
                              class ARGS_08,
                              class ARGS_09,
                              class ARGS_10,
                              class ARGS_11,
                              class ARGS_12,
                              class ARGS_13>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::allocateManaged(
                                              bslma::Allocator *basicAllocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) args_11,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) args_12,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) args_13)
{
    bslma::Allocator *allocator = bslma::Default::allocator(basicAllocator);

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                                    allocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           allocator);
    bslma::ConstructionUtil::construct(
                                 ManagedPtr_ImpUtil::unqualify(objPtr),
                                 allocator,
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, args_06),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, args_07),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, args_08),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, args_09),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_10, args_10),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_11, args_11),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_12, args_12),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_13, args_13));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, allocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 13

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 14
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05,
                              class ARGS_06,
                              class ARGS_07,
                              class ARGS_08,
                              class ARGS_09,
                              class ARGS_10,
                              class ARGS_11,
                              class ARGS_12,
                              class ARGS_13,
                              class ARGS_14>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::allocateManaged(
                                              bslma::Allocator *basicAllocator,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) args_11,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) args_12,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) args_13,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) args_14)
{
    bslma::Allocator *allocator = bslma::Default::allocator(basicAllocator);

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                                    allocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           allocator);
    bslma::ConstructionUtil::construct(
                                 ManagedPtr_ImpUtil::unqualify(objPtr),
                                 allocator,
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, args_06),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, args_07),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, args_08),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, args_09),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_10, args_10),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_11, args_11),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_12, args_12),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_13, args_13),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_14, args_14));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, allocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 14


#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 0
template <class ELEMENT_TYPE>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
                               )
{
    bslma::Allocator *defaultAllocator = bslma::Default::defaultAllocator();

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                             defaultAllocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           defaultAllocator);
    ::new (ManagedPtr_ImpUtil::voidify(objPtr)) ELEMENT_TYPE(
                                 );
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, defaultAllocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 0

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 1
template <class ELEMENT_TYPE, class ARGS_01>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01)
{
    bslma::Allocator *defaultAllocator = bslma::Default::defaultAllocator();

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                             defaultAllocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           defaultAllocator);
    ::new (ManagedPtr_ImpUtil::voidify(objPtr)) ELEMENT_TYPE(
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, defaultAllocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 1

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 2
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02)
{
    bslma::Allocator *defaultAllocator = bslma::Default::defaultAllocator();

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                             defaultAllocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           defaultAllocator);
    ::new (ManagedPtr_ImpUtil::voidify(objPtr)) ELEMENT_TYPE(
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, defaultAllocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 2

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 3
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03)
{
    bslma::Allocator *defaultAllocator = bslma::Default::defaultAllocator();

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                             defaultAllocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           defaultAllocator);
    ::new (ManagedPtr_ImpUtil::voidify(objPtr)) ELEMENT_TYPE(
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, defaultAllocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 3

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 4
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04)
{
    bslma::Allocator *defaultAllocator = bslma::Default::defaultAllocator();

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                             defaultAllocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           defaultAllocator);
    ::new (ManagedPtr_ImpUtil::voidify(objPtr)) ELEMENT_TYPE(
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, defaultAllocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 4

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 5
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05)
{
    bslma::Allocator *defaultAllocator = bslma::Default::defaultAllocator();

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                             defaultAllocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           defaultAllocator);
    ::new (ManagedPtr_ImpUtil::voidify(objPtr)) ELEMENT_TYPE(
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, defaultAllocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 5

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 6
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05,
                              class ARGS_06>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06)
{
    bslma::Allocator *defaultAllocator = bslma::Default::defaultAllocator();

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                             defaultAllocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           defaultAllocator);
    ::new (ManagedPtr_ImpUtil::voidify(objPtr)) ELEMENT_TYPE(
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, args_06));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, defaultAllocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 6

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 7
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05,
                              class ARGS_06,
                              class ARGS_07>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07)
{
    bslma::Allocator *defaultAllocator = bslma::Default::defaultAllocator();

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                             defaultAllocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           defaultAllocator);
    ::new (ManagedPtr_ImpUtil::voidify(objPtr)) ELEMENT_TYPE(
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, args_06),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, args_07));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, defaultAllocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 7

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 8
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05,
                              class ARGS_06,
                              class ARGS_07,
                              class ARGS_08>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08)
{
    bslma::Allocator *defaultAllocator = bslma::Default::defaultAllocator();

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                             defaultAllocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           defaultAllocator);
    ::new (ManagedPtr_ImpUtil::voidify(objPtr)) ELEMENT_TYPE(
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, args_06),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, args_07),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, args_08));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, defaultAllocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 8

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 9
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05,
                              class ARGS_06,
                              class ARGS_07,
                              class ARGS_08,
                              class ARGS_09>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09)
{
    bslma::Allocator *defaultAllocator = bslma::Default::defaultAllocator();

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                             defaultAllocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           defaultAllocator);
    ::new (ManagedPtr_ImpUtil::voidify(objPtr)) ELEMENT_TYPE(
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, args_06),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, args_07),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, args_08),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, args_09));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, defaultAllocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 9

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 10
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05,
                              class ARGS_06,
                              class ARGS_07,
                              class ARGS_08,
                              class ARGS_09,
                              class ARGS_10>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10)
{
    bslma::Allocator *defaultAllocator = bslma::Default::defaultAllocator();

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                             defaultAllocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           defaultAllocator);
    ::new (ManagedPtr_ImpUtil::voidify(objPtr)) ELEMENT_TYPE(
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, args_06),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, args_07),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, args_08),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, args_09),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_10, args_10));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, defaultAllocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 10

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 11
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05,
                              class ARGS_06,
                              class ARGS_07,
                              class ARGS_08,
                              class ARGS_09,
                              class ARGS_10,
                              class ARGS_11>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) args_11)
{
    bslma::Allocator *defaultAllocator = bslma::Default::defaultAllocator();

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                             defaultAllocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           defaultAllocator);
    ::new (ManagedPtr_ImpUtil::voidify(objPtr)) ELEMENT_TYPE(
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, args_06),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, args_07),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, args_08),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, args_09),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_10, args_10),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_11, args_11));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, defaultAllocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 11

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 12
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05,
                              class ARGS_06,
                              class ARGS_07,
                              class ARGS_08,
                              class ARGS_09,
                              class ARGS_10,
                              class ARGS_11,
                              class ARGS_12>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) args_11,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) args_12)
{
    bslma::Allocator *defaultAllocator = bslma::Default::defaultAllocator();

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                             defaultAllocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           defaultAllocator);
    ::new (ManagedPtr_ImpUtil::voidify(objPtr)) ELEMENT_TYPE(
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, args_06),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, args_07),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, args_08),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, args_09),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_10, args_10),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_11, args_11),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_12, args_12));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, defaultAllocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 12

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 13
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05,
                              class ARGS_06,
                              class ARGS_07,
                              class ARGS_08,
                              class ARGS_09,
                              class ARGS_10,
                              class ARGS_11,
                              class ARGS_12,
                              class ARGS_13>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) args_11,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) args_12,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) args_13)
{
    bslma::Allocator *defaultAllocator = bslma::Default::defaultAllocator();

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                             defaultAllocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           defaultAllocator);
    ::new (ManagedPtr_ImpUtil::voidify(objPtr)) ELEMENT_TYPE(
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, args_06),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, args_07),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, args_08),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, args_09),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_10, args_10),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_11, args_11),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_12, args_12),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_13, args_13));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, defaultAllocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 13

#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 14
template <class ELEMENT_TYPE, class ARGS_01,
                              class ARGS_02,
                              class ARGS_03,
                              class ARGS_04,
                              class ARGS_05,
                              class ARGS_06,
                              class ARGS_07,
                              class ARGS_08,
                              class ARGS_09,
                              class ARGS_10,
                              class ARGS_11,
                              class ARGS_12,
                              class ARGS_13,
                              class ARGS_14>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_01) args_01,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_02) args_02,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_03) args_03,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_04) args_04,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_05) args_05,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_06) args_06,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_07) args_07,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_08) args_08,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_09) args_09,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_10) args_10,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_11) args_11,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_12) args_12,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_13) args_13,
                            BSLS_COMPILERFEATURES_FORWARD_REF(ARGS_14) args_14)
{
    bslma::Allocator *defaultAllocator = bslma::Default::defaultAllocator();

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                             defaultAllocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           defaultAllocator);
    ::new (ManagedPtr_ImpUtil::voidify(objPtr)) ELEMENT_TYPE(
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_01, args_01),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_02, args_02),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_03, args_03),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_04, args_04),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_05, args_05),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_06, args_06),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_07, args_07),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_08, args_08),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_09, args_09),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_10, args_10),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_11, args_11),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_12, args_12),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_13, args_13),
                              BSLS_COMPILERFEATURES_FORWARD(ARGS_14, args_14));
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, defaultAllocator);
}
#endif  // BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 14

#else
// The generated code below is a workaround for the absence of perfect
// forwarding in some compilers.

template <class ELEMENT_TYPE, class... ARGS>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::allocateManaged(
                                              bslma::Allocator *basicAllocator,
                               BSLS_COMPILERFEATURES_FORWARD_REF(ARGS)... args)
{
    bslma::Allocator *allocator = bslma::Default::allocator(basicAllocator);

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                                    allocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           allocator);
    bslma::ConstructionUtil::construct(
                                 ManagedPtr_ImpUtil::unqualify(objPtr),
                                 allocator,
                                 BSLS_COMPILERFEATURES_FORWARD(ARGS, args)...);
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, allocator);
}

template <class ELEMENT_TYPE, class... ARGS>
inline
ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
                               BSLS_COMPILERFEATURES_FORWARD_REF(ARGS)... args)
{
    bslma::Allocator *defaultAllocator = bslma::Default::defaultAllocator();

    ELEMENT_TYPE *objPtr = static_cast<ELEMENT_TYPE *>(
                             defaultAllocator->allocate(sizeof(ELEMENT_TYPE)));

    bslma::DeallocatorProctor<bslma::Allocator> proctor(
                                           ManagedPtr_ImpUtil::voidify(objPtr),
                                           defaultAllocator);
    ::new (ManagedPtr_ImpUtil::voidify(objPtr)) ELEMENT_TYPE(
                                 BSLS_COMPILERFEATURES_FORWARD(ARGS, args)...);
    proctor.release();

    return ManagedPtr<ELEMENT_TYPE>(objPtr, defaultAllocator);
}

// }}} END GENERATED CODE
#endif

                      // --------------------------
                      // class ManagedPtrNilDeleter
                      // --------------------------

// CLASS METHODS
template <class TARGET_TYPE>
inline
void ManagedPtrNilDeleter<TARGET_TYPE>::deleter(void *, void *)
{
}

              // ----------------------------------------
              // private struct ManagedPtr_DefaultDeleter
              // ----------------------------------------

// CLASS METHODS
template <class MANAGED_TYPE>
inline
void ManagedPtr_DefaultDeleter<MANAGED_TYPE>::deleter(void *ptr, void *)
{
    delete reinterpret_cast<MANAGED_TYPE *>(ptr);
}

}  // close package namespace

// ============================================================================
//                                TYPE TRAITS
// ============================================================================

namespace bslmf {

template <class TARGET_TYPE>
struct HasPointerSemantics<bslma::ManagedPtr<TARGET_TYPE> > : bsl::true_type
{
};

template <class TARGET_TYPE>
struct IsBitwiseMoveable<bslma::ManagedPtr<TARGET_TYPE> > : bsl::true_type
{
};

}  // close namespace bslmf
}  // close enterprise namespace

namespace bsl {

template <class TARGET_TYPE>
struct is_nothrow_move_constructible<
    BloombergLP::bslma::ManagedPtr<TARGET_TYPE> > : bsl::true_type
{
};

}  // close namespace bsl

#else // if ! defined(DEFINED_BSLMA_MANAGEDPTR_H)
# error Not valid except when included from bslma_managedptr.h
#endif // ! defined(COMPILING_BSLMA_MANAGEDPTR_H)

#endif // ! defined(INCLUDED_BSLMA_MANAGEDPTR_CPP03)

// ----------------------------------------------------------------------------
// Copyright 2022 Bloomberg Finance L.P.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ----------------------------- END-OF-FILE ----------------------------------