11#ifndef INCLUDED_BSLSTL_SHAREDPTR_CPP03
12#define INCLUDED_BSLSTL_SHAREDPTR_CPP03
63#ifdef COMPILING_BSLSTL_SHAREDPTR_H
65#if defined(BSLS_PLATFORM_HAS_PRAGMA_GCC_DIAGNOSTIC)
69# pragma GCC diagnostic push
70# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
73#if defined(BSLS_COMPILERFEATURES_SUPPORT_DEFAULT_TEMPLATE_ARGS)
74# define BSLSTL_SHAREDPTR_SUPPORTS_SFINAE_CHECKS 1
76# if BSLS_PLATFORM_CMP_VERSION >= 1910 && \
77 BSLS_PLATFORM_CMP_VERSION < 1920 && \
78 BSLS_COMPILERFEATURES_CPLUSPLUS >= 201703L
81# undef BSLSTL_SHAREDPTR_SUPPORTS_SFINAE_CHECKS
107#if defined(BSLSTL_SHAREDPTR_SUPPORTS_SFINAE_CHECKS)
113# define BSLSTL_SHAREDPTR_DECLARE_IF_CONVERTIBLE , \
114 typename enable_if< \
115 BloombergLP::bslstl::SharedPtr_IsPointerConvertible< \
117 ELEMENT_TYPE>::value>::type * \
120# define BSLSTL_SHAREDPTR_DEFINE_IF_CONVERTIBLE , \
121 typename enable_if< \
122 BloombergLP::bslstl::SharedPtr_IsPointerConvertible< \
124 ELEMENT_TYPE>::value>::type *
127# define BSLSTL_SHAREDPTR_DECLARE_IF_COMPATIBLE , \
128 typename enable_if< \
129 BloombergLP::bslstl::SharedPtr_IsPointerCompatible< \
131 ELEMENT_TYPE>::value>::type * \
134# define BSLSTL_SHAREDPTR_DEFINE_IF_COMPATIBLE , \
135 typename enable_if< \
136 BloombergLP::bslstl::SharedPtr_IsPointerCompatible< \
138 ELEMENT_TYPE>::value>::type *
141# define BSLSTL_SHAREDPTR_DECLARE_IF_DELETER(FUNCTOR, ARGUMENT) , \
142 typename enable_if< \
143 BloombergLP::bslstl::SharedPtr_IsCallable <FUNCTOR, \
144 ARGUMENT *>::k_VALUE || \
145 BloombergLP::bslstl::SharedPtr_IsFactoryFor<FUNCTOR, \
146 ARGUMENT>::k_VALUE>::type * \
149# define BSLSTL_SHAREDPTR_DEFINE_IF_DELETER(FUNCTOR, ARGUMENT) , \
150 typename enable_if< \
151 BloombergLP::bslstl::SharedPtr_IsCallable <FUNCTOR, \
152 ARGUMENT *>::k_VALUE || \
153 BloombergLP::bslstl::SharedPtr_IsFactoryFor<FUNCTOR, \
154 ARGUMENT >::k_VALUE>::type *
157# define BSLSTL_SHAREDPTR_DECLARE_IF_NULLPTR_DELETER(FUNCTOR) , \
158 typename enable_if< \
159 BloombergLP::bslstl::SharedPtr_IsCallable <FUNCTOR, \
160 nullptr_t>::k_VALUE || \
161 BloombergLP::bslstl::SharedPtr_IsNullableFactory< \
162 FUNCTOR>::k_VALUE>::type * = nullptr
164# define BSLSTL_SHAREDPTR_DEFINE_IF_NULLPTR_DELETER(FUNCTOR) , \
165 typename enable_if< \
166 BloombergLP::bslstl::SharedPtr_IsCallable <FUNCTOR, \
167 nullptr_t>::k_VALUE || \
168 BloombergLP::bslstl::SharedPtr_IsNullableFactory< \
169 FUNCTOR>::k_VALUE>::type *
172# define BSLSTL_SHAREDPTR_DECLARE_IF_CONVERTIBLE
173# define BSLSTL_SHAREDPTR_DEFINE_IF_CONVERTIBLE
175# define BSLSTL_SHAREDPTR_DECLARE_IF_COMPATIBLE
176# define BSLSTL_SHAREDPTR_DEFINE_IF_COMPATIBLE
178# define BSLSTL_SHAREDPTR_DECLARE_IF_DELETER(FUNCTOR, ARGUMENT)
179# define BSLSTL_SHAREDPTR_DEFINE_IF_DELETER(FUNCTOR, ARGUMENT)
181# define BSLSTL_SHAREDPTR_DECLARE_IF_NULLPTR_DELETER(FUNCTOR)
182# define BSLSTL_SHAREDPTR_DEFINE_IF_NULLPTR_DELETER(FUNCTOR)
196#if defined(BSLSTL_SHAREDPTR_SUPPORTS_SFINAE_CHECKS)
197#if !defined(BSLS_PLATFORM_CMP_CLANG) || \
198 !defined(__apple_build_version__) && BSLS_PLATFORM_CMP_VERSION >= \
200 defined(__apple_build_version__) && BSLS_PLATFORM_CMP_VERSION > 130000
201# define BSLSTL_SHAREDPTR_SFINAE_DISCARD(EXPRESSION) \
202 static_cast<void>(EXPRESSION)
204# define BSLSTL_SHAREDPTR_SFINAE_DISCARD(EXPRESSION) \
217struct SharedPtr_RepFromExistingSharedPtr {
222struct SharedPtr_ImpUtil;
224#if defined(BSLSTL_SHAREDPTR_SUPPORTS_SFINAE_CHECKS)
228template <
class FUNCTOR,
class ARG>
229struct SharedPtr_IsCallable;
234template <
class FACTORY,
class ARG>
235struct SharedPtr_IsFactoryFor;
240template <
class FACTORY>
241struct SharedPtr_IsNullableFactory;
248template <
class SOURCE_TYPE,
class DEST_TYPE>
249struct SharedPtr_IsPointerConvertible;
257template <
class SOURCE_TYPE,
class DEST_TYPE>
258struct SharedPtr_IsPointerCompatible;
267template<
class ELEMENT_TYPE>
268class enable_shared_from_this;
270template <
class ELEMENT_TYPE>
273template <
class ELEMENT_TYPE>
302template <
class ELEMENT_TYPE>
319 typedef weak_ptr<ELEMENT_TYPE>
weak_type;
325 BloombergLP::bslma::SharedPtrRep *d_rep_p;
333 typedef shared_ptr<ELEMENT_TYPE> SelfType;
335 typedef typename BloombergLP::bsls::UnspecifiedBool<shared_ptr>::BoolType
339 template <
class COMPATIBLE_TYPE>
348 template <
class INPLACE_REP>
349 static BloombergLP::bslma::SharedPtrRep *makeInternalRep(
352 BloombergLP::bslma::SharedPtrRep *
rep);
358 template <
class COMPATIBLE_TYPE,
class ALLOCATOR>
359 static BloombergLP::bslma::SharedPtrRep *makeInternalRep(
360 COMPATIBLE_TYPE *
ptr,
362 BloombergLP::bslma::Allocator *allocator);
368 template <
class COMPATIBLE_TYPE,
class DELETER>
369 static BloombergLP::bslma::SharedPtrRep *makeInternalRep(
370 COMPATIBLE_TYPE *
ptr,
406 template <class CONVERTIBLE_TYPE
436 template <class CONVERTIBLE_TYPE
439 BloombergLP::
bslma::Allocator *basicAllocator);
471 BloombergLP::
bslma::SharedPtrRep *
rep,
472 BloombergLP::
bslstl::SharedPtr_RepFromExistingSharedPtr);
512 template <class CONVERTIBLE_TYPE,
539 template <class CONVERTIBLE_TYPE,
545 BloombergLP::
bslma::Allocator *basicAllocator = 0);
577 template <class CONVERTIBLE_TYPE,
584 ALLOCATOR basicAllocator,
585 typename ALLOCATOR::value_type * = 0);
592 BloombergLP::
bslma::Allocator *basicAllocator);
608 template <class DELETER
612 BloombergLP::
bslma::Allocator *basicAllocator = 0);
638 template <class DELETER, class ALLOCATOR
642 ALLOCATOR basicAllocator,
643 typename ALLOCATOR::value_type * = 0);
663 template <class CONVERTIBLE_TYPE
667 BloombergLP::
bslma::Allocator *basicAllocator = 0);
670#if defined(BSLS_LIBRARYFEATURES_HAS_CPP98_AUTO_PTR)
682 template <
class CONVERTIBLE_TYPE
684 explicit shared_ptr(std::auto_ptr<CONVERTIBLE_TYPE>& autoPtr,
685 BloombergLP::bslma::Allocator *basicAllocator = 0);
698 explicit shared_ptr(std::auto_ptr_ref<ELEMENT_TYPE> autoRef,
699 BloombergLP::bslma::Allocator *basicAllocator = 0);
702#if defined(BSLS_LIBRARYFEATURES_HAS_CPP11_UNIQUE_PTR)
703# if defined(BSLSTL_SHAREDPTR_SUPPORTS_SFINAE_CHECKS)
719 template <
class COMPATIBLE_TYPE,
720 class UNIQUE_DELETER,
721 typename enable_if<is_convertible<
722 typename std::unique_ptr<COMPATIBLE_TYPE,
723 UNIQUE_DELETER>::pointer,
724 ELEMENT_TYPE *>::value>::type * =
nullptr>
726 UNIQUE_DELETER>&& adoptee,
727 BloombergLP::bslma::Allocator *basicAllocator = 0);
745 template <
class COMPATIBLE_TYPE,
class UNIQUE_DELETER>
747 UNIQUE_DELETER>&& adoptee,
748 BloombergLP::bslma::Allocator *basicAllocator = 0,
749 typename enable_if<is_convertible<
750 typename std::unique_ptr<COMPATIBLE_TYPE,
751 UNIQUE_DELETER>::pointer,
752 ELEMENT_TYPE *>::value,
753 BloombergLP::bslstl::SharedPtr_ImpUtil>::type =
754 BloombergLP::bslstl::SharedPtr_ImpUtil())
756 : d_ptr_p(adoptee.
get())
763 typedef BloombergLP::bslma::SharedPtrInplaceRep<
764 std::unique_ptr<COMPATIBLE_TYPE, UNIQUE_DELETER> > Rep;
768 BloombergLP::bslma::Default::allocator(basicAllocator);
769 Rep *
rep =
new (*basicAllocator) Rep(basicAllocator,
770 BloombergLP::bslmf::MovableRefUtil::move(adoptee));
772 BloombergLP::bslstl::SharedPtr_ImpUtil::loadEnableSharedFromThis(
794 template <
class ANY_TYPE>
795 shared_ptr(
const shared_ptr<ANY_TYPE>& source,
809 template <
class COMPATIBLE_TYPE
830 shared_ptr(BloombergLP::bslmf::MovableRef<shared_ptr> original)
833#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
845 template <
class COMPATIBLE_TYPE
860 template <
class COMPATIBLE_TYPE
863 BloombergLP::bslmf::MovableRef<shared_ptr<COMPATIBLE_TYPE> > other)
873 template<
class COMPATIBLE_TYPE
877#if !defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
888 template<
class COMPATIBLE_TYPE
891 BloombergLP::bslmf::MovableRef<weak_ptr<COMPATIBLE_TYPE> >
ptr);
936 template <
class COMPATIBLE_TYPE>
938 is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value,
942#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
959 template <
class COMPATIBLE_TYPE>
961 enable_if<is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value,
981 template <
class COMPATIBLE_TYPE>
983 enable_if<is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value,
985 operator=(BloombergLP::bslmf::MovableRef<shared_ptr<COMPATIBLE_TYPE> >
rhs)
1007 template <
class COMPATIBLE_TYPE>
1009 is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value,
1011 operator=(BloombergLP::bslma::ManagedPtr<COMPATIBLE_TYPE>
rhs);
1013#if defined(BSLS_LIBRARYFEATURES_HAS_CPP98_AUTO_PTR)
1026 template <
class COMPATIBLE_TYPE>
1028 is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value,
1033#if defined(BSLS_LIBRARYFEATURES_HAS_CPP11_UNIQUE_PTR)
1051 template <
class COMPATIBLE_TYPE,
class UNIQUE_DELETER>
1054 typename std::unique_ptr<COMPATIBLE_TYPE, UNIQUE_DELETER>::pointer,
1055 ELEMENT_TYPE *>::value,
1057 operator=(std::unique_ptr<COMPATIBLE_TYPE, UNIQUE_DELETER>&&
rhs);
1086 template <class COMPATIBLE_TYPE>
1088 enable_if<is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value>::type
1131 template <class COMPATIBLE_TYPE, class DELETER>
1133 enable_if<is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value>::type
1134 reset(COMPATIBLE_TYPE *
ptr, DELETER deleter);
1177 template <class COMPATIBLE_TYPE, class DELETER, class ALLOCATOR>
1179 enable_if<is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value>::type
1182 ALLOCATOR basicAllocator);
1206 template <class ANY_TYPE>
1230#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
1233#ifndef BSLSTL_SHAREDPTR_VARIADIC_LIMIT
1234#define BSLSTL_SHAREDPTR_VARIADIC_LIMIT 14
1236#ifndef BSLSTL_SHAREDPTR_VARIADIC_LIMIT_A
1237#define BSLSTL_SHAREDPTR_VARIADIC_LIMIT_A BSLSTL_SHAREDPTR_VARIADIC_LIMIT
1240#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_A >= 0
1241 void createInplace(BloombergLP::bslma::Allocator *basicAllocator);
1244#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_A >= 1
1245 template <
class ARGS_01>
1246 void createInplace(BloombergLP::bslma::Allocator *basicAllocator,
1250#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_A >= 2
1251 template <
class ARGS_01,
1253 void createInplace(BloombergLP::bslma::Allocator *basicAllocator,
1258#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_A >= 3
1259 template <
class ARGS_01,
1262 void createInplace(BloombergLP::bslma::Allocator *basicAllocator,
1268#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_A >= 4
1269 template <
class ARGS_01,
1273 void createInplace(BloombergLP::bslma::Allocator *basicAllocator,
1280#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_A >= 5
1281 template <
class ARGS_01,
1286 void createInplace(BloombergLP::bslma::Allocator *basicAllocator,
1294#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_A >= 6
1295 template <
class ARGS_01,
1301 void createInplace(BloombergLP::bslma::Allocator *basicAllocator,
1310#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_A >= 7
1311 template <
class ARGS_01,
1318 void createInplace(BloombergLP::bslma::Allocator *basicAllocator,
1328#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_A >= 8
1329 template <
class ARGS_01,
1337 void createInplace(BloombergLP::bslma::Allocator *basicAllocator,
1348#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_A >= 9
1349 template <
class ARGS_01,
1358 void createInplace(BloombergLP::bslma::Allocator *basicAllocator,
1370#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_A >= 10
1371 template <
class ARGS_01,
1381 void createInplace(BloombergLP::bslma::Allocator *basicAllocator,
1394#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_A >= 11
1395 template <
class ARGS_01,
1406 void createInplace(BloombergLP::bslma::Allocator *basicAllocator,
1420#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_A >= 12
1421 template <
class ARGS_01,
1433 void createInplace(BloombergLP::bslma::Allocator *basicAllocator,
1448#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_A >= 13
1449 template <
class ARGS_01,
1462 void createInplace(BloombergLP::bslma::Allocator *basicAllocator,
1478#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_A >= 14
1479 template <
class ARGS_01,
1493 void createInplace(BloombergLP::bslma::Allocator *basicAllocator,
1514 template <
class... ARGS>
1515 void createInplace(BloombergLP::bslma::Allocator *basicAllocator,
1546 template <
class ANY_TYPE>
1547 void loadAlias(
const shared_ptr<ANY_TYPE>& source,
1548 ELEMENT_TYPE *
object);
1567 pair<element_type *, BloombergLP::bslma::SharedPtrRep *>
release()
1570#ifndef BDE_OMIT_INTERNAL_DEPRECATED
1607 template <class COMPATIBLE_TYPE>
1608 void load(COMPATIBLE_TYPE *
ptr);
1638 template <class COMPATIBLE_TYPE>
1639 void load(COMPATIBLE_TYPE *
ptr,
1640 BloombergLP::
bslma::Allocator *basicAllocator);
1685 template <class COMPATIBLE_TYPE, class DELETER>
1686 void load(COMPATIBLE_TYPE *
ptr,
1687 const DELETER& deleter,
1688 BloombergLP::
bslma::Allocator *basicAllocator);
1708 typename add_lvalue_reference<ELEMENT_TYPE>::type
1738 operator[](ptrdiff_t index) const;
1740 template<class ANY_TYPE>
1751 template<class ANY_TYPE>
1752 bool owner_before(const weak_ptr<ANY_TYPE>& other) const
1755 template<class ANY_TYPE>
1756 bool owner_equal(const
shared_ptr<ANY_TYPE>& other) const
1764 template<class ANY_TYPE>
1765 bool owner_equal(const weak_ptr<ANY_TYPE>& other) const
1778 "deprecated_cpp17_standard_library_features",
1822#ifndef BDE_OMIT_INTERNAL_DEPRECATED
1846#ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
1857template<
class ELEMENT_TYPE>
1858shared_ptr(weak_ptr<ELEMENT_TYPE>) -> shared_ptr<ELEMENT_TYPE>;
1863template<
class ELEMENT_TYPE,
class DELETER>
1864shared_ptr(std::unique_ptr<ELEMENT_TYPE, DELETER>)
1865-> shared_ptr<ELEMENT_TYPE>;
1871template<
class ELEMENT_TYPE,
1874 class =
typename bsl::enable_if_t<
1875 bsl::is_convertible_v<ALLOC *, BloombergLP::bslma::Allocator *>>
1877shared_ptr(std::unique_ptr<ELEMENT_TYPE, DELETER>, ALLOC *)
1878-> shared_ptr<ELEMENT_TYPE>;
1886template<
class ELEMENT_TYPE>
1887shared_ptr(BloombergLP::bslma::ManagedPtr<ELEMENT_TYPE>)
1888-> shared_ptr<ELEMENT_TYPE>;
1894template<
class ELEMENT_TYPE,
1896 class =
typename bsl::enable_if_t<
1897 bsl::is_convertible_v<ALLOC *, BloombergLP::bslma::Allocator *>>
1899shared_ptr(BloombergLP::bslma::ManagedPtr<ELEMENT_TYPE>, ALLOC *)
1900-> shared_ptr<ELEMENT_TYPE>;
1913template <
class LHS_TYPE,
class RHS_TYPE>
1917#ifdef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
1922template<
class LHS_TYPE,
class RHS_TYPE>
1923strong_ordering operator<=>(
const shared_ptr<LHS_TYPE>&
lhs,
1924 const shared_ptr<RHS_TYPE>&
rhs)
1937template <
class LHS_TYPE,
class RHS_TYPE>
1946template<
class LHS_TYPE,
class RHS_TYPE>
1955template<
class LHS_TYPE,
class RHS_TYPE>
1965template<
class LHS_TYPE,
class RHS_TYPE>
1975template<
class LHS_TYPE,
class RHS_TYPE>
1983template <
class LHS_TYPE>
1987#ifdef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
1993strong_ordering operator<=>(
const shared_ptr<TYPE>& ptr,
2000template <
class RHS_TYPE>
2006template <
class LHS_TYPE>
2012template <
class RHS_TYPE>
2020template <
class LHS_TYPE>
2028template <
class RHS_TYPE>
2036template <
class LHS_TYPE>
2044template <
class RHS_TYPE>
2052template <
class LHS_TYPE>
2060template <
class RHS_TYPE>
2068template <
class LHS_TYPE>
2076template <
class RHS_TYPE>
2085template<
class CHAR_TYPE,
class CHAR_TRAITS,
class ELEMENT_TYPE>
2086std::basic_ostream<CHAR_TYPE, CHAR_TRAITS>&
2087operator<<(std::basic_ostream<CHAR_TYPE, CHAR_TRAITS>& stream,
2088 const shared_ptr<ELEMENT_TYPE>&
rhs);
2095template <
class HASHALG,
class ELEMENT_TYPE>
2096void hashAppend(HASHALG& hashAlg,
const shared_ptr<ELEMENT_TYPE>& input);
2102template <
class ELEMENT_TYPE>
2103void swap(shared_ptr<ELEMENT_TYPE>& a, shared_ptr<ELEMENT_TYPE>& b)
2111template<
class DELETER,
class ELEMENT_TYPE>
2123template<
class TO_TYPE,
class FROM_TYPE>
2133template<
class TO_TYPE,
class FROM_TYPE>
2144template<
class TO_TYPE,
class FROM_TYPE>
2155template<
class TO_TYPE,
class FROM_TYPE>
2165#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
2168#ifndef BSLSTL_SHAREDPTR_VARIADIC_LIMIT
2169#define BSLSTL_SHAREDPTR_VARIADIC_LIMIT 14
2171#ifndef BSLSTL_SHAREDPTR_VARIADIC_LIMIT_B
2172#define BSLSTL_SHAREDPTR_VARIADIC_LIMIT_B BSLSTL_SHAREDPTR_VARIADIC_LIMIT
2175#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_B >= 0
2176template<
class ELEMENT_TYPE,
class ALLOC>
2178 shared_ptr<ELEMENT_TYPE> >::type
2182#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_B >= 1
2183template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01>
2185 shared_ptr<ELEMENT_TYPE> >::type
2190#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_B >= 2
2191template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2194 shared_ptr<ELEMENT_TYPE> >::type
2200#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_B >= 3
2201template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2205 shared_ptr<ELEMENT_TYPE> >::type
2212#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_B >= 4
2213template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2218 shared_ptr<ELEMENT_TYPE> >::type
2226#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_B >= 5
2227template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2233 shared_ptr<ELEMENT_TYPE> >::type
2242#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_B >= 6
2243template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2250 shared_ptr<ELEMENT_TYPE> >::type
2260#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_B >= 7
2261template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2269 shared_ptr<ELEMENT_TYPE> >::type
2280#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_B >= 8
2281template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2290 shared_ptr<ELEMENT_TYPE> >::type
2302#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_B >= 9
2303template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2313 shared_ptr<ELEMENT_TYPE> >::type
2326#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_B >= 10
2327template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2338 shared_ptr<ELEMENT_TYPE> >::type
2352#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_B >= 11
2353template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2365 shared_ptr<ELEMENT_TYPE> >::type
2380#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_B >= 12
2381template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2394 shared_ptr<ELEMENT_TYPE> >::type
2410#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_B >= 13
2411template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2425 shared_ptr<ELEMENT_TYPE> >::type
2442#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_B >= 14
2443template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2458 shared_ptr<ELEMENT_TYPE> >::type
2480template<
class ELEMENT_TYPE,
class ALLOC,
class... ARGS>
2482 shared_ptr<ELEMENT_TYPE> >::type
2495template<
class ARRAY_TYPE,
class ALLOC>
2496typename enable_if<is_bounded_array<ARRAY_TYPE>::value &&
2498 shared_ptr<ARRAY_TYPE> >::type
2507template<
class ARRAY_TYPE,
class ALLOC>
2508typename enable_if<is_bounded_array<ARRAY_TYPE>::value &&
2510 shared_ptr<ARRAY_TYPE> >::type
2521template<
class ARRAY_TYPE,
class ALLOC>
2522typename enable_if<is_unbounded_array<ARRAY_TYPE>::value &&
2524 shared_ptr<ARRAY_TYPE> >::type
2534template<
class ARRAY_TYPE,
class ALLOC>
2535typename enable_if<is_unbounded_array<ARRAY_TYPE>::value &&
2537 shared_ptr<ARRAY_TYPE> >::type
2551template<
class ELEMENT_TYPE,
class ALLOC>
2553 shared_ptr<ELEMENT_TYPE> >::type
2562template<
class ARRAY_TYPE,
class ALLOC>
2563typename enable_if<is_bounded_array<ARRAY_TYPE>::value &&
2565 shared_ptr<ARRAY_TYPE> >::type
2574template<
class ARRAY_TYPE,
class ALLOC>
2575typename enable_if<is_unbounded_array<ARRAY_TYPE>::value &&
2577 shared_ptr<ARRAY_TYPE> >::type
2584#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
2587#ifndef BSLSTL_SHAREDPTR_VARIADIC_LIMIT
2588#define BSLSTL_SHAREDPTR_VARIADIC_LIMIT 14
2590#ifndef BSLSTL_SHAREDPTR_VARIADIC_LIMIT_C
2591#define BSLSTL_SHAREDPTR_VARIADIC_LIMIT_C BSLSTL_SHAREDPTR_VARIADIC_LIMIT
2594#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_C >= 0
2595template<
class ELEMENT_TYPE,
class ALLOC>
2596typename enable_if<!is_array<ELEMENT_TYPE>::value,
2597 shared_ptr<ELEMENT_TYPE> >::type
2601#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_C >= 1
2602template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01>
2603typename enable_if<!is_array<ELEMENT_TYPE>::value,
2604 shared_ptr<ELEMENT_TYPE> >::type
2609#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_C >= 2
2610template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2612typename enable_if<!is_array<ELEMENT_TYPE>::value,
2613 shared_ptr<ELEMENT_TYPE> >::type
2619#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_C >= 3
2620template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2623typename enable_if<!is_array<ELEMENT_TYPE>::value,
2624 shared_ptr<ELEMENT_TYPE> >::type
2631#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_C >= 4
2632template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2636typename enable_if<!is_array<ELEMENT_TYPE>::value,
2637 shared_ptr<ELEMENT_TYPE> >::type
2645#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_C >= 5
2646template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2651typename enable_if<!is_array<ELEMENT_TYPE>::value,
2652 shared_ptr<ELEMENT_TYPE> >::type
2661#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_C >= 6
2662template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2668typename enable_if<!is_array<ELEMENT_TYPE>::value,
2669 shared_ptr<ELEMENT_TYPE> >::type
2679#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_C >= 7
2680template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2687typename enable_if<!is_array<ELEMENT_TYPE>::value,
2688 shared_ptr<ELEMENT_TYPE> >::type
2699#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_C >= 8
2700template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2708typename enable_if<!is_array<ELEMENT_TYPE>::value,
2709 shared_ptr<ELEMENT_TYPE> >::type
2721#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_C >= 9
2722template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2731typename enable_if<!is_array<ELEMENT_TYPE>::value,
2732 shared_ptr<ELEMENT_TYPE> >::type
2745#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_C >= 10
2746template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2756typename enable_if<!is_array<ELEMENT_TYPE>::value,
2757 shared_ptr<ELEMENT_TYPE> >::type
2771#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_C >= 11
2772template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2783typename enable_if<!is_array<ELEMENT_TYPE>::value,
2784 shared_ptr<ELEMENT_TYPE> >::type
2799#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_C >= 12
2800template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2812typename enable_if<!is_array<ELEMENT_TYPE>::value,
2813 shared_ptr<ELEMENT_TYPE> >::type
2829#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_C >= 13
2830template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2843typename enable_if<!is_array<ELEMENT_TYPE>::value,
2844 shared_ptr<ELEMENT_TYPE> >::type
2861#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_C >= 14
2862template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
2876typename enable_if<!is_array<ELEMENT_TYPE>::value,
2877 shared_ptr<ELEMENT_TYPE> >::type
2899template<
class ELEMENT_TYPE,
class ALLOC,
class... ARGS>
2900typename enable_if<!is_array<ELEMENT_TYPE>::value,
2901 shared_ptr<ELEMENT_TYPE> >::type
2914template<
class ARRAY_TYPE,
class ALLOC>
2915typename enable_if<is_bounded_array<ARRAY_TYPE>::value,
2916 shared_ptr<ARRAY_TYPE> >::type
2926template<
class ARRAY_TYPE,
class ALLOC>
2927typename enable_if<is_bounded_array<ARRAY_TYPE>::value,
2928 shared_ptr<ARRAY_TYPE> >::type
2930 ALLOC *basicAllocator,
2941template<
class ARRAY_TYPE,
class ALLOC>
2942typename enable_if<is_unbounded_array<ARRAY_TYPE>::value,
2943 shared_ptr<ARRAY_TYPE> >::type
2954template<
class ARRAY_TYPE,
class ALLOC>
2955typename enable_if<is_unbounded_array<ARRAY_TYPE>::value,
2956 shared_ptr<ARRAY_TYPE> >::type
2958 ALLOC *basicAllocator,
2972template<
class ELEMENT_TYPE,
class ALLOC>
2973typename enable_if<!is_array<ELEMENT_TYPE>::value,
2974 shared_ptr<ELEMENT_TYPE> >::type
2984template<
class ARRAY_TYPE,
class ALLOC>
2985typename enable_if<is_bounded_array<ARRAY_TYPE>::value,
2986 shared_ptr<ARRAY_TYPE> >::type
2997template<
class ARRAY_TYPE,
class ALLOC>
2998typename enable_if<is_unbounded_array<ARRAY_TYPE>::value,
2999 shared_ptr<ARRAY_TYPE> >::type
3006#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
3009#ifndef BSLSTL_SHAREDPTR_VARIADIC_LIMIT
3010#define BSLSTL_SHAREDPTR_VARIADIC_LIMIT 14
3012#ifndef BSLSTL_SHAREDPTR_VARIADIC_LIMIT_D
3013#define BSLSTL_SHAREDPTR_VARIADIC_LIMIT_D BSLSTL_SHAREDPTR_VARIADIC_LIMIT
3016#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_D >= 0
3017template<
class ELEMENT_TYPE>
3023#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_D >= 1
3024template<
class ELEMENT_TYPE,
class ARGS_01>
3030#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_D >= 2
3031template<
class ELEMENT_TYPE,
class ARGS_01,
3039#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_D >= 3
3040template<
class ELEMENT_TYPE,
class ARGS_01,
3050#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_D >= 4
3051template<
class ELEMENT_TYPE,
class ARGS_01,
3063#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_D >= 5
3064template<
class ELEMENT_TYPE,
class ARGS_01,
3078#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_D >= 6
3079template<
class ELEMENT_TYPE,
class ARGS_01,
3095#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_D >= 7
3096template<
class ELEMENT_TYPE,
class ARGS_01,
3114#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_D >= 8
3115template<
class ELEMENT_TYPE,
class ARGS_01,
3135#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_D >= 9
3136template<
class ELEMENT_TYPE,
class ARGS_01,
3158#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_D >= 10
3159template<
class ELEMENT_TYPE,
class ARGS_01,
3183#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_D >= 11
3184template<
class ELEMENT_TYPE,
class ARGS_01,
3210#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_D >= 12
3211template<
class ELEMENT_TYPE,
class ARGS_01,
3239#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_D >= 13
3240template<
class ELEMENT_TYPE,
class ARGS_01,
3270#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_D >= 14
3271template<
class ELEMENT_TYPE,
class ARGS_01,
3307template<
class ELEMENT_TYPE,
class... ARGS>
3320template<
class ARRAY_TYPE>
3321typename enable_if<is_bounded_array<ARRAY_TYPE>::value,
3322 shared_ptr<ARRAY_TYPE> >::type
3331template<
class ARRAY_TYPE>
3332typename enable_if<is_bounded_array<ARRAY_TYPE>::value,
3333 shared_ptr<ARRAY_TYPE> >::type
3344template<
class ARRAY_TYPE>
3345typename enable_if<is_unbounded_array<ARRAY_TYPE>::value,
3346 shared_ptr<ARRAY_TYPE> >::type
3355template<
class ARRAY_TYPE>
3356typename enable_if<is_unbounded_array<ARRAY_TYPE>::value,
3357 shared_ptr<ARRAY_TYPE> >::type
3370template<
class ELEMENT_TYPE>
3371typename enable_if<!is_array<ELEMENT_TYPE>::value,
3372 shared_ptr<ELEMENT_TYPE> >::type
3380template<
class ARRAY_TYPE>
3381typename enable_if<is_bounded_array<ARRAY_TYPE>::value,
3382 shared_ptr<ARRAY_TYPE> >::type
3391template<
class ARRAY_TYPE>
3392typename enable_if<is_unbounded_array<ARRAY_TYPE>::value,
3393 shared_ptr<ARRAY_TYPE> >::type
3407template <
class ELEMENT_TYPE>
3411 ELEMENT_TYPE *d_ptr_p;
3414 BloombergLP::bslma::SharedPtrRep *d_rep_p;
3424 void privateAssign(BloombergLP::bslma::SharedPtrRep *
rep,
3425 ELEMENT_TYPE *target);
3432 template <
class COMPATIBLE_TYPE>
3467#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
3468 template <
class COMPATIBLE_TYPE
3472 template <
class COMPATIBLE_TYPE
3474 weak_ptr(BloombergLP::bslmf::MovableRef<weak_ptr<COMPATIBLE_TYPE> > other)
3495 template <
class COMPATIBLE_TYPE
3499 template <
class COMPATIBLE_TYPE
3541#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
3542 template <
class COMPATIBLE_TYPE>
3544 is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value,
weak_ptr&>::type
3547 template <
class COMPATIBLE_TYPE>
3549 is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value,
weak_ptr&>::type
3550 operator=(BloombergLP::bslmf::MovableRef<weak_ptr<COMPATIBLE_TYPE> >
rhs)
3554 template <
class COMPATIBLE_TYPE>
3556 is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value,
weak_ptr&>::type
3570 template <
class COMPATIBLE_TYPE>
3572 is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value,
weak_ptr&>::type
3598 template <class ANY_TYPE>
3599 bool owner_before(const shared_ptr<ANY_TYPE>& other) const
3609 template <class ANY_TYPE>
3613 template<class ANY_TYPE>
3614 bool owner_equal(const shared_ptr<ANY_TYPE>& other) const
3622 template<class ANY_TYPE>
3623 bool owner_equal(const
weak_ptr<ANY_TYPE>& other) const
3651#ifndef BDE_OMIT_INTERNAL_DEPRECATED
3674#ifdef BSLS_COMPILERFEATURES_SUPPORT_CTAD
3680template<
class ELEMENT_TYPE>
3681weak_ptr(shared_ptr<ELEMENT_TYPE>) -> weak_ptr<ELEMENT_TYPE>;
3707template<
class ELEMENT_TYPE>
3708class enable_shared_from_this {
3789template <class ELEMENT_TYPE>
3790void swap(weak_ptr<ELEMENT_TYPE>& a, weak_ptr<ELEMENT_TYPE>& b)
3812struct SharedPtrUtil {
3825 createInplaceUninitializedBuffer(
size_t bufferSize,
3840 template <
class TARGET,
class SOURCE>
3852 template <
class TARGET,
class SOURCE>
3869 template <
class TARGET,
class SOURCE>
3883 template <
class TARGET,
class SOURCE>
3898 template <
class TARGET,
class SOURCE>
3910 template <
class TARGET,
class SOURCE>
3924struct SharedPtrNilDeleter {
3943struct SharedPtr_DefaultDeleter {
3948 template <
class ANY_TYPE>
3966#ifdef BSLS_LIBRARYFEATURES_HAS_CPP11_BASELINE_LIBRARY
3967 template <
class TYPE,
unsigned DIM = 0>
3968 struct Extent : std::extent<TYPE, DIM> {};
3970 template <
class TYPE,
unsigned DIM = 0>
3973 template <
class TYPE>
3976 template <
class TYPE,
unsigned DIM>
3977 struct Extent<TYPE[], DIM>
3980 template <
class TYPE,
size_t SIZE>
3981 struct Extent<TYPE[SIZE], 0>
3984 template <
class TYPE,
size_t SIZE,
unsigned DIM>
3985 struct Extent<TYPE[SIZE], DIM>
4005 template<
class SHARED_TYPE,
class ENABLE_TYPE>
4006 static void loadEnableSharedFromThis(
4014 static void loadEnableSharedFromThis(
const volatile void *,
const void *)
4018 static void throwBadWeakPtr();
4030class SharedPtr_RepProctor {
4038 SharedPtr_RepProctor(
const SharedPtr_RepProctor&);
4039 SharedPtr_RepProctor& operator=(
const SharedPtr_RepProctor&);
4055 ~SharedPtr_RepProctor();
4072#if defined(BSLSTL_SHAREDPTR_SUPPORTS_SFINAE_CHECKS)
4076#if defined(BSLS_COMPILERFEATURES_SUPPORT_DECLTYPE) && \
4077 defined(BSLS_PLATFORM_CMP_MSVC) && \
4078 BSLS_PLATFORM_CMP_VERSION >= 1936 && BSLS_PLATFORM_CMP_VERSION <= 1937
4084# define BSLSTL_SHAREDPTR_MSVC_DECLTYPE_WORKAROUND(...) decltype(__VA_ARGS__)
4086# define BSLSTL_SHAREDPTR_MSVC_DECLTYPE_WORKAROUND(...) (__VA_ARGS__)
4089template <
class FUNCTOR>
4090struct SharedPtr_TestIsCallable {
4093 typedef BloombergLP::bslmf::Util Util;
4125 template <
class ARG>
4126 static FalseType test(...);
4127 template <
class ARG>
4131 sizeof(BSLSTL_SHAREDPTR_MSVC_DECLTYPE_WORKAROUND(
4132 BSLSTL_SHAREDPTR_SFINAE_DISCARD(
4133 Util::declval<FUNCTOR>()(Util::declval<ARG>())),
4137#if defined(BSLS_PLATFORM_CMP_MSVC) && BSLS_PLATFORM_CMP_VERSION < 1920
4145template <
class RESULT,
class PARAM>
4146struct SharedPtr_TestIsCallable<RESULT(PARAM)> {
4149 typedef BloombergLP::bslmf::Util Util;
4151 struct TrueType {
char d_padding; };
4152 struct FalseType {
char d_padding[17]; };
4155 static RESULT callMe(PARAM);
4169 template <
class ARG>
4170 static FalseType test(...);
4171 template <
class ARG>
4173 ((
void)callMe(Util::declval<ARG>())), 0
4177template <
class RESULT,
class PARAM>
4178struct SharedPtr_TestIsCallable<RESULT(*)(PARAM)>
4179 : SharedPtr_TestIsCallable<RESULT(PARAM)> {
4182template <
class RESULT,
class PARAM>
4183struct SharedPtr_TestIsCallable<RESULT(&)(PARAM)>
4184 : SharedPtr_TestIsCallable<RESULT(PARAM)> {
4187#if BSLS_PLATFORM_CMP_VERSION >= 1910
4194template <
class TYPE>
4195struct SharedPtr_TestIsCallable<TYPE *> {
4196 struct TrueType {
char d_padding; };
4197 struct FalseType {
char d_padding[17]; };
4199 template <
class ARG>
4200 static FalseType test(...);
4204struct SharedPtr_TestIsCallable<int> {
4205 struct TrueType {
char d_padding; };
4206 struct FalseType {
char d_padding[17]; };
4208 template <
class ARG>
4209 static FalseType test(...);
4215template <
class FUNCTOR,
class ARG>
4216struct SharedPtr_IsCallable {
4218 sizeof(SharedPtr_TestIsCallable<FUNCTOR>::template test<ARG>(0)) == 1
4223struct SharedPtr_IsFactoryFor_Impl {
4249 template <
class FACTORY,
class ARG>
4250 static FalseType test(...);
4251 template <
class FACTORY,
class ARG>
4252 static TrueType test(
typename bsl::enable_if<
static_cast<bool>(
sizeof(
4253 BSLSTL_SHAREDPTR_SFINAE_DISCARD(
4254 (*(FACTORY *)0)->deleteObject((ARG *)0)),
4258template <
class FACTORY,
class ARG>
4259struct SharedPtr_IsFactoryFor {
4261 sizeof(SharedPtr_IsFactoryFor_Impl::test<FACTORY, ARG>(0)) == 1
4266struct SharedPtr_IsNullableFactory_Impl {
4292 template <
class FACTORY>
4293 static FalseType test(...);
4294 template <
class FACTORY>
4295 static TrueType test(
typename bsl::enable_if<
static_cast<bool>(
sizeof(
4296 BSLSTL_SHAREDPTR_SFINAE_DISCARD(
4297 (*(FACTORY *)0)->deleteObject(
nullptr)),
4301template <
class FACTORY>
4302struct SharedPtr_IsNullableFactory {
4304 sizeof(SharedPtr_IsNullableFactory_Impl::test<FACTORY>(0)) == 1
4309template <
class SOURCE_TYPE,
class DEST_TYPE>
4310struct SharedPtr_IsPointerConvertible_Impl
4313template <
class SOURCE_TYPE,
class DEST_TYPE>
4314struct SharedPtr_IsPointerConvertible_Impl<SOURCE_TYPE, DEST_TYPE[]>
4317template <
class SOURCE_TYPE,
class DEST_TYPE,
size_t DEST_SIZE>
4318struct SharedPtr_IsPointerConvertible_Impl<SOURCE_TYPE, DEST_TYPE[DEST_SIZE]>
4320 DEST_TYPE (*)[DEST_SIZE]>::type {};
4323template <
class SOURCE_TYPE,
class DEST_TYPE>
4324struct SharedPtr_IsPointerConvertible
4325: SharedPtr_IsPointerConvertible_Impl<SOURCE_TYPE, DEST_TYPE>::type {};
4328template <
class SOURCE_TYPE,
class DEST_TYPE>
4329struct SharedPtr_IsPointerCompatible_Impl
4332template <
class TYPE,
size_t SIZE>
4333struct SharedPtr_IsPointerCompatible_Impl<TYPE[SIZE], TYPE[]>
4336template <
class TYPE,
size_t SIZE>
4337struct SharedPtr_IsPointerCompatible_Impl<TYPE[SIZE], const TYPE[]>
4340template <
class TYPE,
size_t SIZE>
4341struct SharedPtr_IsPointerCompatible_Impl<TYPE[SIZE], volatile TYPE[]>
4344template <
class TYPE,
size_t SIZE>
4345struct SharedPtr_IsPointerCompatible_Impl<TYPE[SIZE], const volatile TYPE[]>
4349template <
class SOURCE_TYPE,
class DEST_TYPE>
4350struct SharedPtr_IsPointerCompatible
4351: SharedPtr_IsPointerCompatible_Impl<SOURCE_TYPE, DEST_TYPE>::type {};
4363template<
class ELEMENT_TYPE>
4365enable_shared_from_this<ELEMENT_TYPE>::enable_shared_from_this()
4371template<
class ELEMENT_TYPE>
4373enable_shared_from_this<ELEMENT_TYPE>::enable_shared_from_this(
4374 const enable_shared_from_this&)
4380template<
class ELEMENT_TYPE>
4382enable_shared_from_this<ELEMENT_TYPE>::~enable_shared_from_this()
4387template<
class ELEMENT_TYPE>
4389enable_shared_from_this<ELEMENT_TYPE>&
4390enable_shared_from_this<ELEMENT_TYPE>::operator=(
4391 const enable_shared_from_this&)
4397template<
class ELEMENT_TYPE>
4399shared_ptr<ELEMENT_TYPE>
4400enable_shared_from_this<ELEMENT_TYPE>::shared_from_this()
4402 return shared_ptr<ELEMENT_TYPE>(d_weakThis);
4405template<
class ELEMENT_TYPE>
4407shared_ptr<const ELEMENT_TYPE>
4408enable_shared_from_this<ELEMENT_TYPE>::shared_from_this()
const
4410 return shared_ptr<const ELEMENT_TYPE>(d_weakThis);
4413template<
class ELEMENT_TYPE>
4415weak_ptr<ELEMENT_TYPE>
4421template<
class ELEMENT_TYPE>
4423weak_ptr<const ELEMENT_TYPE>
4424enable_shared_from_this<ELEMENT_TYPE>::weak_from_this() const
4435template <
class ELEMENT_TYPE>
4436template <
class INPLACE_REP>
4438BloombergLP::bslma::SharedPtrRep *
4439shared_ptr<ELEMENT_TYPE>::makeInternalRep(
4442 BloombergLP::bslma::SharedPtrRep *rep)
4447template <
class ELEMENT_TYPE>
4448template <
class COMPATIBLE_TYPE,
class ALLOCATOR>
4450BloombergLP::bslma::SharedPtrRep *
4451shared_ptr<ELEMENT_TYPE>::makeInternalRep(
4452 COMPATIBLE_TYPE *ptr,
4454 BloombergLP::bslma::Allocator *allocator)
4456 typedef BloombergLP::bslma::SharedPtrOutofplaceRep<
4458 BloombergLP::bslma::Allocator *>
4461 return RepMaker::makeOutofplaceRep(ptr, allocator, allocator);
4464template <
class ELEMENT_TYPE>
4465template <
class COMPATIBLE_TYPE,
class DELETER>
4467BloombergLP::bslma::SharedPtrRep *
4468shared_ptr<ELEMENT_TYPE>::makeInternalRep(COMPATIBLE_TYPE *ptr,
4472 typedef BloombergLP::bslma::SharedPtrOutofplaceRep<COMPATIBLE_TYPE,
4473 DELETER *> RepMaker;
4475 return RepMaker::makeOutofplaceRep(ptr, deleter, 0);
4479template <
class ELEMENT_TYPE>
4488template <
class ELEMENT_TYPE>
4497template <
class ELEMENT_TYPE>
4498template <
class CONVERTIBLE_TYPE
4501shared_ptr<ELEMENT_TYPE>::shared_ptr(CONVERTIBLE_TYPE *ptr)
4504 typedef BloombergLP::bslstl::SharedPtr_DefaultDeleter<
4506 typedef BloombergLP::bslma::SharedPtrOutofplaceRep<CONVERTIBLE_TYPE,
4509 d_rep_p = RepMaker::makeOutofplaceRep(ptr, Deleter(), 0);
4511 BloombergLP::bslstl::SharedPtr_ImpUtil::loadEnableSharedFromThis(ptr,
4516template <
class ELEMENT_TYPE>
4517template <
class CONVERTIBLE_TYPE
4520shared_ptr<ELEMENT_TYPE>::shared_ptr(
4521 CONVERTIBLE_TYPE *ptr,
4522 BloombergLP::bslma::Allocator *basicAllocator)
4525 typedef BloombergLP::bslma::SharedPtrOutofplaceRep<
4527 BloombergLP::bslma::Allocator *>
4530 d_rep_p = RepMaker::makeOutofplaceRep(ptr, basicAllocator, basicAllocator);
4532 BloombergLP::bslstl::SharedPtr_ImpUtil::loadEnableSharedFromThis(ptr,
4537template <
class ELEMENT_TYPE>
4539shared_ptr<ELEMENT_TYPE>::shared_ptr(
4540 typename shared_ptr<ELEMENT_TYPE>::element_type *ptr,
4541 BloombergLP::bslma::SharedPtrRep *rep)
4545 BloombergLP::bslstl::SharedPtr_ImpUtil::loadEnableSharedFromThis(ptr,
4549template <
class ELEMENT_TYPE>
4551shared_ptr<ELEMENT_TYPE>::shared_ptr(
4553 BloombergLP::bslma::SharedPtrRep *rep,
4554 BloombergLP::bslstl::SharedPtr_RepFromExistingSharedPtr)
4560template <
class ELEMENT_TYPE>
4561template <
class CONVERTIBLE_TYPE,
4566shared_ptr<ELEMENT_TYPE>::shared_ptr(CONVERTIBLE_TYPE *ptr,
4569, d_rep_p(makeInternalRep(ptr, dispatch, dispatch))
4572 BloombergLP::bslstl::SharedPtr_ImpUtil::loadEnableSharedFromThis(ptr,
4577template <
class ELEMENT_TYPE>
4578template <
class CONVERTIBLE_TYPE,
4583shared_ptr<ELEMENT_TYPE>::shared_ptr(
4584 CONVERTIBLE_TYPE *ptr,
4586 BloombergLP::bslma::Allocator *basicAllocator)
4589 typedef BloombergLP::bslma::SharedPtrOutofplaceRep<CONVERTIBLE_TYPE,
4592 d_rep_p = RepMaker::makeOutofplaceRep(ptr, deleter, basicAllocator);
4594 BloombergLP::bslstl::SharedPtr_ImpUtil::loadEnableSharedFromThis(ptr,
4599template <
class ELEMENT_TYPE>
4600template <
class CONVERTIBLE_TYPE,
4606shared_ptr<ELEMENT_TYPE>::shared_ptr(CONVERTIBLE_TYPE *ptr,
4608 ALLOCATOR basicAllocator,
4609 typename ALLOCATOR::value_type *)
4612#ifdef BSLS_PLATFORM_CMP_MSVC
4620 DELETER>::type DeleterType;
4622 typedef DELETER DeleterType;
4626 BloombergLP::bslstl::SharedPtrAllocateOutofplaceRep<CONVERTIBLE_TYPE,
4628 ALLOCATOR> RepMaker;
4630 d_rep_p = RepMaker::makeOutofplaceRep(ptr, deleter, basicAllocator);
4632 BloombergLP::bslstl::SharedPtr_ImpUtil::loadEnableSharedFromThis(ptr,
4637template <
class ELEMENT_TYPE>
4639shared_ptr<ELEMENT_TYPE>::shared_ptr(nullptr_t,
4640 BloombergLP::bslma::Allocator *)
4646template <
class ELEMENT_TYPE>
4647template <
class DELETER
4650shared_ptr<ELEMENT_TYPE>::shared_ptr(
4653 BloombergLP::bslma::Allocator *basicAllocator)
4656 typedef BloombergLP::bslma::SharedPtrOutofplaceRep<ELEMENT_TYPE,
4664 d_rep_p = RepMaker::makeOutofplaceRep((ELEMENT_TYPE *)0,
4670template <
class ELEMENT_TYPE>
4671template <
class DELETER,
class ALLOCATOR
4674shared_ptr<ELEMENT_TYPE>::shared_ptr(
4677 ALLOCATOR basicAllocator,
4678 typename ALLOCATOR::value_type *)
4681#ifdef BSLS_PLATFORM_CMP_MSVC
4689 DELETER>::type DeleterType;
4691 typedef DELETER DeleterType;
4695 BloombergLP::bslstl::SharedPtrAllocateOutofplaceRep<ELEMENT_TYPE,
4697 ALLOCATOR> RepMaker;
4699 d_rep_p = RepMaker::makeOutofplaceRep((ELEMENT_TYPE *)0,
4704template <
class ELEMENT_TYPE>
4705template <
class CONVERTIBLE_TYPE
4707shared_ptr<ELEMENT_TYPE>::shared_ptr(
4708 BloombergLP::bslma::ManagedPtr<CONVERTIBLE_TYPE> managedPtr,
4709 BloombergLP::bslma::Allocator *basicAllocator)
4710: d_ptr_p(managedPtr.ptr())
4713 typedef BloombergLP::bslma::SharedPtrInplaceRep<
4714 BloombergLP::bslma::ManagedPtr<ELEMENT_TYPE> > Rep;
4717 ELEMENT_TYPE *pPotentiallyShared =
static_cast<ELEMENT_TYPE *
>(
4718 managedPtr.deleter().object());
4720 if (&BloombergLP::bslma::SharedPtrRep::managedPtrDeleter ==
4721 managedPtr.deleter().deleter()) {
4722 d_rep_p =
static_cast<BloombergLP::bslma::SharedPtrRep *
>
4723 (managedPtr.release().second.factory());
4725 else if (&BloombergLP::bslma::SharedPtrRep::managedPtrEmptyDeleter ==
4726 managedPtr.deleter().deleter()) {
4728 managedPtr.release();
4732 BloombergLP::bslma::Default::allocator(basicAllocator);
4733 Rep *rep =
new (*basicAllocator) Rep(basicAllocator);
4734 (*rep->ptr()) = managedPtr;
4738 BloombergLP::bslstl::SharedPtr_ImpUtil::loadEnableSharedFromThis(
4744#if defined(BSLS_LIBRARYFEATURES_HAS_CPP98_AUTO_PTR)
4745template <
class ELEMENT_TYPE>
4746template <
class CONVERTIBLE_TYPE
4748shared_ptr<ELEMENT_TYPE>::shared_ptr(
4749 std::auto_ptr<CONVERTIBLE_TYPE>& autoPtr,
4750 BloombergLP::bslma::Allocator *basicAllocator)
4751: d_ptr_p(autoPtr.
get())
4754 typedef BloombergLP::bslma::SharedPtrInplaceRep<
4755 std::auto_ptr<CONVERTIBLE_TYPE> > Rep;
4759 BloombergLP::bslma::Default::allocator(basicAllocator);
4760 Rep *rep =
new (*basicAllocator) Rep(basicAllocator);
4761 (*rep->ptr()) = autoPtr;
4763 BloombergLP::bslstl::SharedPtr_ImpUtil::loadEnableSharedFromThis(
4769template <
class ELEMENT_TYPE>
4770shared_ptr<ELEMENT_TYPE>::shared_ptr(
4771 std::auto_ptr_ref<ELEMENT_TYPE> autoRef,
4772 BloombergLP::bslma::Allocator *basicAllocator)
4776 typedef BloombergLP::bslma::SharedPtrInplaceRep<
4777 std::auto_ptr<ELEMENT_TYPE> > Rep;
4779 std::auto_ptr<ELEMENT_TYPE> autoPtr(autoRef);
4780 if (autoPtr.get()) {
4782 BloombergLP::bslma::Default::allocator(basicAllocator);
4783 Rep *rep =
new (*basicAllocator) Rep(basicAllocator);
4784 d_ptr_p = autoPtr.get();
4785 (*rep->ptr()) = autoPtr;
4791#if defined(BSLS_LIBRARYFEATURES_HAS_CPP11_UNIQUE_PTR)
4792# if defined(BSLSTL_SHAREDPTR_SUPPORTS_SFINAE_CHECKS)
4793template <
class ELEMENT_TYPE>
4794template <
class COMPATIBLE_TYPE,
4795 class UNIQUE_DELETER,
4796 typename enable_if<is_convertible<
4797 typename std::unique_ptr<COMPATIBLE_TYPE,
4798 UNIQUE_DELETER>::pointer,
4799 ELEMENT_TYPE *>::value>::type *>
4800shared_ptr<ELEMENT_TYPE>::shared_ptr(
4801 std::unique_ptr<COMPATIBLE_TYPE, UNIQUE_DELETER>&& adoptee,
4802 BloombergLP::bslma::Allocator *basicAllocator)
4803: d_ptr_p(adoptee.
get())
4806 typedef BloombergLP::bslma::SharedPtrInplaceRep<
4807 std::unique_ptr<COMPATIBLE_TYPE, UNIQUE_DELETER> > Rep;
4811 BloombergLP::bslma::Default::allocator(basicAllocator);
4812 Rep *rep =
new (*basicAllocator) Rep(basicAllocator,
4813 BloombergLP::bslmf::MovableRefUtil::move(adoptee));
4815 BloombergLP::bslstl::SharedPtr_ImpUtil::loadEnableSharedFromThis(
4823template <
class ELEMENT_TYPE>
4824template <
class ANY_TYPE>
4825shared_ptr<ELEMENT_TYPE>::shared_ptr(
const shared_ptr<ANY_TYPE>& source,
4826 ELEMENT_TYPE *
object)
4829, d_rep_p(source.d_rep_p)
4836template <
class ELEMENT_TYPE>
4837template <
class COMPATIBLE_TYPE
4839shared_ptr<ELEMENT_TYPE>::
4841: d_ptr_p(other.d_ptr_p)
4842, d_rep_p(other.d_rep_p)
4849template <
class ELEMENT_TYPE>
4850shared_ptr<ELEMENT_TYPE>::shared_ptr(
const shared_ptr& original)
4852: d_ptr_p(original.d_ptr_p)
4853, d_rep_p(original.d_rep_p)
4860template <
class ELEMENT_TYPE>
4861shared_ptr<ELEMENT_TYPE>::shared_ptr
4862 (BloombergLP::bslmf::MovableRef<shared_ptr> original)
4864: d_ptr_p(BloombergLP::bslmf::MovableRefUtil::access(original).d_ptr_p)
4865, d_rep_p(BloombergLP::bslmf::MovableRefUtil::access(original).d_rep_p)
4867 BloombergLP::bslmf::MovableRefUtil::access(original).d_ptr_p = 0;
4868 BloombergLP::bslmf::MovableRefUtil::access(original).d_rep_p = 0;
4871#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
4872template <
class ELEMENT_TYPE>
4873template <
class COMPATIBLE_TYPE
4875shared_ptr<ELEMENT_TYPE>::shared_ptr(shared_ptr<COMPATIBLE_TYPE>&& other)
4877: d_ptr_p(other.d_ptr_p)
4878, d_rep_p(other.d_rep_p)
4884template <
class ELEMENT_TYPE>
4885template <
class COMPATIBLE_TYPE
4887shared_ptr<ELEMENT_TYPE>::
4888shared_ptr(BloombergLP::bslmf::MovableRef<shared_ptr<COMPATIBLE_TYPE> > other)
4890: d_ptr_p(BloombergLP::bslmf::MovableRefUtil::access(other).d_ptr_p)
4891, d_rep_p(BloombergLP::bslmf::MovableRefUtil::access(other).d_rep_p)
4893 BloombergLP::bslmf::MovableRefUtil::access(other).d_ptr_p = 0;
4894 BloombergLP::bslmf::MovableRefUtil::access(other).d_rep_p = 0;
4898template <
class ELEMENT_TYPE>
4899template <
class COMPATIBLE_TYPE
4901shared_ptr<ELEMENT_TYPE>::shared_ptr(
const weak_ptr<COMPATIBLE_TYPE>& other)
4911 SelfType value = other.lock();
4912 if (other.expired()) {
4916 BloombergLP::bslstl::SharedPtr_ImpUtil::throwBadWeakPtr();
4922#if !defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
4923template <
class ELEMENT_TYPE>
4924template <
class COMPATIBLE_TYPE
4926shared_ptr<ELEMENT_TYPE>::shared_ptr(
4927 BloombergLP::bslmf::MovableRef<weak_ptr<COMPATIBLE_TYPE> > ptr)
4937 weak_ptr<COMPATIBLE_TYPE>& other = ptr;
4939 SelfType value = other.lock();
4940 if (other.expired()) {
4944 BloombergLP::bslstl::SharedPtr_ImpUtil::throwBadWeakPtr();
4951template <
class ELEMENT_TYPE>
4952shared_ptr<ELEMENT_TYPE>::~shared_ptr()
4960template <
class ELEMENT_TYPE>
4961shared_ptr<ELEMENT_TYPE>&
4962shared_ptr<ELEMENT_TYPE>::operator=(
const shared_ptr& rhs)
4968 if (
rhs.d_rep_p == d_rep_p) {
4969 d_ptr_p =
rhs.d_ptr_p;
4972 SelfType(rhs).swap(*
this);
4978template <
class ELEMENT_TYPE>
4979shared_ptr<ELEMENT_TYPE>&
4980shared_ptr<ELEMENT_TYPE>::operator=(
4981 BloombergLP::bslmf::MovableRef<shared_ptr> rhs)
4987 shared_ptr(BloombergLP::bslmf::MovableRefUtil::move(rhs)).swap(*
this);
4992template <
class ELEMENT_TYPE>
4993template <
class COMPATIBLE_TYPE>
4995 is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value,
4996 shared_ptr<ELEMENT_TYPE>&>::type
4997shared_ptr<ELEMENT_TYPE>::operator=(
const shared_ptr<COMPATIBLE_TYPE>& rhs)
5003 if (
rhs.d_rep_p == d_rep_p) {
5004 d_ptr_p =
rhs.d_ptr_p;
5007 SelfType(rhs).swap(*
this);
5013#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
5014template <
class ELEMENT_TYPE>
5015template <
class COMPATIBLE_TYPE>
5016typename enable_if<is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value,
5017 shared_ptr<ELEMENT_TYPE>&>::type
5018shared_ptr<ELEMENT_TYPE>::operator=(shared_ptr<COMPATIBLE_TYPE>&& rhs)
5021template <
class ELEMENT_TYPE>
5022template <
class COMPATIBLE_TYPE>
5023typename enable_if<is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value,
5024 shared_ptr<ELEMENT_TYPE>&>::type
5025shared_ptr<ELEMENT_TYPE>::operator=(
5026 BloombergLP::bslmf::MovableRef<shared_ptr<COMPATIBLE_TYPE> > rhs)
5033 shared_ptr(BloombergLP::bslmf::MovableRefUtil::move(rhs)).swap(*
this);
5038template <
class ELEMENT_TYPE>
5039template <
class COMPATIBLE_TYPE>
5042 is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value,
5043 shared_ptr<ELEMENT_TYPE>&>::type
5044shared_ptr<ELEMENT_TYPE>::operator=(
5045 BloombergLP::bslma::ManagedPtr<COMPATIBLE_TYPE> rhs)
5047 SelfType(rhs).swap(*
this);
5051#if defined(BSLS_LIBRARYFEATURES_HAS_CPP98_AUTO_PTR)
5052template <
class ELEMENT_TYPE>
5053template <
class COMPATIBLE_TYPE>
5056 is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value,
5057 shared_ptr<ELEMENT_TYPE>&>::type
5058shared_ptr<ELEMENT_TYPE>::operator=(std::auto_ptr<COMPATIBLE_TYPE> rhs)
5060 SelfType(rhs).swap(*
this);
5065#if defined(BSLS_LIBRARYFEATURES_HAS_CPP11_UNIQUE_PTR)
5066template <
class ELEMENT_TYPE>
5067template <
class COMPATIBLE_TYPE,
class UNIQUE_DELETER>
5071 typename std::unique_ptr<COMPATIBLE_TYPE, UNIQUE_DELETER>::pointer,
5072 ELEMENT_TYPE *>::value,
5073 shared_ptr<ELEMENT_TYPE>&>::type
5074shared_ptr<ELEMENT_TYPE>::operator=(
5075 std::unique_ptr<COMPATIBLE_TYPE, UNIQUE_DELETER>&& rhs)
5077 SelfType(BloombergLP::bslmf::MovableRefUtil::move(rhs)).swap(*
this);
5082template <
class ELEMENT_TYPE>
5086 BloombergLP::bslma::SharedPtrRep *rep = d_rep_p;
5099template <
class ELEMENT_TYPE>
5100template <
class COMPATIBLE_TYPE>
5103 enable_if<is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value>::type
5104shared_ptr<ELEMENT_TYPE>::reset(COMPATIBLE_TYPE *ptr)
5106 SelfType(ptr).swap(*
this);
5109template <
class ELEMENT_TYPE>
5110template <
class COMPATIBLE_TYPE,
class DELETER>
5113 enable_if<is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value>::type
5114shared_ptr<ELEMENT_TYPE>::reset(COMPATIBLE_TYPE *ptr,
5117 SelfType(ptr, deleter).swap(*
this);
5120template <
class ELEMENT_TYPE>
5121template <
class COMPATIBLE_TYPE,
class DELETER,
class ALLOCATOR>
5124 enable_if<is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value>::type
5125shared_ptr<ELEMENT_TYPE>::reset(COMPATIBLE_TYPE *ptr,
5127 ALLOCATOR basicAllocator)
5129 SelfType(ptr, deleter, basicAllocator).swap(*
this);
5132template <
class ELEMENT_TYPE>
5133template <
class ANY_TYPE>
5135void shared_ptr<ELEMENT_TYPE>::reset(
const shared_ptr<ANY_TYPE>& source,
5141 if (source.d_rep_p == d_rep_p && ptr) {
5145 SelfType(source, ptr).swap(*
this);
5149template <
class ELEMENT_TYPE>
5162 element_type *tempPtr_p = d_ptr_p;
5163 d_ptr_p = other.d_ptr_p;
5164 other.d_ptr_p = tempPtr_p;
5166 BloombergLP::bslma::SharedPtrRep *tempRep_p = d_rep_p;
5167 d_rep_p = other.d_rep_p;
5168 other.d_rep_p = tempRep_p;
5172template<
class ELEMENT_TYPE>
5174shared_ptr<ELEMENT_TYPE>::createInplace()
5176 typedef BloombergLP::bslma::SharedPtrInplaceRep<ELEMENT_TYPE> Rep;
5178 BloombergLP::bslma::Allocator *basicAllocator =
5179 BloombergLP::bslma::Default::allocator();
5181 Rep *rep =
new (*basicAllocator) Rep(basicAllocator);
5182 SelfType(rep->ptr(), rep).swap(*
this);
5185#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
5188#ifndef BSLSTL_SHAREDPTR_VARIADIC_LIMIT
5189#define BSLSTL_SHAREDPTR_VARIADIC_LIMIT 14
5191#ifndef BSLSTL_SHAREDPTR_VARIADIC_LIMIT_E
5192#define BSLSTL_SHAREDPTR_VARIADIC_LIMIT_E BSLSTL_SHAREDPTR_VARIADIC_LIMIT
5194#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_E >= 0
5195template <
class ELEMENT_TYPE>
5197shared_ptr<ELEMENT_TYPE>::createInplace(
5198 BloombergLP::bslma::Allocator *basicAllocator)
5200 typedef BloombergLP::bslma::SharedPtrInplaceRep<ELEMENT_TYPE> Rep;
5202 basicAllocator = BloombergLP::bslma::Default::allocator(basicAllocator);
5203 Rep *rep =
new (*basicAllocator) Rep(basicAllocator);
5204 SelfType(rep->ptr(), rep).swap(*
this);
5208#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_E >= 1
5209template <
class ELEMENT_TYPE>
5210template <
class ARGS_01>
5212shared_ptr<ELEMENT_TYPE>::createInplace(
5213 BloombergLP::bslma::Allocator *basicAllocator,
5216 typedef BloombergLP::bslma::SharedPtrInplaceRep<ELEMENT_TYPE> Rep;
5218 basicAllocator = BloombergLP::bslma::Default::allocator(basicAllocator);
5219 Rep *rep =
new (*basicAllocator) Rep(basicAllocator,
5221 SelfType(rep->ptr(), rep).swap(*
this);
5225#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_E >= 2
5226template <
class ELEMENT_TYPE>
5227template <
class ARGS_01,
5230shared_ptr<ELEMENT_TYPE>::createInplace(
5231 BloombergLP::bslma::Allocator *basicAllocator,
5235 typedef BloombergLP::bslma::SharedPtrInplaceRep<ELEMENT_TYPE> Rep;
5237 basicAllocator = BloombergLP::bslma::Default::allocator(basicAllocator);
5238 Rep *rep =
new (*basicAllocator) Rep(basicAllocator,
5241 SelfType(rep->ptr(), rep).swap(*
this);
5245#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_E >= 3
5246template <
class ELEMENT_TYPE>
5247template <
class ARGS_01,
5251shared_ptr<ELEMENT_TYPE>::createInplace(
5252 BloombergLP::bslma::Allocator *basicAllocator,
5257 typedef BloombergLP::bslma::SharedPtrInplaceRep<ELEMENT_TYPE> Rep;
5259 basicAllocator = BloombergLP::bslma::Default::allocator(basicAllocator);
5260 Rep *rep =
new (*basicAllocator) Rep(basicAllocator,
5264 SelfType(rep->ptr(), rep).swap(*
this);
5268#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_E >= 4
5269template <
class ELEMENT_TYPE>
5270template <
class ARGS_01,
5275shared_ptr<ELEMENT_TYPE>::createInplace(
5276 BloombergLP::bslma::Allocator *basicAllocator,
5282 typedef BloombergLP::bslma::SharedPtrInplaceRep<ELEMENT_TYPE> Rep;
5284 basicAllocator = BloombergLP::bslma::Default::allocator(basicAllocator);
5285 Rep *rep =
new (*basicAllocator) Rep(basicAllocator,
5290 SelfType(rep->ptr(), rep).swap(*
this);
5294#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_E >= 5
5295template <
class ELEMENT_TYPE>
5296template <
class ARGS_01,
5302shared_ptr<ELEMENT_TYPE>::createInplace(
5303 BloombergLP::bslma::Allocator *basicAllocator,
5310 typedef BloombergLP::bslma::SharedPtrInplaceRep<ELEMENT_TYPE> Rep;
5312 basicAllocator = BloombergLP::bslma::Default::allocator(basicAllocator);
5313 Rep *rep =
new (*basicAllocator) Rep(basicAllocator,
5319 SelfType(rep->ptr(), rep).swap(*
this);
5323#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_E >= 6
5324template <
class ELEMENT_TYPE>
5325template <
class ARGS_01,
5332shared_ptr<ELEMENT_TYPE>::createInplace(
5333 BloombergLP::bslma::Allocator *basicAllocator,
5341 typedef BloombergLP::bslma::SharedPtrInplaceRep<ELEMENT_TYPE> Rep;
5343 basicAllocator = BloombergLP::bslma::Default::allocator(basicAllocator);
5344 Rep *rep =
new (*basicAllocator) Rep(basicAllocator,
5351 SelfType(rep->ptr(), rep).swap(*
this);
5355#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_E >= 7
5356template <
class ELEMENT_TYPE>
5357template <
class ARGS_01,
5365shared_ptr<ELEMENT_TYPE>::createInplace(
5366 BloombergLP::bslma::Allocator *basicAllocator,
5375 typedef BloombergLP::bslma::SharedPtrInplaceRep<ELEMENT_TYPE> Rep;
5377 basicAllocator = BloombergLP::bslma::Default::allocator(basicAllocator);
5378 Rep *rep =
new (*basicAllocator) Rep(basicAllocator,
5386 SelfType(rep->ptr(), rep).swap(*
this);
5390#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_E >= 8
5391template <
class ELEMENT_TYPE>
5392template <
class ARGS_01,
5401shared_ptr<ELEMENT_TYPE>::createInplace(
5402 BloombergLP::bslma::Allocator *basicAllocator,
5412 typedef BloombergLP::bslma::SharedPtrInplaceRep<ELEMENT_TYPE> Rep;
5414 basicAllocator = BloombergLP::bslma::Default::allocator(basicAllocator);
5415 Rep *rep =
new (*basicAllocator) Rep(basicAllocator,
5424 SelfType(rep->ptr(), rep).swap(*
this);
5428#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_E >= 9
5429template <
class ELEMENT_TYPE>
5430template <
class ARGS_01,
5440shared_ptr<ELEMENT_TYPE>::createInplace(
5441 BloombergLP::bslma::Allocator *basicAllocator,
5452 typedef BloombergLP::bslma::SharedPtrInplaceRep<ELEMENT_TYPE> Rep;
5454 basicAllocator = BloombergLP::bslma::Default::allocator(basicAllocator);
5455 Rep *rep =
new (*basicAllocator) Rep(basicAllocator,
5465 SelfType(rep->ptr(), rep).swap(*
this);
5469#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_E >= 10
5470template <
class ELEMENT_TYPE>
5471template <
class ARGS_01,
5482shared_ptr<ELEMENT_TYPE>::createInplace(
5483 BloombergLP::bslma::Allocator *basicAllocator,
5495 typedef BloombergLP::bslma::SharedPtrInplaceRep<ELEMENT_TYPE> Rep;
5497 basicAllocator = BloombergLP::bslma::Default::allocator(basicAllocator);
5498 Rep *rep =
new (*basicAllocator) Rep(basicAllocator,
5509 SelfType(rep->ptr(), rep).swap(*
this);
5513#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_E >= 11
5514template <
class ELEMENT_TYPE>
5515template <
class ARGS_01,
5527shared_ptr<ELEMENT_TYPE>::createInplace(
5528 BloombergLP::bslma::Allocator *basicAllocator,
5541 typedef BloombergLP::bslma::SharedPtrInplaceRep<ELEMENT_TYPE> Rep;
5543 basicAllocator = BloombergLP::bslma::Default::allocator(basicAllocator);
5544 Rep *rep =
new (*basicAllocator) Rep(basicAllocator,
5556 SelfType(rep->ptr(), rep).swap(*
this);
5560#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_E >= 12
5561template <
class ELEMENT_TYPE>
5562template <
class ARGS_01,
5575shared_ptr<ELEMENT_TYPE>::createInplace(
5576 BloombergLP::bslma::Allocator *basicAllocator,
5590 typedef BloombergLP::bslma::SharedPtrInplaceRep<ELEMENT_TYPE> Rep;
5592 basicAllocator = BloombergLP::bslma::Default::allocator(basicAllocator);
5593 Rep *rep =
new (*basicAllocator) Rep(basicAllocator,
5606 SelfType(rep->ptr(), rep).swap(*
this);
5610#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_E >= 13
5611template <
class ELEMENT_TYPE>
5612template <
class ARGS_01,
5626shared_ptr<ELEMENT_TYPE>::createInplace(
5627 BloombergLP::bslma::Allocator *basicAllocator,
5642 typedef BloombergLP::bslma::SharedPtrInplaceRep<ELEMENT_TYPE> Rep;
5644 basicAllocator = BloombergLP::bslma::Default::allocator(basicAllocator);
5645 Rep *rep =
new (*basicAllocator) Rep(basicAllocator,
5659 SelfType(rep->ptr(), rep).swap(*
this);
5663#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_E >= 14
5664template <
class ELEMENT_TYPE>
5665template <
class ARGS_01,
5680shared_ptr<ELEMENT_TYPE>::createInplace(
5681 BloombergLP::bslma::Allocator *basicAllocator,
5697 typedef BloombergLP::bslma::SharedPtrInplaceRep<ELEMENT_TYPE> Rep;
5699 basicAllocator = BloombergLP::bslma::Default::allocator(basicAllocator);
5700 Rep *rep =
new (*basicAllocator) Rep(basicAllocator,
5715 SelfType(rep->ptr(), rep).swap(*
this);
5722template <
class ELEMENT_TYPE>
5723template <
class... ARGS>
5725shared_ptr<ELEMENT_TYPE>::createInplace(
5726 BloombergLP::bslma::Allocator *basicAllocator,
5729 typedef BloombergLP::bslma::SharedPtrInplaceRep<ELEMENT_TYPE> Rep;
5731 basicAllocator = BloombergLP::bslma::Default::allocator(basicAllocator);
5732 Rep *rep =
new (*basicAllocator) Rep(basicAllocator,
5734 SelfType(rep->ptr(), rep).swap(*
this);
5739template <
class ELEMENT_TYPE>
5740template <
class ANY_TYPE>
5742shared_ptr<ELEMENT_TYPE>::loadAlias(
const shared_ptr<ANY_TYPE>& source,
5743 ELEMENT_TYPE *
object)
5745 if (source.d_rep_p == d_rep_p &&
object) {
5749 SelfType(source,
object).swap(*
this);
5753template <
class ELEMENT_TYPE>
5754pair<typename shared_ptr<ELEMENT_TYPE>::element_type *, BloombergLP::bslma::SharedPtrRep *>
5757 pair<element_type *, BloombergLP::bslma::SharedPtrRep *> ret(d_ptr_p,
5764#ifndef BDE_OMIT_INTERNAL_DEPRECATED
5766template <
class ELEMENT_TYPE>
5773template <
class ELEMENT_TYPE>
5774template <
class COMPATIBLE_TYPE>
5776void shared_ptr<ELEMENT_TYPE>::load(COMPATIBLE_TYPE *ptr)
5778 SelfType(ptr).swap(*
this);
5781template <
class ELEMENT_TYPE>
5782template <
class COMPATIBLE_TYPE>
5785shared_ptr<ELEMENT_TYPE>::load(COMPATIBLE_TYPE *ptr,
5786 BloombergLP::bslma::Allocator *basicAllocator)
5788 SelfType(ptr, basicAllocator).swap(*
this);
5791template <
class ELEMENT_TYPE>
5792template <
class COMPATIBLE_TYPE,
class DELETER>
5795shared_ptr<ELEMENT_TYPE>::load(COMPATIBLE_TYPE *ptr,
5796 const DELETER& deleter,
5797 BloombergLP::bslma::Allocator *basicAllocator)
5799 SelfType(ptr, deleter, basicAllocator).swap(*
this);
5804template <
class ELEMENT_TYPE>
5806#if defined(BSLS_PLATFORM_CMP_IBM)
5807shared_ptr<ELEMENT_TYPE>::operator
typename shared_ptr::BoolType() const
5813 return BloombergLP::bsls::UnspecifiedBool<shared_ptr>::makeValue(d_ptr_p);
5816template <
class ELEMENT_TYPE>
5818typename add_lvalue_reference<ELEMENT_TYPE>::type
5826template <
class ELEMENT_TYPE>
5828ELEMENT_TYPE *shared_ptr<ELEMENT_TYPE>::operator->() const
5834template <
class ELEMENT_TYPE>
5836typename shared_ptr<ELEMENT_TYPE>::element_type *
5842template <
class ELEMENT_TYPE>
5844add_lvalue_reference<typename shared_ptr<ELEMENT_TYPE>::element_type>::type
5845shared_ptr<ELEMENT_TYPE>::operator[](ptrdiff_t index)
const
5849 return *(d_ptr_p + index);
5852template <
class ELEMENT_TYPE>
5853template<
class ANY_TYPE>
5855bool shared_ptr<ELEMENT_TYPE>::owner_before(
const shared_ptr<ANY_TYPE>& other)
5858 return std::less<BloombergLP::bslma::SharedPtrRep *>()(rep(), other.rep());
5861template <
class ELEMENT_TYPE>
5862template<
class ANY_TYPE>
5865shared_ptr<ELEMENT_TYPE>::owner_before(
const weak_ptr<ANY_TYPE>& other)
const
5868 return std::less<BloombergLP::bslma::SharedPtrRep *>()(rep(), other.rep());
5871template <
class ELEMENT_TYPE>
5872template<
class ANY_TYPE>
5874bool shared_ptr<ELEMENT_TYPE>::owner_equal(
const shared_ptr<ANY_TYPE>& other)
5877 return rep() == other.rep();
5880template <
class ELEMENT_TYPE>
5881template<
class ANY_TYPE>
5884shared_ptr<ELEMENT_TYPE>::owner_equal(
const weak_ptr<ANY_TYPE>& other)
const
5887 return rep() == other.rep();
5890template <
class ELEMENT_TYPE>
5895 return hash<BloombergLP::bslma::SharedPtrRep *>()(rep());
5898template <
class ELEMENT_TYPE>
5902 return 1 == use_count();
5905template <
class ELEMENT_TYPE>
5913template <
class ELEMENT_TYPE>
5914BloombergLP::bslma::ManagedPtr<ELEMENT_TYPE>
5915shared_ptr<ELEMENT_TYPE>::managedPtr()
const
5917 if (d_rep_p && d_ptr_p) {
5919 return BloombergLP::bslma::ManagedPtr<ELEMENT_TYPE>(d_ptr_p,
5921 &BloombergLP::bslma::SharedPtrRep::managedPtrDeleter);
5925 return BloombergLP::bslma::ManagedPtr<ELEMENT_TYPE>(
5927 (BloombergLP::bslma::SharedPtrRep *)0,
5928 &BloombergLP::bslma::SharedPtrRep::managedPtrEmptyDeleter);
5931template <
class ELEMENT_TYPE>
5933BloombergLP::bslma::SharedPtrRep *shared_ptr<ELEMENT_TYPE>::rep() const
5939#ifndef BDE_OMIT_INTERNAL_DEPRECATED
5941template <
class ELEMENT_TYPE>
5948template <
class ELEMENT_TYPE>
5950typename shared_ptr<ELEMENT_TYPE>::element_type *
5962template <
class ELEMENT_TYPE>
5971template <
class ELEMENT_TYPE>
5972weak_ptr<ELEMENT_TYPE>::weak_ptr(
5973 BloombergLP::bslmf::MovableRef<weak_ptr> original)
5975: d_ptr_p(BloombergLP::bslmf::MovableRefUtil::access(original).d_ptr_p)
5976, d_rep_p(BloombergLP::bslmf::MovableRefUtil::access(original).d_rep_p)
5978 BloombergLP::bslmf::MovableRefUtil::access(original).d_rep_p = 0;
5982#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
5983template <
class ELEMENT_TYPE>
5984template <
class COMPATIBLE_TYPE
5986weak_ptr<ELEMENT_TYPE>::weak_ptr(weak_ptr<COMPATIBLE_TYPE>&& original)
5988: d_ptr_p(original.d_ptr_p)
5989, d_rep_p(original.d_rep_p)
5991 original.d_rep_p = 0;
5995template <
class ELEMENT_TYPE>
5996template <
class CONVERTIBLE_TYPE
5998weak_ptr<ELEMENT_TYPE>::weak_ptr(
5999 BloombergLP::bslmf::MovableRef<weak_ptr<CONVERTIBLE_TYPE> > original)
6001: d_ptr_p(original.d_ptr_p)
6002, d_rep_p(original.d_rep_p)
6004 original.d_rep_p = 0;
6009template <
class ELEMENT_TYPE>
6010weak_ptr<ELEMENT_TYPE>::weak_ptr(
const weak_ptr<ELEMENT_TYPE>& original)
6012: d_ptr_p(original.d_ptr_p)
6013, d_rep_p(original.d_rep_p)
6020template <
class ELEMENT_TYPE>
6021template <
class COMPATIBLE_TYPE
6023weak_ptr<ELEMENT_TYPE>::weak_ptr(
const shared_ptr<COMPATIBLE_TYPE>& other)
6025: d_ptr_p(other.get())
6026, d_rep_p(other.rep())
6033template <
class ELEMENT_TYPE>
6034template <
class COMPATIBLE_TYPE
6036weak_ptr<ELEMENT_TYPE>::weak_ptr(
const weak_ptr<COMPATIBLE_TYPE>& other)
6038: d_ptr_p(other.d_ptr_p)
6039, d_rep_p(other.d_rep_p)
6046template <
class ELEMENT_TYPE>
6048weak_ptr<ELEMENT_TYPE>::~weak_ptr()
6056template <
class ELEMENT_TYPE>
6058void weak_ptr<ELEMENT_TYPE>::privateAssign(
6059 BloombergLP::bslma::SharedPtrRep *rep,
6060 ELEMENT_TYPE *target)
6072template <
class ELEMENT_TYPE>
6073weak_ptr<ELEMENT_TYPE>& weak_ptr<ELEMENT_TYPE>::operator=(
6074 BloombergLP::bslmf::MovableRef<weak_ptr> rhs)
6077 weak_ptr tmp(BloombergLP::bslmf::MovableRefUtil::move(rhs));
6082#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
6083template <
class ELEMENT_TYPE>
6084template <
class COMPATIBLE_TYPE>
6086 is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value,
6087 weak_ptr<ELEMENT_TYPE>&>::type
6088weak_ptr<ELEMENT_TYPE>::operator=(weak_ptr<COMPATIBLE_TYPE>&& rhs)
6091 weak_ptr tmp(BloombergLP::bslmf::MovableRefUtil::move(rhs));
6096template <
class ELEMENT_TYPE>
6097template <
class COMPATIBLE_TYPE>
6099 is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value,
6100 weak_ptr<ELEMENT_TYPE>&>::type
6101weak_ptr<ELEMENT_TYPE>::operator=(
6102 BloombergLP::bslmf::MovableRef<weak_ptr<COMPATIBLE_TYPE> > rhs)
6105 weak_ptr tmp(BloombergLP::bslmf::MovableRefUtil::move(rhs));
6111template <
class ELEMENT_TYPE>
6112weak_ptr<ELEMENT_TYPE>& weak_ptr<ELEMENT_TYPE>::operator=(
6113 const weak_ptr<ELEMENT_TYPE>& rhs)
6121 privateAssign(
rhs.d_rep_p,
rhs.d_ptr_p);
6126template <
class ELEMENT_TYPE>
6127template <
class COMPATIBLE_TYPE>
6129 is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value,
6130 weak_ptr<ELEMENT_TYPE>&>::type
6131weak_ptr<ELEMENT_TYPE>::operator=(
const shared_ptr<COMPATIBLE_TYPE>& rhs)
6139 privateAssign(
rhs.d_rep_p,
rhs.d_ptr_p);
6144template <
class ELEMENT_TYPE>
6145template <
class COMPATIBLE_TYPE>
6147 is_convertible<COMPATIBLE_TYPE *, ELEMENT_TYPE *>::value,
6148 weak_ptr<ELEMENT_TYPE>&>::type
6149weak_ptr<ELEMENT_TYPE>::operator=(
const weak_ptr<COMPATIBLE_TYPE>& rhs)
6157 privateAssign(
rhs.d_rep_p,
rhs.d_ptr_p);
6162template <
class ELEMENT_TYPE>
6174template <
class ELEMENT_TYPE>
6176void weak_ptr<ELEMENT_TYPE>::swap(weak_ptr<ELEMENT_TYPE>& other)
6185 ELEMENT_TYPE *tempPtr_p = d_ptr_p;
6186 d_ptr_p = other.d_ptr_p;
6187 other.d_ptr_p = tempPtr_p;
6189 BloombergLP::bslma::SharedPtrRep *tempRep_p = d_rep_p;
6190 d_rep_p = other.d_rep_p;
6191 other.d_rep_p = tempRep_p;
6195template <
class ELEMENT_TYPE>
6202template <
class ELEMENT_TYPE>
6203shared_ptr<ELEMENT_TYPE> weak_ptr<ELEMENT_TYPE>::lock() const
6207 return shared_ptr<ELEMENT_TYPE>(
6210 BloombergLP::bslstl::SharedPtr_RepFromExistingSharedPtr());
6213 return shared_ptr<ELEMENT_TYPE>();
6216template <
class ELEMENT_TYPE>
6217template <
class ANY_TYPE>
6220weak_ptr<ELEMENT_TYPE>::owner_before(
const shared_ptr<ANY_TYPE>& other)
const
6223 return std::less<BloombergLP::bslma::SharedPtrRep *>()(d_rep_p,
6227template <
class ELEMENT_TYPE>
6228template <
class ANY_TYPE>
6231weak_ptr<ELEMENT_TYPE>::owner_before(
const weak_ptr<ANY_TYPE>& other)
const
6234 return std::less<BloombergLP::bslma::SharedPtrRep *>()(d_rep_p,
6238template <
class ELEMENT_TYPE>
6239template<
class ANY_TYPE>
6242weak_ptr<ELEMENT_TYPE>::owner_equal(
const shared_ptr<ANY_TYPE>& other)
6245 return rep() == other.rep();
6248template <
class ELEMENT_TYPE>
6249template<
class ANY_TYPE>
6252weak_ptr<ELEMENT_TYPE>::owner_equal(
const weak_ptr<ANY_TYPE>& other)
const
6255 return rep() == other.rep();
6258template <
class ELEMENT_TYPE>
6263 return hash<BloombergLP::bslma::SharedPtrRep *>()(rep());
6266template <
class ELEMENT_TYPE>
6268BloombergLP::bslma::SharedPtrRep *weak_ptr<ELEMENT_TYPE>::rep() const
6274template <
class ELEMENT_TYPE>
6281#ifndef BDE_OMIT_INTERNAL_DEPRECATED
6283template <
class ELEMENT_TYPE>
6285shared_ptr<ELEMENT_TYPE> weak_ptr<ELEMENT_TYPE>::acquireSharedPtr() const
6291template <
class ELEMENT_TYPE>
6308template <
class SHARED_TYPE,
class ENABLE_TYPE>
6316 if (0 != result && result->d_weakThis.expired()) {
6317 result->d_weakThis.privateAssign(
6319 const_cast <ENABLE_TYPE *
>(
6320 static_cast<ENABLE_TYPE const*
>(sharedPtr->d_ptr_p)));
6336template <
class TARGET,
class SOURCE>
6343 target->
reset(source,
const_cast<TARGET *
>(source.
get()));
6346template <
class TARGET,
class SOURCE>
6353 const_cast<TARGET *
>(source.
get()));
6356template <
class TARGET,
class SOURCE>
6363 if (TARGET *castPtr =
dynamic_cast<TARGET *
>(source.
get())) {
6364 target->
reset(source, castPtr);
6371template <
class TARGET,
class SOURCE>
6377 if (TARGET *castPtr =
dynamic_cast<TARGET *
>(source.
get())) {
6384template <
class TARGET,
class SOURCE>
6391 target->
reset(source,
static_cast<TARGET *
>(source.
get()));
6394template <
class TARGET,
class SOURCE>
6401 static_cast<TARGET *
>(source.
get()));
6421template <
class ANY_TYPE>
6430template <
class ANY_TYPE>
6469template <
class LHS_TYPE,
class RHS_TYPE>
6474 return lhs.get() ==
rhs.get();
6477#ifdef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
6479template<
class LHS_TYPE,
class RHS_TYPE>
6481bsl::strong_ordering bsl::operator<=>(
const shared_ptr<LHS_TYPE>& lhs,
6482 const shared_ptr<RHS_TYPE>& rhs)
6485 const void *p1 =
lhs.get(),
6492template <
class LHS_TYPE,
class RHS_TYPE>
6500template <
class LHS_TYPE,
class RHS_TYPE>
6505 return std::less<const void *>()(
lhs.get(),
rhs.get());
6508template <
class LHS_TYPE,
class RHS_TYPE>
6516template <
class LHS_TYPE,
class RHS_TYPE>
6524template <
class LHS_TYPE,
class RHS_TYPE>
6534template <
class LHS_TYPE>
6542#ifdef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
6546bsl::strong_ordering bsl::operator<=>(
const shared_ptr<TYPE>& ptr,
6549 const typename shared_ptr<TYPE>::element_type *null =
nullptr;
6550 return ptr.get() <=> null;
6555template <
class RHS_TYPE>
6563template <
class LHS_TYPE>
6568 return static_cast<bool>(
lhs);
6571template <
class RHS_TYPE>
6576 return static_cast<bool>(
rhs);
6579template <
class LHS_TYPE>
6584 return std::less<LHS_TYPE *>()(
lhs.get(), 0);
6587template <
class RHS_TYPE>
6592 return std::less<RHS_TYPE *>()(0,
rhs.get());
6595template <
class LHS_TYPE>
6600 return !std::less<LHS_TYPE *>()(0,
lhs.get());
6603template <
class RHS_TYPE>
6608 return !std::less<RHS_TYPE *>()(
rhs.get(), 0);
6611template <
class LHS_TYPE>
6616 return std::less<LHS_TYPE *>()(0,
lhs.get());
6619template <
class RHS_TYPE>
6624 return std::less<RHS_TYPE *>()(
rhs.get(), 0);
6627template <
class LHS_TYPE>
6632 return !std::less<LHS_TYPE *>()(
lhs.get(), 0);
6635template <
class RHS_TYPE>
6640 return !std::less<RHS_TYPE *>()(0,
rhs.get());
6645template <
class CHAR_TYPE,
class CHAR_TRAITS,
class ELEMENT_TYPE>
6647std::basic_ostream<CHAR_TYPE, CHAR_TRAITS>&
6649 const shared_ptr<ELEMENT_TYPE>& rhs)
6651 return stream <<
rhs.get();
6655template <
class HASHALG,
class ELEMENT_TYPE>
6657void bsl::hashAppend(HASHALG& hashAlg,
const shared_ptr<ELEMENT_TYPE>& input)
6662template <
class ELEMENT_TYPE>
6664void bsl::swap(shared_ptr<ELEMENT_TYPE>& a, shared_ptr<ELEMENT_TYPE>& b)
6670template <
class ELEMENT_TYPE>
6672void bsl::swap(weak_ptr<ELEMENT_TYPE>& a, weak_ptr<ELEMENT_TYPE>& b)
6679template<
class DELETER,
class ELEMENT_TYPE>
6684 BloombergLP::bslma::SharedPtrRep *rep = p.rep();
6685 return rep ?
static_cast<DELETER *
>(rep->getDeleter(
typeid(DELETER))) : 0;
6689template<
class TO_TYPE,
class FROM_TYPE>
6695 return shared_ptr<TO_TYPE>(source,
const_cast<TO_TYPE *
>(source.
get()));
6698template<
class TO_TYPE,
class FROM_TYPE>
6704 if (TO_TYPE *castPtr =
dynamic_cast<TO_TYPE *
>(source.
get())) {
6705 return shared_ptr<TO_TYPE>(source, castPtr);
6708 return shared_ptr<TO_TYPE>();
6711template<
class TO_TYPE,
class FROM_TYPE>
6717 return shared_ptr<TO_TYPE>(source,
static_cast<TO_TYPE *
>(source.
get()));
6720template<
class TO_TYPE,
class FROM_TYPE>
6726 return shared_ptr<TO_TYPE>(source,
6727 reinterpret_cast<TO_TYPE *
>(source.
get()));
6736#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
6739#ifndef BSLSTL_SHAREDPTR_VARIADIC_LIMIT
6740#define BSLSTL_SHAREDPTR_VARIADIC_LIMIT 14
6742#ifndef BSLSTL_SHAREDPTR_VARIADIC_LIMIT_F
6743#define BSLSTL_SHAREDPTR_VARIADIC_LIMIT_F BSLSTL_SHAREDPTR_VARIADIC_LIMIT
6746#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_F >= 0
6747template<
class ELEMENT_TYPE,
class ALLOC>
6753 typedef BloombergLP::bslma::PointerUtil PtrUtil;
6755 typedef BloombergLP::bslstl::
6756 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, ALLOC> Rep;
6757 Rep *rep_p = Rep::makeRep(basicAllocator);
6759 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
6762 PtrUtil::unqualify(rep_p->ptr()));
6764 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
6768#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_F >= 1
6769template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01>
6776 typedef BloombergLP::bslma::PointerUtil PtrUtil;
6778 typedef BloombergLP::bslstl::
6779 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, ALLOC> Rep;
6780 Rep *rep_p = Rep::makeRep(basicAllocator);
6782 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
6785 PtrUtil::unqualify(rep_p->ptr()),
6788 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
6792#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_F >= 2
6793template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
6802 typedef BloombergLP::bslma::PointerUtil PtrUtil;
6804 typedef BloombergLP::bslstl::
6805 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, ALLOC> Rep;
6806 Rep *rep_p = Rep::makeRep(basicAllocator);
6808 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
6811 PtrUtil::unqualify(rep_p->ptr()),
6815 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
6819#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_F >= 3
6820template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
6831 typedef BloombergLP::bslma::PointerUtil PtrUtil;
6833 typedef BloombergLP::bslstl::
6834 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, ALLOC> Rep;
6835 Rep *rep_p = Rep::makeRep(basicAllocator);
6837 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
6840 PtrUtil::unqualify(rep_p->ptr()),
6845 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
6849#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_F >= 4
6850template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
6863 typedef BloombergLP::bslma::PointerUtil PtrUtil;
6865 typedef BloombergLP::bslstl::
6866 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, ALLOC> Rep;
6867 Rep *rep_p = Rep::makeRep(basicAllocator);
6869 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
6872 PtrUtil::unqualify(rep_p->ptr()),
6878 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
6882#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_F >= 5
6883template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
6898 typedef BloombergLP::bslma::PointerUtil PtrUtil;
6900 typedef BloombergLP::bslstl::
6901 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, ALLOC> Rep;
6902 Rep *rep_p = Rep::makeRep(basicAllocator);
6904 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
6907 PtrUtil::unqualify(rep_p->ptr()),
6914 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
6918#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_F >= 6
6919template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
6936 typedef BloombergLP::bslma::PointerUtil PtrUtil;
6938 typedef BloombergLP::bslstl::
6939 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, ALLOC> Rep;
6940 Rep *rep_p = Rep::makeRep(basicAllocator);
6942 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
6945 PtrUtil::unqualify(rep_p->ptr()),
6953 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
6957#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_F >= 7
6958template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
6977 typedef BloombergLP::bslma::PointerUtil PtrUtil;
6979 typedef BloombergLP::bslstl::
6980 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, ALLOC> Rep;
6981 Rep *rep_p = Rep::makeRep(basicAllocator);
6983 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
6986 PtrUtil::unqualify(rep_p->ptr()),
6995 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
6999#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_F >= 8
7000template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
7021 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7023 typedef BloombergLP::bslstl::
7024 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, ALLOC> Rep;
7025 Rep *rep_p = Rep::makeRep(basicAllocator);
7027 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7030 PtrUtil::unqualify(rep_p->ptr()),
7040 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7044#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_F >= 9
7045template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
7068 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7070 typedef BloombergLP::bslstl::
7071 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, ALLOC> Rep;
7072 Rep *rep_p = Rep::makeRep(basicAllocator);
7074 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7077 PtrUtil::unqualify(rep_p->ptr()),
7088 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7092#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_F >= 10
7093template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
7118 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7120 typedef BloombergLP::bslstl::
7121 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, ALLOC> Rep;
7122 Rep *rep_p = Rep::makeRep(basicAllocator);
7124 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7127 PtrUtil::unqualify(rep_p->ptr()),
7139 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7143#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_F >= 11
7144template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
7171 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7173 typedef BloombergLP::bslstl::
7174 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, ALLOC> Rep;
7175 Rep *rep_p = Rep::makeRep(basicAllocator);
7177 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7180 PtrUtil::unqualify(rep_p->ptr()),
7193 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7197#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_F >= 12
7198template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
7227 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7229 typedef BloombergLP::bslstl::
7230 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, ALLOC> Rep;
7231 Rep *rep_p = Rep::makeRep(basicAllocator);
7233 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7236 PtrUtil::unqualify(rep_p->ptr()),
7250 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7254#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_F >= 13
7255template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
7286 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7288 typedef BloombergLP::bslstl::
7289 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, ALLOC> Rep;
7290 Rep *rep_p = Rep::makeRep(basicAllocator);
7292 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7295 PtrUtil::unqualify(rep_p->ptr()),
7310 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7314#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_F >= 14
7315template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
7348 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7350 typedef BloombergLP::bslstl::
7351 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, ALLOC> Rep;
7352 Rep *rep_p = Rep::makeRep(basicAllocator);
7354 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7357 PtrUtil::unqualify(rep_p->ptr()),
7373 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7381template<
class ELEMENT_TYPE,
class ALLOC,
class... ARGS>
7388 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7390 typedef BloombergLP::bslstl::
7391 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, ALLOC> Rep;
7392 Rep *rep_p = Rep::makeRep(basicAllocator);
7394 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7397 PtrUtil::unqualify(rep_p->ptr()),
7400 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7405template<
class ARRAY_TYPE,
class ALLOC>
7412 typedef BloombergLP::bslstl::SharedPtr_ImpUtil ImpUtil;
7415 rebind_traits<Element_type>::allocator_type ElementAllocatorType;
7416 typedef BloombergLP::bslstl::
7417 SharedPtrArrayAllocateInplaceRep<ARRAY_TYPE, ALLOC> Rep;
7419 const size_t numElements = ImpUtil::Extent<ARRAY_TYPE>::value;
7420 Rep *rep_p = Rep::makeRep(basicAllocator, numElements);
7422 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7423 BloombergLP::bslalg::ArrayPrimitives::defaultConstruct(
7424 static_cast<Element_type *
> (rep_p->ptr()),
7426 ElementAllocatorType(basicAllocator));
7429 BloombergLP::bslma::SharedPtrRep *upcastRep = rep_p;
7430 return shared_ptr<ARRAY_TYPE>(rep_p->ptr(), upcastRep);
7433template<
class ARRAY_TYPE,
class ALLOC>
7439 ALLOC basicAllocator,
7442 typedef BloombergLP::bslstl::SharedPtr_ImpUtil ImpUtil;
7445 rebind_traits<Element_type>::allocator_type ElementAllocatorType;
7446 typedef BloombergLP::bslstl::
7447 SharedPtrArrayAllocateInplaceRep<ARRAY_TYPE, ALLOC> Rep;
7449 const size_t numElements = ImpUtil::Extent<ARRAY_TYPE>::value;
7450 Rep *rep_p = Rep::makeRep(basicAllocator, numElements);
7452 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7453 BloombergLP::bslalg::ArrayPrimitives::uninitializedFillN(
7454 static_cast<Element_type *
> (rep_p->ptr()),
7457 ElementAllocatorType(basicAllocator));
7460 BloombergLP::bslma::SharedPtrRep *upcastRep = rep_p;
7461 return shared_ptr<ARRAY_TYPE>(rep_p->ptr(), upcastRep);
7464template<
class ARRAY_TYPE,
class ALLOC>
7473 rebind_traits<Element_type>::allocator_type ElementAllocatorType;
7474 typedef BloombergLP::bslstl::
7475 SharedPtrArrayAllocateInplaceRep<ARRAY_TYPE, ALLOC> Rep;
7477 Rep *rep_p = Rep::makeRep(basicAllocator, numElements);
7479 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7480 BloombergLP::bslalg::ArrayPrimitives::defaultConstruct(
7481 static_cast<Element_type *
> (rep_p->ptr()),
7483 ElementAllocatorType(basicAllocator));
7486 BloombergLP::bslma::SharedPtrRep *upcastRep = rep_p;
7487 return shared_ptr<ARRAY_TYPE>(rep_p->ptr(), upcastRep);
7490template<
class ARRAY_TYPE,
class ALLOC>
7496 ALLOC basicAllocator,
7502 rebind_traits<Element_type>::allocator_type ElementAllocatorType;
7503 typedef BloombergLP::bslstl::
7504 SharedPtrArrayAllocateInplaceRep<ARRAY_TYPE, ALLOC> Rep;
7506 Rep *rep_p = Rep::makeRep(basicAllocator, numElements);
7508 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7509 BloombergLP::bslalg::ArrayPrimitives::uninitializedFillN(
7510 static_cast<Element_type *
> (rep_p->ptr()),
7513 ElementAllocatorType(basicAllocator));
7516 BloombergLP::bslma::SharedPtrRep *upcastRep = rep_p;
7517 return shared_ptr<ARRAY_TYPE>(rep_p->ptr(), upcastRep);
7524template<
class ELEMENT_TYPE,
class ALLOC>
7531 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7533 typedef BloombergLP::bslstl::
7534 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, ALLOC> Rep;
7535 Rep *rep_p = Rep::makeRep(basicAllocator);
7537 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7538 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE;
7541 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7544template<class ARRAY_TYPE, class ALLOC>
7546typename
bsl::enable_if<
bsl::is_bounded_array<ARRAY_TYPE>::value &&
7547 !
bsl::is_pointer<ALLOC>::value,
7548 bsl::shared_ptr<ARRAY_TYPE> >::type
7549bsl::allocate_shared_for_overwrite(ALLOC basicAllocator)
7551 typedef BloombergLP::bslstl::SharedPtr_ImpUtil ImpUtil;
7552 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7554 typedef BloombergLP::bslstl::
7555 SharedPtrArrayAllocateInplaceRep<ARRAY_TYPE, ALLOC> Rep;
7557 const size_t numElements = ImpUtil::Extent<ARRAY_TYPE>::value;
7558 Rep *rep_p = Rep::makeRep(basicAllocator, numElements);
7560 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7561 ::new (PtrUtil::voidify(rep_p->ptr())) ARRAY_TYPE;
7564 BloombergLP::
bslma::SharedPtrRep *upcastRep = rep_p;
7565 return shared_ptr<ARRAY_TYPE>(rep_p->ptr(), upcastRep);
7568template<class ARRAY_TYPE, class ALLOC>
7570typename
bsl::enable_if<
bsl::is_unbounded_array<ARRAY_TYPE>::value &&
7571 !
bsl::is_pointer<ALLOC>::value,
7572 bsl::shared_ptr<ARRAY_TYPE> >::type
7573bsl::allocate_shared_for_overwrite(ALLOC basicAllocator,
size_t numElements)
7576 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7578 typedef BloombergLP::bslstl::
7579 SharedPtrArrayAllocateInplaceRep<ARRAY_TYPE, ALLOC> Rep;
7581 Rep *rep_p = Rep::makeRep(basicAllocator, numElements);
7583 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7584 ::new (PtrUtil::voidify(rep_p->ptr())) Element_type[numElements];
7587 BloombergLP::
bslma::SharedPtrRep *upcastRep = rep_p;
7588 return shared_ptr<ARRAY_TYPE>(rep_p->ptr(), upcastRep);
7595#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
7598#ifndef BSLSTL_SHAREDPTR_VARIADIC_LIMIT
7599#define BSLSTL_SHAREDPTR_VARIADIC_LIMIT 14
7601#ifndef BSLSTL_SHAREDPTR_VARIADIC_LIMIT_G
7602#define BSLSTL_SHAREDPTR_VARIADIC_LIMIT_G BSLSTL_SHAREDPTR_VARIADIC_LIMIT
7604#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_G >= 0
7605template<
class ELEMENT_TYPE,
class ALLOC>
7613 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7615 typedef BloombergLP::bslstl::
7616 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
7617 AllocatorType alloc(basicAllocator);
7618 Rep *rep_p = Rep::makeRep(alloc);
7620 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7621 AllocatorTraits::construct(alloc,
7622 PtrUtil::unqualify(rep_p->ptr()));
7624 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7628#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_G >= 1
7629template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01>
7638 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7640 typedef BloombergLP::bslstl::
7641 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
7642 AllocatorType alloc(basicAllocator);
7643 Rep *rep_p = Rep::makeRep(alloc);
7645 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7646 AllocatorTraits::construct(alloc,
7647 PtrUtil::unqualify(rep_p->ptr()),
7650 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7654#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_G >= 2
7655template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
7666 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7668 typedef BloombergLP::bslstl::
7669 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
7670 AllocatorType alloc(basicAllocator);
7671 Rep *rep_p = Rep::makeRep(alloc);
7673 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7674 AllocatorTraits::construct(alloc,
7675 PtrUtil::unqualify(rep_p->ptr()),
7679 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7683#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_G >= 3
7684template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
7697 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7699 typedef BloombergLP::bslstl::
7700 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
7701 AllocatorType alloc(basicAllocator);
7702 Rep *rep_p = Rep::makeRep(alloc);
7704 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7705 AllocatorTraits::construct(alloc,
7706 PtrUtil::unqualify(rep_p->ptr()),
7711 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7715#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_G >= 4
7716template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
7731 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7733 typedef BloombergLP::bslstl::
7734 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
7735 AllocatorType alloc(basicAllocator);
7736 Rep *rep_p = Rep::makeRep(alloc);
7738 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7739 AllocatorTraits::construct(alloc,
7740 PtrUtil::unqualify(rep_p->ptr()),
7746 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7750#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_G >= 5
7751template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
7768 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7770 typedef BloombergLP::bslstl::
7771 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
7772 AllocatorType alloc(basicAllocator);
7773 Rep *rep_p = Rep::makeRep(alloc);
7775 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7776 AllocatorTraits::construct(alloc,
7777 PtrUtil::unqualify(rep_p->ptr()),
7784 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7788#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_G >= 6
7789template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
7808 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7810 typedef BloombergLP::bslstl::
7811 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
7812 AllocatorType alloc(basicAllocator);
7813 Rep *rep_p = Rep::makeRep(alloc);
7815 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7816 AllocatorTraits::construct(alloc,
7817 PtrUtil::unqualify(rep_p->ptr()),
7825 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7829#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_G >= 7
7830template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
7851 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7853 typedef BloombergLP::bslstl::
7854 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
7855 AllocatorType alloc(basicAllocator);
7856 Rep *rep_p = Rep::makeRep(alloc);
7858 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7859 AllocatorTraits::construct(alloc,
7860 PtrUtil::unqualify(rep_p->ptr()),
7869 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7873#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_G >= 8
7874template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
7897 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7899 typedef BloombergLP::bslstl::
7900 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
7901 AllocatorType alloc(basicAllocator);
7902 Rep *rep_p = Rep::makeRep(alloc);
7904 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7905 AllocatorTraits::construct(alloc,
7906 PtrUtil::unqualify(rep_p->ptr()),
7916 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7920#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_G >= 9
7921template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
7946 typedef BloombergLP::bslma::PointerUtil PtrUtil;
7948 typedef BloombergLP::bslstl::
7949 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
7950 AllocatorType alloc(basicAllocator);
7951 Rep *rep_p = Rep::makeRep(alloc);
7953 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
7954 AllocatorTraits::construct(alloc,
7955 PtrUtil::unqualify(rep_p->ptr()),
7966 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
7970#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_G >= 10
7971template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
7998 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8000 typedef BloombergLP::bslstl::
8001 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8002 AllocatorType alloc(basicAllocator);
8003 Rep *rep_p = Rep::makeRep(alloc);
8005 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8006 AllocatorTraits::construct(alloc,
8007 PtrUtil::unqualify(rep_p->ptr()),
8019 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8023#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_G >= 11
8024template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
8053 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8055 typedef BloombergLP::bslstl::
8056 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8057 AllocatorType alloc(basicAllocator);
8058 Rep *rep_p = Rep::makeRep(alloc);
8060 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8061 AllocatorTraits::construct(alloc,
8062 PtrUtil::unqualify(rep_p->ptr()),
8075 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8079#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_G >= 12
8080template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
8111 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8113 typedef BloombergLP::bslstl::
8114 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8115 AllocatorType alloc(basicAllocator);
8116 Rep *rep_p = Rep::makeRep(alloc);
8118 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8119 AllocatorTraits::construct(alloc,
8120 PtrUtil::unqualify(rep_p->ptr()),
8134 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8138#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_G >= 13
8139template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
8172 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8174 typedef BloombergLP::bslstl::
8175 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8176 AllocatorType alloc(basicAllocator);
8177 Rep *rep_p = Rep::makeRep(alloc);
8179 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8180 AllocatorTraits::construct(alloc,
8181 PtrUtil::unqualify(rep_p->ptr()),
8196 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8200#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_G >= 14
8201template<
class ELEMENT_TYPE,
class ALLOC,
class ARGS_01,
8236 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8238 typedef BloombergLP::bslstl::
8239 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8240 AllocatorType alloc(basicAllocator);
8241 Rep *rep_p = Rep::makeRep(alloc);
8243 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8244 AllocatorTraits::construct(alloc,
8245 PtrUtil::unqualify(rep_p->ptr()),
8261 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8268template<
class ELEMENT_TYPE,
class ALLOC,
class... ARGS>
8277 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8279 typedef BloombergLP::bslstl::
8280 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8281 AllocatorType alloc(basicAllocator);
8282 Rep *rep_p = Rep::makeRep(alloc);
8284 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8285 AllocatorTraits::construct(alloc,
8286 PtrUtil::unqualify(rep_p->ptr()),
8289 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8294template<
class ARRAY_TYPE,
class ALLOC>
8300 typedef BloombergLP::bslstl::SharedPtr_ImpUtil ImpUtil;
8302 typedef BloombergLP::bslstl::SharedPtrArrayAllocateInplaceRep<
8306 const size_t numElements = ImpUtil::Extent<ARRAY_TYPE>::value;
8307 AllocatorType alloc(basicAllocator);
8308 Rep *rep_p = Rep::makeRep(alloc, numElements);
8310 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8311 BloombergLP::bslalg::ArrayPrimitives::defaultConstruct(rep_p->ptr(),
8316 BloombergLP::bslma::SharedPtrRep *upcastRep = rep_p;
8317 return shared_ptr<ARRAY_TYPE>(rep_p->ptr(), upcastRep);
8320template<
class ARRAY_TYPE,
class ALLOC>
8325 ALLOC *basicAllocator,
8328 typedef BloombergLP::bslstl::SharedPtr_ImpUtil ImpUtil;
8331 typedef BloombergLP::bslstl::SharedPtrArrayAllocateInplaceRep<
8335 const size_t numElements = ImpUtil::Extent<ARRAY_TYPE>::value;
8336 AllocatorType alloc(basicAllocator);
8337 Rep *rep_p = Rep::makeRep(alloc, numElements);
8339 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8340 BloombergLP::bslalg::ArrayPrimitives::uninitializedFillN(
8341 static_cast<Element_type *
> (rep_p->ptr()),
8347 BloombergLP::bslma::SharedPtrRep *upcastRep = rep_p;
8348 return shared_ptr<ARRAY_TYPE>(rep_p->ptr(), upcastRep);
8351template<
class ARRAY_TYPE,
class ALLOC>
8358 typedef BloombergLP::bslstl::SharedPtrArrayAllocateInplaceRep<
8361 AllocatorType alloc(basicAllocator);
8362 Rep *rep_p = Rep::makeRep(alloc, numElements);
8364 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8365 BloombergLP::bslalg::ArrayPrimitives::defaultConstruct(rep_p->ptr(),
8370 BloombergLP::bslma::SharedPtrRep *upcastRep = rep_p;
8371 return shared_ptr<ARRAY_TYPE>(rep_p->ptr(), upcastRep);
8374template<
class ARRAY_TYPE,
class ALLOC>
8379 ALLOC *basicAllocator,
8385 typedef BloombergLP::bslstl::SharedPtrArrayAllocateInplaceRep<
8388 AllocatorType alloc(basicAllocator);
8389 Rep *rep_p = Rep::makeRep(alloc, numElements);
8391 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8392 BloombergLP::bslalg::ArrayPrimitives::uninitializedFillN(
8393 static_cast<Element_type *
> (rep_p->ptr()),
8399 BloombergLP::bslma::SharedPtrRep *upcastRep = rep_p;
8400 return shared_ptr<ARRAY_TYPE>(rep_p->ptr(), upcastRep);
8407template<
class ELEMENT_TYPE,
class ALLOC>
8414 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8416 typedef BloombergLP::bslstl::
8417 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8418 AllocatorType alloc(basicAllocator);
8419 Rep *rep_p = Rep::makeRep(alloc);
8421 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8422 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE;
8425 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8429template<class ARRAY_TYPE, class ALLOC>
8431typename
bsl::enable_if<
bsl::is_bounded_array<ARRAY_TYPE>::value,
8432 bsl::shared_ptr<ARRAY_TYPE> >::type
8433bsl::allocate_shared_for_overwrite(ALLOC *basicAllocator)
8436 typedef BloombergLP::bslstl::SharedPtr_ImpUtil ImpUtil;
8437 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8439 typedef BloombergLP::bslstl::
8440 SharedPtrArrayAllocateInplaceRep<ARRAY_TYPE, AllocatorType> Rep;
8442 const size_t numElements = ImpUtil::Extent<ARRAY_TYPE>::value;
8443 AllocatorType alloc(basicAllocator);
8444 Rep *rep_p = Rep::makeRep(alloc, numElements);
8446 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8447 ::new (PtrUtil::voidify(rep_p->ptr())) ARRAY_TYPE;
8450 BloombergLP::
bslma::SharedPtrRep *upcastRep = rep_p;
8451 return shared_ptr<ARRAY_TYPE>(rep_p->ptr(), upcastRep);
8454template<class ARRAY_TYPE, class ALLOC>
8456typename
bsl::enable_if<
bsl::is_unbounded_array<ARRAY_TYPE>::value,
8457 bsl::shared_ptr<ARRAY_TYPE> >::type
8458bsl::allocate_shared_for_overwrite(ALLOC *basicAllocator,
size_t numElements)
8462 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8464 typedef BloombergLP::bslstl::
8465 SharedPtrArrayAllocateInplaceRep<ARRAY_TYPE, AllocatorType> Rep;
8466 AllocatorType alloc(basicAllocator);
8467 Rep *rep_p = Rep::makeRep(alloc, numElements);
8469 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8470 ::new (PtrUtil::voidify(rep_p->ptr())) Element_type[numElements];
8473 BloombergLP::
bslma::SharedPtrRep *upcastRep = rep_p;
8474 return shared_ptr<ARRAY_TYPE>(rep_p->ptr(), upcastRep);
8481#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
8484#ifndef BSLSTL_SHAREDPTR_VARIADIC_LIMIT
8485#define BSLSTL_SHAREDPTR_VARIADIC_LIMIT 14
8487#ifndef BSLSTL_SHAREDPTR_VARIADIC_LIMIT_H
8488#define BSLSTL_SHAREDPTR_VARIADIC_LIMIT_H BSLSTL_SHAREDPTR_VARIADIC_LIMIT
8491#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_H >= 0
8492template<
class ELEMENT_TYPE>
8499 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8501 typedef BloombergLP::bslstl::
8502 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8504 AllocatorType basicAllocator;
8505 Rep *rep_p = Rep::makeRep(basicAllocator);
8507 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8508 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE(
8512 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8516#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_H >= 1
8517template<
class ELEMENT_TYPE,
class ARGS_01>
8524 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8526 typedef BloombergLP::bslstl::
8527 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8529 AllocatorType basicAllocator;
8530 Rep *rep_p = Rep::makeRep(basicAllocator);
8532 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8533 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE(
8537 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8541#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_H >= 2
8542template<
class ELEMENT_TYPE,
class ARGS_01,
8551 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8553 typedef BloombergLP::bslstl::
8554 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8556 AllocatorType basicAllocator;
8557 Rep *rep_p = Rep::makeRep(basicAllocator);
8559 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8560 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE(
8565 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8569#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_H >= 3
8570template<
class ELEMENT_TYPE,
class ARGS_01,
8581 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8583 typedef BloombergLP::bslstl::
8584 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8586 AllocatorType basicAllocator;
8587 Rep *rep_p = Rep::makeRep(basicAllocator);
8589 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8590 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE(
8596 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8600#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_H >= 4
8601template<
class ELEMENT_TYPE,
class ARGS_01,
8614 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8616 typedef BloombergLP::bslstl::
8617 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8619 AllocatorType basicAllocator;
8620 Rep *rep_p = Rep::makeRep(basicAllocator);
8622 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8623 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE(
8630 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8634#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_H >= 5
8635template<
class ELEMENT_TYPE,
class ARGS_01,
8650 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8652 typedef BloombergLP::bslstl::
8653 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8655 AllocatorType basicAllocator;
8656 Rep *rep_p = Rep::makeRep(basicAllocator);
8658 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8659 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE(
8667 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8671#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_H >= 6
8672template<
class ELEMENT_TYPE,
class ARGS_01,
8689 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8691 typedef BloombergLP::bslstl::
8692 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8694 AllocatorType basicAllocator;
8695 Rep *rep_p = Rep::makeRep(basicAllocator);
8697 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8698 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE(
8707 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8711#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_H >= 7
8712template<
class ELEMENT_TYPE,
class ARGS_01,
8731 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8733 typedef BloombergLP::bslstl::
8734 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8736 AllocatorType basicAllocator;
8737 Rep *rep_p = Rep::makeRep(basicAllocator);
8739 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8740 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE(
8750 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8754#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_H >= 8
8755template<
class ELEMENT_TYPE,
class ARGS_01,
8776 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8778 typedef BloombergLP::bslstl::
8779 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8781 AllocatorType basicAllocator;
8782 Rep *rep_p = Rep::makeRep(basicAllocator);
8784 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8785 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE(
8796 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8800#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_H >= 9
8801template<
class ELEMENT_TYPE,
class ARGS_01,
8824 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8826 typedef BloombergLP::bslstl::
8827 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8829 AllocatorType basicAllocator;
8830 Rep *rep_p = Rep::makeRep(basicAllocator);
8832 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8833 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE(
8845 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8849#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_H >= 10
8850template<
class ELEMENT_TYPE,
class ARGS_01,
8875 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8877 typedef BloombergLP::bslstl::
8878 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8880 AllocatorType basicAllocator;
8881 Rep *rep_p = Rep::makeRep(basicAllocator);
8883 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8884 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE(
8897 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8901#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_H >= 11
8902template<
class ELEMENT_TYPE,
class ARGS_01,
8929 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8931 typedef BloombergLP::bslstl::
8932 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8934 AllocatorType basicAllocator;
8935 Rep *rep_p = Rep::makeRep(basicAllocator);
8937 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8938 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE(
8952 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
8956#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_H >= 12
8957template<
class ELEMENT_TYPE,
class ARGS_01,
8986 typedef BloombergLP::bslma::PointerUtil PtrUtil;
8988 typedef BloombergLP::bslstl::
8989 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
8991 AllocatorType basicAllocator;
8992 Rep *rep_p = Rep::makeRep(basicAllocator);
8994 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
8995 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE(
9010 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
9014#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_H >= 13
9015template<
class ELEMENT_TYPE,
class ARGS_01,
9046 typedef BloombergLP::bslma::PointerUtil PtrUtil;
9048 typedef BloombergLP::bslstl::
9049 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
9051 AllocatorType basicAllocator;
9052 Rep *rep_p = Rep::makeRep(basicAllocator);
9054 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
9055 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE(
9071 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
9075#if BSLSTL_SHAREDPTR_VARIADIC_LIMIT_H >= 14
9076template<
class ELEMENT_TYPE,
class ARGS_01,
9109 typedef BloombergLP::bslma::PointerUtil PtrUtil;
9111 typedef BloombergLP::bslstl::
9112 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
9114 AllocatorType basicAllocator;
9115 Rep *rep_p = Rep::makeRep(basicAllocator);
9117 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
9118 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE(
9135 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
9143template<
class ELEMENT_TYPE,
class... ARGS>
9150 typedef BloombergLP::bslma::PointerUtil PtrUtil;
9152 typedef BloombergLP::bslstl::
9153 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
9155 AllocatorType basicAllocator;
9156 Rep *rep_p = Rep::makeRep(basicAllocator);
9158 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
9159 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE(
9163 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
9168template<
class ARRAY_TYPE>
9174 typedef BloombergLP::bslstl::SharedPtr_ImpUtil ImpUtil;
9178 rebind_traits<Element_type>::allocator_type ElementAllocatorType;
9179 typedef BloombergLP::bslstl::SharedPtrArrayAllocateInplaceRep<
9183 const size_t numElements = ImpUtil::Extent<ARRAY_TYPE>::value;
9184 AllocatorType basicAllocator;
9185 Rep *rep_p = Rep::makeRep(basicAllocator, numElements);
9187 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
9188 BloombergLP::bslalg::ArrayPrimitives::defaultConstruct(
9191 ElementAllocatorType(basicAllocator));
9194 BloombergLP::bslma::SharedPtrRep *upcastRep = rep_p;
9195 return shared_ptr<ARRAY_TYPE>(rep_p->ptr(), upcastRep);
9198template<
class ARRAY_TYPE>
9204 typedef BloombergLP::bslstl::SharedPtr_ImpUtil ImpUtil;
9208 rebind_traits<Element_type>::allocator_type ElementAllocatorType;
9209 typedef BloombergLP::bslstl::SharedPtrArrayAllocateInplaceRep<
9213 const size_t numElements = ImpUtil::Extent<ARRAY_TYPE>::value;
9214 AllocatorType basicAllocator;
9215 Rep *rep_p = Rep::makeRep(basicAllocator, numElements);
9217 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
9218 BloombergLP::bslalg::ArrayPrimitives::uninitializedFillN(
9222 ElementAllocatorType(basicAllocator));
9225 BloombergLP::bslma::SharedPtrRep *upcastRep = rep_p;
9226 return shared_ptr<ARRAY_TYPE>(rep_p->ptr(), upcastRep);
9229template<
class ARRAY_TYPE>
9238 rebind_traits<Element_type>::allocator_type ElementAllocatorType;
9239 typedef BloombergLP::bslstl::SharedPtrArrayAllocateInplaceRep<
9243 AllocatorType basicAllocator;
9244 Rep *rep_p = Rep::makeRep(basicAllocator, numElements);
9246 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
9247 BloombergLP::bslalg::ArrayPrimitives::defaultConstruct(
9250 ElementAllocatorType(basicAllocator));
9253 BloombergLP::bslma::SharedPtrRep *upcastRep = rep_p;
9254 return shared_ptr<ARRAY_TYPE>(rep_p->ptr(), upcastRep);
9257template<
class ARRAY_TYPE>
9268 rebind_traits<Element_type>::allocator_type ElementAllocatorType;
9269 typedef BloombergLP::bslstl::SharedPtrArrayAllocateInplaceRep<
9273 AllocatorType basicAllocator;
9274 Rep *rep_p = Rep::makeRep(basicAllocator, numElements);
9276 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
9277 BloombergLP::bslalg::ArrayPrimitives::uninitializedFillN(
9281 ElementAllocatorType(basicAllocator));
9284 BloombergLP::bslma::SharedPtrRep *upcastRep = rep_p;
9285 return shared_ptr<ARRAY_TYPE>(rep_p->ptr(), upcastRep);
9292template<
class ELEMENT_TYPE>
9299 typedef BloombergLP::bslma::PointerUtil PtrUtil;
9301 typedef BloombergLP::bslstl::
9302 SharedPtrAllocateInplaceRep<ELEMENT_TYPE, AllocatorType> Rep;
9304 AllocatorType basicAllocator;
9305 Rep *rep_p = Rep::makeRep(basicAllocator);
9307 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
9308 ::new (PtrUtil::voidify(rep_p->ptr())) ELEMENT_TYPE;
9311 return shared_ptr<ELEMENT_TYPE>(rep_p->ptr(), rep_p);
9314template<class ARRAY_TYPE>
9316typename
bsl::enable_if<
bsl::is_bounded_array<ARRAY_TYPE>::value,
9317 bsl::shared_ptr<ARRAY_TYPE> >::type
9318bsl::make_shared_for_overwrite()
9321 typedef BloombergLP::bslstl::SharedPtr_ImpUtil ImpUtil;
9322 typedef BloombergLP::bslma::PointerUtil PtrUtil;
9324 typedef BloombergLP::bslstl::
9325 SharedPtrArrayAllocateInplaceRep<ARRAY_TYPE, AllocatorType> Rep;
9327 const size_t numElements = ImpUtil::Extent<ARRAY_TYPE>::value;
9328 AllocatorType basicAllocator;
9329 Rep *rep_p = Rep::makeRep(basicAllocator, numElements);
9331 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
9332 ::new (PtrUtil::voidify(rep_p->ptr())) ARRAY_TYPE;
9336 BloombergLP::
bslma::SharedPtrRep *upcastRep = rep_p;
9337 return shared_ptr<ARRAY_TYPE>(rep_p->ptr(), upcastRep);
9340template<class ARRAY_TYPE>
9342typename
bsl::enable_if<
bsl::is_unbounded_array<ARRAY_TYPE>::value,
9343 bsl::shared_ptr<ARRAY_TYPE> >::type
9344bsl::make_shared_for_overwrite(
size_t numElements)
9348 typedef BloombergLP::bslma::PointerUtil PtrUtil;
9350 typedef BloombergLP::bslstl::
9351 SharedPtrArrayAllocateInplaceRep<ARRAY_TYPE, AllocatorType> Rep;
9353 AllocatorType basicAllocator;
9354 Rep *rep_p = Rep::makeRep(basicAllocator, numElements);
9356 BloombergLP::bslstl::SharedPtr_RepProctor proctor(rep_p);
9357 ::new (PtrUtil::voidify(rep_p->ptr())) Element_type[numElements];
9361 BloombergLP::
bslma::SharedPtrRep *upcastRep = rep_p;
9362 return shared_ptr<ARRAY_TYPE>(rep_p->ptr(), upcastRep);
9385template <
class ELEMENT_TYPE>
9394template <
class ELEMENT_TYPE>
9399template <
class ELEMENT_TYPE>
9404template <
class ELEMENT_TYPE>
9413#if defined(BSLS_PLATFORM_HAS_PRAGMA_GCC_DIAGNOSTIC)
9414# pragma GCC diagnostic pop
9417#undef BSLSTL_SHAREDPTR_DECLARE_IF_CONVERTIBLE
9418#undef BSLSTL_SHAREDPTR_DEFINE_IF_CONVERTIBLE
9420#undef BSLSTL_SHAREDPTR_DECLARE_IF_COMPATIBLE
9421#undef BSLSTL_SHAREDPTR_DEFINE_IF_COMPATIBLE
9423#undef BSLSTL_SHAREDPTR_DECLARE_IF_DELETER
9424#undef BSLSTL_SHAREDPTR_DEFINE_IF_DELETER
9426#undef BSLSTL_SHAREDPTR_DECLARE_IF_NULLPTR_DELETER
9427#undef BSLSTL_SHAREDPTR_DEFINE_IF_NULLPTR_DELETER
9429#undef BSLSTL_SHAREDPTR_MSVC_DECLTYPE_WORKAROUND
9431#undef BSLSTL_SHAREDPTR_SFINAE_DISCARD
9434# error Not valid except when included from bslstl_sharedptr.h
#define BSLMF_NESTED_TRAIT_DECLARATION(t_TYPE, t_TRAIT)
Definition bslmf_nestedtraitdeclaration.h:231
Definition bslma_bslallocator.h:588
Definition bslstl_sharedptr.h:4073
bsl::weak_ptr< ELEMENT_TYPE > weak_from_this() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:4781
bsl::shared_ptr< ELEMENT_TYPE > shared_from_this()
Definition bslstl_sharedptr.h:4765
enable_shared_from_this() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:4730
friend struct BloombergLP::bslstl::SharedPtr_ImpUtil
Definition bslstl_sharedptr.h:4079
Definition bslstl_sharedptr.h:1838
BloombergLP::bslma::SharedPtrRep * rep() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:5761
element_type * ptr() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:5779
shared_ptr & operator=(const shared_ptr &rhs) BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:5327
void reset() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:5449
size_t owner_hash() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:5721
long use_count() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:5735
weak_ptr< ELEMENT_TYPE > weak_type
Definition bslstl_sharedptr.h:1854
pair< element_type *, BloombergLP::bslma::SharedPtrRep * > release() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:5583
void load(COMPATIBLE_TYPE *ptr)
Definition bslstl_sharedptr.h:5604
friend class shared_ptr
Definition bslstl_sharedptr.h:1875
friend struct BloombergLP::bslstl::SharedPtr_ImpUtil
Definition bslstl_sharedptr.h:1877
element_type * get() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:5665
bsl::remove_extent< ELEMENT_TYPE >::type element_type
Definition bslstl_sharedptr.h:1850
BloombergLP::bslma::ManagedPtr< ELEMENT_TYPE > managedPtr() const
Definition bslstl_sharedptr.h:5743
void clear() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:5596
void loadAlias(const shared_ptr< ANY_TYPE > &source, ELEMENT_TYPE *object)
Definition bslstl_sharedptr.h:5570
~shared_ptr()
Definition bslstl_sharedptr.h:5317
int numReferences() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:5771
void createInplace()
Definition bslstl_sharedptr.h:5539
bool owner_before(const shared_ptr< ANY_TYPE > &other) const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:5683
Definition bslstl_sharedptr.h:3773
shared_ptr< ELEMENT_TYPE > lock() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:6031
friend class weak_ptr
Definition bslstl_sharedptr.h:3798
~weak_ptr()
Definition bslstl_sharedptr.h:5876
size_t owner_hash() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:6089
void reset() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:5992
bool owner_before(const shared_ptr< ANY_TYPE > &other) const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:6048
long use_count() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:6104
BloombergLP::bslma::SharedPtrRep * rep() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:6096
shared_ptr< ELEMENT_TYPE > acquireSharedPtr() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:6113
bsl::remove_extent< ELEMENT_TYPE >::type element_type
Definition bslstl_sharedptr.h:3812
friend struct BloombergLP::bslstl::SharedPtr_ImpUtil
Definition bslstl_sharedptr.h:3800
int numReferences() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:6121
weak_ptr & operator=(BloombergLP::bslmf::MovableRef< weak_ptr > rhs) BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:5901
bool expired() const BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:6025
Definition bslma_allocator.h:545
Definition bslma_sharedptrrep.h:338
void releaseWeakRef()
Definition bslma_sharedptrrep.h:588
virtual void disposeRep()=0
int numReferences() const
Definition bslma_sharedptrrep.h:611
void acquireRef()
Definition bslma_sharedptrrep.h:568
void release() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_sharedptr.h:6288
~SharedPtr_RepProctor()
Definition bslstl_sharedptr.h:6279
static const t_TYPE value
Definition bslmf_integralconstant.h:267
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#define BSLS_ASSERT_SAFE(X)
Definition bsls_assert.h:1917
#define BSLS_COMPILERFEATURES_FORWARD_REF(T)
Definition bsls_compilerfeatures.h:2343
#define BSLS_COMPILERFEATURES_FORWARD(T, V)
Definition bsls_compilerfeatures.h:2349
#define BSLS_DEPRECATE_FEATURE(UOR, FEATURE, MESSAGE)
Definition bsls_deprecatefeature.h:387
#define BSLS_KEYWORD_CONSTEXPR
Definition bsls_keyword.h:624
#define BSLS_KEYWORD_NOEXCEPT
Definition bsls_keyword.h:674
#define BSLSTL_SHAREDPTR_DEFINE_IF_DELETER(FUNCTOR, ARGUMENT)
Definition bslstl_sharedptr.h:1714
#define BSLSTL_SHAREDPTR_DECLARE_IF_NULLPTR_DELETER(FUNCTOR)
Definition bslstl_sharedptr.h:1716
#define BSLSTL_SHAREDPTR_DEFINE_IF_NULLPTR_DELETER(FUNCTOR)
Definition bslstl_sharedptr.h:1717
#define BSLSTL_SHAREDPTR_DEFINE_IF_COMPATIBLE
Definition bslstl_sharedptr.h:1711
#define BSLSTL_SHAREDPTR_DEFINE_IF_CONVERTIBLE
Definition bslstl_sharedptr.h:1708
#define BSLSTL_SHAREDPTR_DECLARE_IF_CONVERTIBLE
Definition bslstl_sharedptr.h:1707
#define BSLSTL_SHAREDPTR_DECLARE_IF_DELETER(FUNCTOR, ARGUMENT)
Definition bslstl_sharedptr.h:1713
#define BSLSTL_SHAREDPTR_DECLARE_IF_COMPATIBLE
Definition bslstl_sharedptr.h:1710
bool operator!=(const FileCleanerConfiguration &lhs, const FileCleanerConfiguration &rhs)
bool operator==(const FileCleanerConfiguration &lhs, const FileCleanerConfiguration &rhs)
void swap(OptionValue &a, OptionValue &b)
bool operator<(const MetricId &lhs, const MetricId &rhs)
void reset(TYPE *object)
Reset the value of the specified object to its default value.
bool operator>=(const Guid &lhs, const Guid &rhs)
void hashAppend(HASH_ALGORITHM &hashAlgorithm, const BigEndianInt16 &object)
bool operator<=(const Guid &lhs, const Guid &rhs)
bool operator>(const Guid &lhs, const Guid &rhs)
Definition bdlat_valuetypefunctions.h:939
BloombergLP::bsls::Nullptr_Impl::Type nullptr_t
Definition bsls_nullptr.h:283
enable_if< is_bounded_array< ARRAY_TYPE >::value, shared_ptr< ARRAY_TYPE > >::type make_shared()
shared_ptr< TO_TYPE > const_pointer_cast(const shared_ptr< FROM_TYPE > &source) BSLS_KEYWORD_NOEXCEPT
shared_ptr< TO_TYPE > dynamic_pointer_cast(const shared_ptr< FROM_TYPE > &source) BSLS_KEYWORD_NOEXCEPT
void swap(array< VALUE_TYPE, SIZE > &lhs, array< VALUE_TYPE, SIZE > &rhs)
bool operator<(const array< VALUE_TYPE, SIZE > &lhs, const array< VALUE_TYPE, SIZE > &rhs)
void hashAppend(HASH_ALGORITHM &hashAlgorithm, const array< TYPE, SIZE > &input)
Pass the specified input to the specified hashAlgorithm
Definition bslstl_array.h:959
bool operator>(const array< VALUE_TYPE, SIZE > &lhs, const array< VALUE_TYPE, SIZE > &rhs)
BSLS_KEYWORD_CONSTEXPR_CPP14 TYPE & get(array< TYPE, SIZE > &a) BSLS_KEYWORD_NOEXCEPT
DELETER * get_deleter(const shared_ptr< ELEMENT_TYPE > &p) BSLS_KEYWORD_NOEXCEPT
bool operator>=(const array< VALUE_TYPE, SIZE > &lhs, const array< VALUE_TYPE, SIZE > &rhs)
bool operator<=(const array< VALUE_TYPE, SIZE > &lhs, const array< VALUE_TYPE, SIZE > &rhs)
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
shared_ptr< TO_TYPE > reinterpret_pointer_cast(const shared_ptr< FROM_TYPE > &source) BSLS_KEYWORD_NOEXCEPT
shared_ptr< TO_TYPE > static_pointer_cast(const shared_ptr< FROM_TYPE > &source) BSLS_KEYWORD_NOEXCEPT
enable_if<!is_array< ELEMENT_TYPE >::value &&!is_pointer< ALLOC >::value, shared_ptr< ELEMENT_TYPE > >::type allocate_shared(ALLOC basicAllocator, ARGS &&... args)
bool operator==(const memory_resource &a, const memory_resource &b)
std::basic_ostream< CHAR_TYPE, TRAITS > & operator<<(std::basic_ostream< CHAR_TYPE, TRAITS > &os, const bitset< N > &x)
Definition bslstl_bitset.h:1417
enable_if<!is_array< ELEMENT_TYPE >::value, shared_ptr< ELEMENT_TYPE > >::type make_shared_for_overwrite()
ALLOCATOR & lhs
Definition bslstl_string.h:3917
bool operator!=(const memory_resource &a, const memory_resource &b)
enable_if<!is_array< ELEMENT_TYPE >::value &&!is_pointer< ALLOC >::value, shared_ptr< ELEMENT_TYPE > >::type allocate_shared_for_overwrite(ALLOC basicAllocator)
Definition baljsn_encoder_testtypes.h:76
Definition bdlbb_blob.h:579
Definition bslstl_algorithm.h:84
BloombergLP::bslmf::AddPointer_Impl< t_TYPE >::type type
Definition bslmf_addpointer.h:181
Definition bslma_allocatortraits.h:1089
static void construct(ALLOCATOR_TYPE &basicAllocator, ELEMENT_TYPE *elementAddr, Args &&... arguments)
Definition bslma_allocatortraits.h:1527
Definition bslmf_conditional.h:123
Definition bslmf_enableif.h:530
Definition bslmf_integralconstant.h:261
Definition bslmf_isarray.h:168
Definition bslmf_isconvertible.h:875
Definition bslmf_isnothrowmoveconstructible.h:361
Definition bslmf_ispointer.h:138
t_TYPE type
Definition bslmf_removeextent.h:134
void operator()(const volatile void *) const BSLS_KEYWORD_NOEXCEPT
No-Op.
Definition bslstl_sharedptr.h:6238
static void staticCast(bsl::shared_ptr< TARGET > *target, const bsl::shared_ptr< SOURCE > &source)
Definition bslstl_sharedptr.h:6214
static void constCast(bsl::shared_ptr< TARGET > *target, const bsl::shared_ptr< SOURCE > &source)
Definition bslstl_sharedptr.h:6166
static void dynamicCast(bsl::shared_ptr< TARGET > *target, const bsl::shared_ptr< SOURCE > &source)
Definition bslstl_sharedptr.h:6186
void operator()(ANY_TYPE *ptr) const BSLS_KEYWORD_NOEXCEPT
Call delete with the specified ptr.
static void loadEnableSharedFromThis(const bsl::enable_shared_from_this< ENABLE_TYPE > *result, bsl::shared_ptr< SHARED_TYPE > *sharedPtr)
Definition bslstl_sharedptr.h:6138