11#ifndef INCLUDED_BSLMA_MANAGEDPTR_CPP03
12#define INCLUDED_BSLMA_MANAGEDPTR_CPP03
63#ifdef COMPILING_BSLMA_MANAGEDPTR_H
85template <
class TARGET_TYPE>
89 ManagedPtr_Members *d_base_p;
92 TARGET_TYPE *d_cast_p;
124 ManagedPtr_Members *
base()
const;
127 TARGET_TYPE *
target()
const;
138struct ManagedPtr_TraitConstraint {
166template <
class TARGET_TYPE>
196 ManagedPtr_Members d_members;
209 static void *stripBasePointerType(TARGET_TYPE *
ptr);
215 template <
class MANAGED_TYPE>
216 static void *stripCompletePointerType(MANAGED_TYPE *
ptr);
230 template <
class MANAGED_TYPE>
238 template <
class MANAGED_TYPE>
246 template <
class MANAGED_TYPE,
class COOKIE_TYPE>
254 template <
class MANAGED_TYPE>
256 template <
class COOKIE_TYPE>
275 template <
class ALIASED_TYPE>
301 template <
class MANAGED_TYPE>
329#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
330 template <
class BDE_OTHER_TYPE>
331 ManagedPtr(ManagedPtr<BDE_OTHER_TYPE>&& original,
334 ManagedPtr_TraitConstraint>::type =
335 ManagedPtr_TraitConstraint())
337#elif defined(BSLS_PLATFORM_CMP_SUN) && BSLS_PLATFORM_CMP_VERSION < 0x5130
339 template <
class BDE_OTHER_TYPE>
343 template <
class BDE_OTHER_TYPE>
347 ManagedPtr_TraitConstraint>::type =
348 ManagedPtr_TraitConstraint())
363 template <
class ALIASED_TYPE>
364 ManagedPtr(ManagedPtr<ALIASED_TYPE>& alias, TARGET_TYPE *
ptr);
365 template <
class ALIASED_TYPE>
366#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
389 template <
class MANAGED_TYPE,
class FACTORY_TYPE>
402 template <
class FACTORY_TYPE>
432 template <
class MANAGED_TYPE>
435#ifndef BDE_OMIT_INTERNAL_DEPRECATED
462 template <
class MANAGED_TYPE,
class MANAGED_BASE>
465 void (*
deleter)(MANAGED_BASE *,
void *));
490 template <
class MANAGED_TYPE,
496 void (*
deleter)(MANAGED_BASE *, COOKIE_BASE *));
526#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
527 template <
class BDE_OTHER_TYPE>
530 ManagedPtr<TARGET_TYPE> >::type&
532#elif defined(BSLS_PLATFORM_CMP_SUN) && BSLS_PLATFORM_CMP_VERSION < 0x5130
534 template <
class BDE_OTHER_TYPE>
535 ManagedPtr<TARGET_TYPE>&
539 template <
class BDE_OTHER_TYPE>
542 ManagedPtr<TARGET_TYPE> >::type&
572 template <
class REFERENCED_TYPE>
573 operator ManagedPtr_Ref<REFERENCED_TYPE>();
595 template <
class MANAGED_TYPE>
596 void load(MANAGED_TYPE *
ptr);
616 template <
class MANAGED_TYPE,
class FACTORY_TYPE>
617 void load(MANAGED_TYPE *
ptr, FACTORY_TYPE *factory);
634 template <
class MANAGED_TYPE>
644#ifndef BDE_OMIT_INTERNAL_DEPRECATED
645 template <
class MANAGED_TYPE,
class COOKIE_TYPE>
648 template <
class MANAGED_TYPE,
class MANAGED_BASE>
649 void load(MANAGED_TYPE *
ptr,
651 void (*
deleter)(MANAGED_BASE *,
void *));
676 template <
class MANAGED_TYPE,
680 void load(MANAGED_TYPE *
ptr,
682 void (*
deleter)(MANAGED_BASE *, COOKIE_BASE *));
700 template <
class ALIASED_TYPE>
701 void loadAlias(ManagedPtr<ALIASED_TYPE>& alias, TARGET_TYPE *
ptr);
707 ManagedPtr_PairProxy<TARGET_TYPE, ManagedPtrDeleter>
release();
742 operator BoolType()
const;
758 const ManagedPtrDeleter&
deleter()
const;
762 TARGET_TYPE *
get()
const;
768 TARGET_TYPE *
ptr()
const;
775template <
class TARGET_TYPE>
776void swap(ManagedPtr<TARGET_TYPE>& a, ManagedPtr<TARGET_TYPE>& b);
786struct ManagedPtrUtil {
799 template <
class ELEMENT_TYPE>
802#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
805#ifndef BSLMA_MANAGEDPTR_VARIADIC_LIMIT
806#define BSLMA_MANAGEDPTR_VARIADIC_LIMIT 14
808#ifndef BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A
809#define BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A BSLMA_MANAGEDPTR_VARIADIC_LIMIT
812#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 0
813 template <
class ELEMENT_TYPE>
814 static ManagedPtr<ELEMENT_TYPE>
818#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 1
819 template <
class ELEMENT_TYPE,
class ARGS_01>
820 static ManagedPtr<ELEMENT_TYPE>
825#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 2
826 template <
class ELEMENT_TYPE,
class ARGS_01,
828 static ManagedPtr<ELEMENT_TYPE>
834#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 3
835 template <
class ELEMENT_TYPE,
class ARGS_01,
838 static ManagedPtr<ELEMENT_TYPE>
845#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 4
846 template <
class ELEMENT_TYPE,
class ARGS_01,
850 static ManagedPtr<ELEMENT_TYPE>
858#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 5
859 template <
class ELEMENT_TYPE,
class ARGS_01,
864 static ManagedPtr<ELEMENT_TYPE>
873#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 6
874 template <
class ELEMENT_TYPE,
class ARGS_01,
880 static ManagedPtr<ELEMENT_TYPE>
890#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 7
891 template <
class ELEMENT_TYPE,
class ARGS_01,
898 static ManagedPtr<ELEMENT_TYPE>
909#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 8
910 template <
class ELEMENT_TYPE,
class ARGS_01,
918 static ManagedPtr<ELEMENT_TYPE>
930#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 9
931 template <
class ELEMENT_TYPE,
class ARGS_01,
940 static ManagedPtr<ELEMENT_TYPE>
953#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 10
954 template <
class ELEMENT_TYPE,
class ARGS_01,
964 static ManagedPtr<ELEMENT_TYPE>
978#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 11
979 template <
class ELEMENT_TYPE,
class ARGS_01,
990 static ManagedPtr<ELEMENT_TYPE>
1005#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 12
1006 template <
class ELEMENT_TYPE,
class ARGS_01,
1018 static ManagedPtr<ELEMENT_TYPE>
1034#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 13
1035 template <
class ELEMENT_TYPE,
class ARGS_01,
1048 static ManagedPtr<ELEMENT_TYPE>
1065#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 14
1066 template <
class ELEMENT_TYPE,
class ARGS_01,
1080 static ManagedPtr<ELEMENT_TYPE>
1098#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 0
1099 template <
class ELEMENT_TYPE,
class ALLOCATOR>
1101 ManagedPtr<ELEMENT_TYPE> >::type
1105#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 1
1106 template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01>
1108 ManagedPtr<ELEMENT_TYPE> >::type
1113#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 2
1114 template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
1117 ManagedPtr<ELEMENT_TYPE> >::type
1123#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 3
1124 template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
1128 ManagedPtr<ELEMENT_TYPE> >::type
1135#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 4
1136 template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
1141 ManagedPtr<ELEMENT_TYPE> >::type
1149#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 5
1150 template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
1156 ManagedPtr<ELEMENT_TYPE> >::type
1165#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 6
1166 template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
1173 ManagedPtr<ELEMENT_TYPE> >::type
1183#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 7
1184 template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
1192 ManagedPtr<ELEMENT_TYPE> >::type
1203#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 8
1204 template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
1213 ManagedPtr<ELEMENT_TYPE> >::type
1225#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 9
1226 template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
1236 ManagedPtr<ELEMENT_TYPE> >::type
1249#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 10
1250 template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
1261 ManagedPtr<ELEMENT_TYPE> >::type
1275#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 11
1276 template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
1288 ManagedPtr<ELEMENT_TYPE> >::type
1303#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 12
1304 template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
1317 ManagedPtr<ELEMENT_TYPE> >::type
1333#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 13
1334 template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
1348 ManagedPtr<ELEMENT_TYPE> >::type
1365#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 14
1366 template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
1381 ManagedPtr<ELEMENT_TYPE> >::type
1400#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 0
1401 template <
class ELEMENT_TYPE>
1406#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 1
1407 template <
class ELEMENT_TYPE,
class ARGS_01>
1412#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 2
1413 template <
class ELEMENT_TYPE,
class ARGS_01,
1420#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 3
1421 template <
class ELEMENT_TYPE,
class ARGS_01,
1430#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 4
1431 template <
class ELEMENT_TYPE,
class ARGS_01,
1442#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 5
1443 template <
class ELEMENT_TYPE,
class ARGS_01,
1456#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 6
1457 template <
class ELEMENT_TYPE,
class ARGS_01,
1472#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 7
1473 template <
class ELEMENT_TYPE,
class ARGS_01,
1490#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 8
1491 template <
class ELEMENT_TYPE,
class ARGS_01,
1510#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 9
1511 template <
class ELEMENT_TYPE,
class ARGS_01,
1532#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 10
1533 template <
class ELEMENT_TYPE,
class ARGS_01,
1556#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 11
1557 template <
class ELEMENT_TYPE,
class ARGS_01,
1582#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 12
1583 template <
class ELEMENT_TYPE,
class ARGS_01,
1610#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 13
1611 template <
class ELEMENT_TYPE,
class ARGS_01,
1640#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_A >= 14
1641 template <
class ELEMENT_TYPE,
class ARGS_01,
1676 template <
class ELEMENT_TYPE,
class... ARGS>
1677 static ManagedPtr<ELEMENT_TYPE>
1680 template <
class ELEMENT_TYPE,
class ALLOCATOR,
class... ARGS>
1682 ManagedPtr<ELEMENT_TYPE> >::type
1686 template <
class ELEMENT_TYPE,
class... ARGS>
1708template <
class TARGET_TYPE>
1709struct ManagedPtrNilDeleter {
1714 static void deleter(
void *,
void *);
1729template <
class TARGET_TYPE,
class FACTORY_TYPE>
1730struct ManagedPtr_FactoryDeleterType
1732 bsl::is_convertible<FACTORY_TYPE *, Allocator *>::value,
1733 ManagedPtr_FactoryDeleter<TARGET_TYPE, Allocator>,
1734 ManagedPtr_FactoryDeleter<TARGET_TYPE, FACTORY_TYPE> > {
1745template <
class MANAGED_TYPE>
1746struct ManagedPtr_DefaultDeleter {
1752 static void deleter(
void *ptr,
void *);
1764template <
class TARGET_TYPE>
1767 TARGET_TYPE *target)
1774template <
class TARGET_TYPE>
1776ManagedPtr_Ref<TARGET_TYPE>::~ManagedPtr_Ref()
1782template <
class TARGET_TYPE>
1784ManagedPtr_Members *ManagedPtr_Ref<TARGET_TYPE>::base()
const
1789template <
class TARGET_TYPE>
1791TARGET_TYPE *ManagedPtr_Ref<TARGET_TYPE>::target()
const
1800template <
class TARGET_TYPE>
1801class ManagedPtr<volatile TARGET_TYPE>;
1807template <
class TARGET_TYPE>
1808class ManagedPtr<TARGET_TYPE&>;
1814#if defined(BSLS_COMPILERFEATURES_SUPPORT_RVALUE_REFERENCES)
1815template <
class TARGET_TYPE>
1816class ManagedPtr<TARGET_TYPE&&>;
1824template <
class TARGET_TYPE>
1826void *ManagedPtr<TARGET_TYPE>::stripBasePointerType(TARGET_TYPE *ptr)
1828 return PointerUtil::voidify(ptr);
1831template <
class TARGET_TYPE>
1832template <
class MANAGED_TYPE>
1835ManagedPtr<TARGET_TYPE>::stripCompletePointerType(MANAGED_TYPE *ptr)
1837 return PointerUtil::voidify(ptr);
1841template <
class TARGET_TYPE>
1842template <
class MANAGED_TYPE>
1844void ManagedPtr<TARGET_TYPE>::loadImp(MANAGED_TYPE *ptr,
1846 DeleterFunc deleter)
1851 d_members.runDeleter();
1852 d_members.set(stripCompletePointerType(ptr), cookie, deleter);
1853 d_members.setAliasPtr(stripBasePointerType(ptr));
1857template <
class TARGET_TYPE>
1859ManagedPtr<TARGET_TYPE>::ManagedPtr()
1864template <
class TARGET_TYPE>
1871template <
class TARGET_TYPE>
1872template <
class MANAGED_TYPE>
1874ManagedPtr<TARGET_TYPE>::ManagedPtr(MANAGED_TYPE *ptr)
1875: d_members(stripCompletePointerType(ptr),
1877 &ManagedPtr_DefaultDeleter<MANAGED_TYPE>::deleter,
1878 stripBasePointerType(ptr))
1883template <
class TARGET_TYPE>
1885ManagedPtr<TARGET_TYPE>::ManagedPtr(ManagedPtr_Ref<TARGET_TYPE> ref)
1887: d_members(*
ref.base())
1889 d_members.setAliasPtr(stripBasePointerType(
ref.target()));
1892template <
class TARGET_TYPE>
1895: d_members(original.d_members)
1899template <
class TARGET_TYPE>
1903: d_members(MoveUtil::access(original).d_members)
1907#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
1908 template <
class TARGET_TYPE>
1909 template <
class BDE_OTHER_TYPE>
1911 ManagedPtr<TARGET_TYPE>::ManagedPtr(
1912 ManagedPtr<BDE_OTHER_TYPE> &&original,
1914 TARGET_TYPE *>::value,
1915 ManagedPtr_TraitConstraint>::type)
1917 : d_members(original.d_members)
1918#elif defined(BSLS_PLATFORM_CMP_SUN) && BSLS_PLATFORM_CMP_VERSION < 0x5130
1920 template <
class TARGET_TYPE>
1921 template <
class BDE_OTHER_TYPE>
1923 ManagedPtr<TARGET_TYPE>::ManagedPtr(
1926 : d_members(MoveUtil::access(original).d_members)
1928 template <
class TARGET_TYPE>
1929 template <
class BDE_OTHER_TYPE>
1931 ManagedPtr<TARGET_TYPE>::ManagedPtr(
1934 TARGET_TYPE *>::value,
1935 ManagedPtr_TraitConstraint>::type)
1937 : d_members(MoveUtil::access(original).d_members)
1942 #if defined(BSLS_PLATFORM_CMP_SUN) && BSLS_PLATFORM_CMP_VERSION < 0x5130
1944 TARGET_TYPE *>::value));
1949 d_members.setAliasPtr(
1950 stripBasePointerType(
1951 static_cast<TARGET_TYPE *
>(
1952 static_cast<BDE_OTHER_TYPE *
>(
1953 d_members.pointer()))));
1957template <
class TARGET_TYPE>
1958template <
class ALIASED_TYPE>
1960ManagedPtr<TARGET_TYPE>::ManagedPtr(ManagedPtr<ALIASED_TYPE>& alias,
1967 d_members.move(&alias.d_members);
1968 d_members.setAliasPtr(stripBasePointerType(ptr));
1972template <
class TARGET_TYPE>
1973template <
class ALIASED_TYPE>
1975ManagedPtr<TARGET_TYPE>::ManagedPtr(
1976#
if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
1977 ManagedPtr<ALIASED_TYPE>&& alias,
1984 ManagedPtr<ALIASED_TYPE>& lvalue = alias;
1989 d_members.move(&lvalue.d_members);
1990 d_members.setAliasPtr(stripBasePointerType(ptr));
1994template <
class TARGET_TYPE>
1995template <
class MANAGED_TYPE,
class FACTORY_TYPE>
1997ManagedPtr<TARGET_TYPE>::ManagedPtr(MANAGED_TYPE *ptr, FACTORY_TYPE *factory)
1998: d_members(stripCompletePointerType(ptr),
2000 &ManagedPtr_FactoryDeleterType<MANAGED_TYPE,
2001 FACTORY_TYPE>::type::deleter,
2002 stripBasePointerType(ptr))
2008template <
class TARGET_TYPE>
2015template <
class TARGET_TYPE>
2016template <
class FACTORY_TYPE>
2018ManagedPtr<TARGET_TYPE>::ManagedPtr(
bsl::nullptr_t, FACTORY_TYPE *)
2023template <
class TARGET_TYPE>
2025ManagedPtr<TARGET_TYPE>::ManagedPtr(TARGET_TYPE *ptr,
2027 DeleterFunc deleter)
2028: d_members(stripBasePointerType(ptr), cookie, deleter)
2033template <
class TARGET_TYPE>
2034template <
class MANAGED_TYPE>
2036ManagedPtr<TARGET_TYPE>::ManagedPtr(MANAGED_TYPE *ptr,
2038 DeleterFunc deleter)
2039: d_members(stripCompletePointerType(ptr),
2042 stripBasePointerType(ptr))
2049#ifndef BDE_OMIT_INTERNAL_DEPRECATED
2050template <
class TARGET_TYPE>
2051template <
class MANAGED_TYPE,
class MANAGED_BASE>
2053ManagedPtr<TARGET_TYPE>::ManagedPtr(
2056 void (*deleter)(MANAGED_BASE *,
void *))
2057: d_members(stripCompletePointerType(ptr),
2059 reinterpret_cast<DeleterFunc>(deleter),
2060 stripBasePointerType(ptr))
2064 const MANAGED_BASE *>::value));
2069template <
class TARGET_TYPE>
2070template <
class MANAGED_TYPE,
2075ManagedPtr<TARGET_TYPE>::ManagedPtr(
2077 COOKIE_TYPE *cookie,
2078 void (*deleter)(MANAGED_BASE *, COOKIE_BASE *))
2079: d_members(stripCompletePointerType(ptr),
2080 static_cast<COOKIE_BASE *>(cookie),
2081 reinterpret_cast<DeleterFunc>(deleter),
2082 stripBasePointerType(ptr))
2086 const MANAGED_BASE *>::value));
2100template <
class TARGET_TYPE>
2102ManagedPtr<TARGET_TYPE>::~ManagedPtr()
2104 d_members.runDeleter();
2108template <
class TARGET_TYPE>
2110ManagedPtr<TARGET_TYPE>&
2113 d_members.moveAssign(&
rhs.d_members);
2117template <
class TARGET_TYPE>
2119ManagedPtr<TARGET_TYPE>&
2123 ManagedPtr& lvalue =
rhs;
2124 d_members.moveAssign(&lvalue.d_members);
2128#if defined(BSLMF_MOVABLEREF_USES_RVALUE_REFERENCES)
2129 template <
class TARGET_TYPE>
2130 template <
class BDE_OTHER_TYPE>
2134 ManagedPtr<TARGET_TYPE> >::type&
2135 ManagedPtr<TARGET_TYPE>::operator =(
2137#elif defined(BSLS_PLATFORM_CMP_SUN) && BSLS_PLATFORM_CMP_VERSION < 0x5130
2139 template <
class TARGET_TYPE>
2140 template <
class BDE_OTHER_TYPE>
2142 ManagedPtr<TARGET_TYPE>&
2143 ManagedPtr<TARGET_TYPE>::operator =(
2147 template <
class TARGET_TYPE>
2148 template <
class BDE_OTHER_TYPE>
2152 ManagedPtr<TARGET_TYPE> >::type&
2153 ManagedPtr<TARGET_TYPE>::operator =(
2160 #if defined(BSLS_PLATFORM_CMP_SUN) && BSLS_PLATFORM_CMP_VERSION < 0x5130
2162 TARGET_TYPE *>::value));
2165 ManagedPtr<BDE_OTHER_TYPE>& lvalue =
rhs;
2166 d_members.moveAssign(&lvalue.d_members);
2170 d_members.setAliasPtr(
2171 stripBasePointerType(
2172 static_cast<TARGET_TYPE *
>(
2173 static_cast<BDE_OTHER_TYPE *
>(
2174 d_members.pointer()))));
2179template <
class TARGET_TYPE>
2181ManagedPtr<TARGET_TYPE>&
2182ManagedPtr<TARGET_TYPE>::operator=(ManagedPtr_Ref<TARGET_TYPE> ref)
2185 d_members.moveAssign(
ref.base());
2186 d_members.setAliasPtr(stripBasePointerType(
ref.target()));
2190template <
class TARGET_TYPE>
2192ManagedPtr<TARGET_TYPE>&
2199template <
class TARGET_TYPE>
2200template <
class REFERENCED_TYPE>
2202ManagedPtr<TARGET_TYPE>::operator ManagedPtr_Ref<REFERENCED_TYPE>()
2205 REFERENCED_TYPE *>::value));
2207 return ManagedPtr_Ref<REFERENCED_TYPE>(&d_members,
2208 static_cast<REFERENCED_TYPE *
>(
2209 static_cast<TARGET_TYPE *
>(d_members.pointer())));
2212template <
class TARGET_TYPE>
2214void ManagedPtr<TARGET_TYPE>::clear()
2219template <
class TARGET_TYPE>
2220template <
class MANAGED_TYPE>
2222void ManagedPtr<TARGET_TYPE>::load(MANAGED_TYPE *ptr)
2226 typedef ManagedPtr_FactoryDeleter<MANAGED_TYPE, Allocator> DeleterFactory;
2228 static_cast<void *
>(Default::allocator()),
2229 &DeleterFactory::deleter);
2232template <
class TARGET_TYPE>
2233template <
class MANAGED_TYPE,
class FACTORY_TYPE>
2235void ManagedPtr<TARGET_TYPE>::load(MANAGED_TYPE *ptr, FACTORY_TYPE *factory)
2241 ManagedPtr_FactoryDeleterType<MANAGED_TYPE, FACTORY_TYPE>::type
2244 this->loadImp(ptr,
static_cast<void *
>(factory), &DeleterFactory::deleter);
2247template <
class TARGET_TYPE>
2248template <
class MANAGED_TYPE>
2250void ManagedPtr<TARGET_TYPE>::load(MANAGED_TYPE *ptr,
2252 DeleterFunc deleter)
2257 this->loadImp(ptr, cookie, deleter);
2260template <
class TARGET_TYPE>
2262void ManagedPtr<TARGET_TYPE>::load(
bsl::nullptr_t,
void *, DeleterFunc)
2267#ifndef BDE_OMIT_INTERNAL_DEPRECATED
2268template <
class TARGET_TYPE>
2269template <
class MANAGED_TYPE,
class COOKIE_TYPE>
2271void ManagedPtr<TARGET_TYPE>::load(MANAGED_TYPE *ptr,
2272 COOKIE_TYPE *cookie,
2273 DeleterFunc deleter)
2278 this->loadImp(ptr,
static_cast<void *
>(cookie), deleter);
2281template <
class TARGET_TYPE>
2282template <
class MANAGED_TYPE,
class MANAGED_BASE>
2284void ManagedPtr<TARGET_TYPE>::load(
2287 void (*deleter)(MANAGED_BASE *,
void *))
2294 this->loadImp(ptr, cookie,
reinterpret_cast<DeleterFunc
>(deleter));
2297template <
class TARGET_TYPE>
2298template <
class MANAGED_TYPE,
2303void ManagedPtr<TARGET_TYPE>::load(
2305 COOKIE_TYPE *cookie,
2306 void (*deleter)(MANAGED_BASE *, COOKIE_BASE *))
2314 static_cast<void *
>(
static_cast<COOKIE_BASE *
>(cookie)),
2315 reinterpret_cast<DeleterFunc
>(deleter));
2319template <
class TARGET_TYPE>
2320template <
class ALIASED_TYPE>
2321void ManagedPtr<TARGET_TYPE>::loadAlias(ManagedPtr<ALIASED_TYPE>& alias,
2326 if (ptr && alias.d_members.pointer()) {
2327 d_members.moveAssign(&alias.d_members);
2328 d_members.setAliasPtr(stripBasePointerType(ptr));
2331 d_members.runDeleter();
2336template <
class TARGET_TYPE>
2337ManagedPtr_PairProxy<TARGET_TYPE, ManagedPtrDeleter>
2338ManagedPtr<TARGET_TYPE>::release()
2340 typedef ManagedPtr_PairProxy<TARGET_TYPE, ManagedPtrDeleter> ResultType;
2342 TARGET_TYPE *p =
get();
2348 ResultType result = { p, d_members.deleter() };
2352 ResultType result = { p, ManagedPtrDeleter() };
2356template <
class TARGET_TYPE>
2357TARGET_TYPE *ManagedPtr<TARGET_TYPE>::release(ManagedPtrDeleter *deleter)
2361 TARGET_TYPE *result =
get();
2367 *deleter = d_members.deleter();
2373template <
class TARGET_TYPE>
2375void ManagedPtr<TARGET_TYPE>::reset()
2377 d_members.runDeleter();
2381template <
class TARGET_TYPE>
2383void ManagedPtr<TARGET_TYPE>::swap(ManagedPtr& other)
2385 d_members.swap(other.d_members);
2389template <
class TARGET_TYPE>
2393 return !d_members.pointer();
2396template <
class TARGET_TYPE>
2400 return d_members.pointer();
2403template <
class TARGET_TYPE>
2405#if defined(BSLS_PLATFORM_CMP_IBM)
2406ManagedPtr<TARGET_TYPE>::operator
typename ManagedPtr::BoolType() const
2408ManagedPtr<TARGET_TYPE>::operator BoolType() const
2411 return d_members.pointer()
2413 :
bsls::UnspecifiedBool<ManagedPtr>::falseValue();
2416template <
class TARGET_TYPE>
2419ManagedPtr<TARGET_TYPE>::operator*()
const
2423 return *
static_cast<TARGET_TYPE *
>(d_members.pointer());
2426template <
class TARGET_TYPE>
2428TARGET_TYPE *ManagedPtr<TARGET_TYPE>::operator->()
const
2430 return static_cast<TARGET_TYPE *
>(d_members.pointer());
2433template <
class TARGET_TYPE>
2435const ManagedPtrDeleter& ManagedPtr<TARGET_TYPE>::deleter()
const
2439 return d_members.deleter();
2442template <
class TARGET_TYPE>
2444TARGET_TYPE *ManagedPtr<TARGET_TYPE>::get()
const
2446 return static_cast<TARGET_TYPE *
>(d_members.pointer());
2449template <
class TARGET_TYPE>
2451TARGET_TYPE *ManagedPtr<TARGET_TYPE>::ptr()
const
2457template <
class TARGET_TYPE>
2459void swap(ManagedPtr<TARGET_TYPE>& a, ManagedPtr<TARGET_TYPE>& b)
2468template <
class ELEMENT_TYPE>
2470void ManagedPtrUtil::allocatorDeleter(
void *
object,
void *allocator)
2475 AllocatorUtil::deleteObject(
static_cast<Allocator *
>(allocator),
2476 static_cast<ELEMENT_TYPE *
>(
object));
2479#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
2482#ifndef BSLMA_MANAGEDPTR_VARIADIC_LIMIT
2483#define BSLMA_MANAGEDPTR_VARIADIC_LIMIT 14
2485#ifndef BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B
2486#define BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B BSLMA_MANAGEDPTR_VARIADIC_LIMIT
2489#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 0
2490template <
class ELEMENT_TYPE,
class ALLOCATOR>
2493 ManagedPtr<ELEMENT_TYPE> >::type
2494ManagedPtrUtil::allocateManaged(
const ALLOCATOR& allocator)
2496 return allocateManaged<ELEMENT_TYPE>(
2497 allocator.mechanism());
2501#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 1
2502template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01>
2505 ManagedPtr<ELEMENT_TYPE> >::type
2506ManagedPtrUtil::allocateManaged(
const ALLOCATOR& allocator,
2509 return allocateManaged<ELEMENT_TYPE>(
2510 allocator.mechanism(),
2515#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 2
2516template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
2520 ManagedPtr<ELEMENT_TYPE> >::type
2521ManagedPtrUtil::allocateManaged(
const ALLOCATOR& allocator,
2525 return allocateManaged<ELEMENT_TYPE>(
2526 allocator.mechanism(),
2532#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 3
2533template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
2538 ManagedPtr<ELEMENT_TYPE> >::type
2539ManagedPtrUtil::allocateManaged(
const ALLOCATOR& allocator,
2544 return allocateManaged<ELEMENT_TYPE>(
2545 allocator.mechanism(),
2552#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 4
2553template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
2559 ManagedPtr<ELEMENT_TYPE> >::type
2560ManagedPtrUtil::allocateManaged(
const ALLOCATOR& allocator,
2566 return allocateManaged<ELEMENT_TYPE>(
2567 allocator.mechanism(),
2575#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 5
2576template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
2583 ManagedPtr<ELEMENT_TYPE> >::type
2584ManagedPtrUtil::allocateManaged(
const ALLOCATOR& allocator,
2591 return allocateManaged<ELEMENT_TYPE>(
2592 allocator.mechanism(),
2601#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 6
2602template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
2610 ManagedPtr<ELEMENT_TYPE> >::type
2611ManagedPtrUtil::allocateManaged(
const ALLOCATOR& allocator,
2619 return allocateManaged<ELEMENT_TYPE>(
2620 allocator.mechanism(),
2630#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 7
2631template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
2640 ManagedPtr<ELEMENT_TYPE> >::type
2641ManagedPtrUtil::allocateManaged(
const ALLOCATOR& allocator,
2650 return allocateManaged<ELEMENT_TYPE>(
2651 allocator.mechanism(),
2662#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 8
2663template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
2673 ManagedPtr<ELEMENT_TYPE> >::type
2674ManagedPtrUtil::allocateManaged(
const ALLOCATOR& allocator,
2684 return allocateManaged<ELEMENT_TYPE>(
2685 allocator.mechanism(),
2697#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 9
2698template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
2709 ManagedPtr<ELEMENT_TYPE> >::type
2710ManagedPtrUtil::allocateManaged(
const ALLOCATOR& allocator,
2721 return allocateManaged<ELEMENT_TYPE>(
2722 allocator.mechanism(),
2735#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 10
2736template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
2748 ManagedPtr<ELEMENT_TYPE> >::type
2749ManagedPtrUtil::allocateManaged(
const ALLOCATOR& allocator,
2761 return allocateManaged<ELEMENT_TYPE>(
2762 allocator.mechanism(),
2776#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 11
2777template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
2790 ManagedPtr<ELEMENT_TYPE> >::type
2791ManagedPtrUtil::allocateManaged(
const ALLOCATOR& allocator,
2804 return allocateManaged<ELEMENT_TYPE>(
2805 allocator.mechanism(),
2820#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 12
2821template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
2835 ManagedPtr<ELEMENT_TYPE> >::type
2836ManagedPtrUtil::allocateManaged(
const ALLOCATOR& allocator,
2850 return allocateManaged<ELEMENT_TYPE>(
2851 allocator.mechanism(),
2867#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 13
2868template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
2883 ManagedPtr<ELEMENT_TYPE> >::type
2884ManagedPtrUtil::allocateManaged(
const ALLOCATOR& allocator,
2899 return allocateManaged<ELEMENT_TYPE>(
2900 allocator.mechanism(),
2917#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 14
2918template <
class ELEMENT_TYPE,
class ALLOCATOR,
class ARGS_01,
2934 ManagedPtr<ELEMENT_TYPE> >::type
2935ManagedPtrUtil::allocateManaged(
const ALLOCATOR& allocator,
2951 return allocateManaged<ELEMENT_TYPE>(
2952 allocator.mechanism(),
2971#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 0
2972template <
class ELEMENT_TYPE>
2974ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
2981 UnqualElem *objPtr =
2982 bslma::AllocatorUtil::allocateObject<UnqualElem>(defaultAllocator);
2985 defaultAllocator, objPtr);
2987 ::new (PointerUtil::voidify(objPtr)) ELEMENT_TYPE(
2991 return ManagedPtr<ELEMENT_TYPE>(objPtr,
2993 &allocatorDeleter<UnqualElem>);
2997#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 1
2998template <
class ELEMENT_TYPE,
class ARGS_01>
3000ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
3007 UnqualElem *objPtr =
3008 bslma::AllocatorUtil::allocateObject<UnqualElem>(defaultAllocator);
3011 defaultAllocator, objPtr);
3013 ::new (PointerUtil::voidify(objPtr)) ELEMENT_TYPE(
3017 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3019 &allocatorDeleter<UnqualElem>);
3023#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 2
3024template <
class ELEMENT_TYPE,
class ARGS_01,
3027ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
3035 UnqualElem *objPtr =
3036 bslma::AllocatorUtil::allocateObject<UnqualElem>(defaultAllocator);
3039 defaultAllocator, objPtr);
3041 ::new (PointerUtil::voidify(objPtr)) ELEMENT_TYPE(
3046 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3048 &allocatorDeleter<UnqualElem>);
3052#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 3
3053template <
class ELEMENT_TYPE,
class ARGS_01,
3057ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
3066 UnqualElem *objPtr =
3067 bslma::AllocatorUtil::allocateObject<UnqualElem>(defaultAllocator);
3070 defaultAllocator, objPtr);
3072 ::new (PointerUtil::voidify(objPtr)) ELEMENT_TYPE(
3078 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3080 &allocatorDeleter<UnqualElem>);
3084#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 4
3085template <
class ELEMENT_TYPE,
class ARGS_01,
3090ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
3100 UnqualElem *objPtr =
3101 bslma::AllocatorUtil::allocateObject<UnqualElem>(defaultAllocator);
3104 defaultAllocator, objPtr);
3106 ::new (PointerUtil::voidify(objPtr)) ELEMENT_TYPE(
3113 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3115 &allocatorDeleter<UnqualElem>);
3119#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 5
3120template <
class ELEMENT_TYPE,
class ARGS_01,
3126ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
3137 UnqualElem *objPtr =
3138 bslma::AllocatorUtil::allocateObject<UnqualElem>(defaultAllocator);
3141 defaultAllocator, objPtr);
3143 ::new (PointerUtil::voidify(objPtr)) ELEMENT_TYPE(
3151 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3153 &allocatorDeleter<UnqualElem>);
3157#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 6
3158template <
class ELEMENT_TYPE,
class ARGS_01,
3165ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
3177 UnqualElem *objPtr =
3178 bslma::AllocatorUtil::allocateObject<UnqualElem>(defaultAllocator);
3181 defaultAllocator, objPtr);
3183 ::new (PointerUtil::voidify(objPtr)) ELEMENT_TYPE(
3192 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3194 &allocatorDeleter<UnqualElem>);
3198#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 7
3199template <
class ELEMENT_TYPE,
class ARGS_01,
3207ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
3220 UnqualElem *objPtr =
3221 bslma::AllocatorUtil::allocateObject<UnqualElem>(defaultAllocator);
3224 defaultAllocator, objPtr);
3226 ::new (PointerUtil::voidify(objPtr)) ELEMENT_TYPE(
3236 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3238 &allocatorDeleter<UnqualElem>);
3242#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 8
3243template <
class ELEMENT_TYPE,
class ARGS_01,
3252ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
3266 UnqualElem *objPtr =
3267 bslma::AllocatorUtil::allocateObject<UnqualElem>(defaultAllocator);
3270 defaultAllocator, objPtr);
3272 ::new (PointerUtil::voidify(objPtr)) ELEMENT_TYPE(
3283 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3285 &allocatorDeleter<UnqualElem>);
3289#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 9
3290template <
class ELEMENT_TYPE,
class ARGS_01,
3300ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
3315 UnqualElem *objPtr =
3316 bslma::AllocatorUtil::allocateObject<UnqualElem>(defaultAllocator);
3319 defaultAllocator, objPtr);
3321 ::new (PointerUtil::voidify(objPtr)) ELEMENT_TYPE(
3333 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3335 &allocatorDeleter<UnqualElem>);
3339#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 10
3340template <
class ELEMENT_TYPE,
class ARGS_01,
3351ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
3367 UnqualElem *objPtr =
3368 bslma::AllocatorUtil::allocateObject<UnqualElem>(defaultAllocator);
3371 defaultAllocator, objPtr);
3373 ::new (PointerUtil::voidify(objPtr)) ELEMENT_TYPE(
3386 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3388 &allocatorDeleter<UnqualElem>);
3392#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 11
3393template <
class ELEMENT_TYPE,
class ARGS_01,
3405ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
3422 UnqualElem *objPtr =
3423 bslma::AllocatorUtil::allocateObject<UnqualElem>(defaultAllocator);
3426 defaultAllocator, objPtr);
3428 ::new (PointerUtil::voidify(objPtr)) ELEMENT_TYPE(
3442 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3444 &allocatorDeleter<UnqualElem>);
3448#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 12
3449template <
class ELEMENT_TYPE,
class ARGS_01,
3462ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
3480 UnqualElem *objPtr =
3481 bslma::AllocatorUtil::allocateObject<UnqualElem>(defaultAllocator);
3484 defaultAllocator, objPtr);
3486 ::new (PointerUtil::voidify(objPtr)) ELEMENT_TYPE(
3501 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3503 &allocatorDeleter<UnqualElem>);
3507#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 13
3508template <
class ELEMENT_TYPE,
class ARGS_01,
3522ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
3541 UnqualElem *objPtr =
3542 bslma::AllocatorUtil::allocateObject<UnqualElem>(defaultAllocator);
3545 defaultAllocator, objPtr);
3547 ::new (PointerUtil::voidify(objPtr)) ELEMENT_TYPE(
3563 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3565 &allocatorDeleter<UnqualElem>);
3569#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 14
3570template <
class ELEMENT_TYPE,
class ARGS_01,
3585ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
3605 UnqualElem *objPtr =
3606 bslma::AllocatorUtil::allocateObject<UnqualElem>(defaultAllocator);
3609 defaultAllocator, objPtr);
3611 ::new (PointerUtil::voidify(objPtr)) ELEMENT_TYPE(
3628 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3630 &allocatorDeleter<UnqualElem>);
3635#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 0
3636template <
class ELEMENT_TYPE>
3638ManagedPtr<ELEMENT_TYPE>
3645 ELEMENT_TYPE *objPtr = bslma::AllocatorUtil::newObject<UnqualElem>(
3648 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3650 &allocatorDeleter<UnqualElem>);
3654#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 1
3655template <
class ELEMENT_TYPE,
class ARGS_01>
3657ManagedPtr<ELEMENT_TYPE>
3665 ELEMENT_TYPE *objPtr = bslma::AllocatorUtil::newObject<UnqualElem>(
3669 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3671 &allocatorDeleter<UnqualElem>);
3675#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 2
3676template <
class ELEMENT_TYPE,
class ARGS_01,
3679ManagedPtr<ELEMENT_TYPE>
3688 ELEMENT_TYPE *objPtr = bslma::AllocatorUtil::newObject<UnqualElem>(
3693 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3695 &allocatorDeleter<UnqualElem>);
3699#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 3
3700template <
class ELEMENT_TYPE,
class ARGS_01,
3704ManagedPtr<ELEMENT_TYPE>
3714 ELEMENT_TYPE *objPtr = bslma::AllocatorUtil::newObject<UnqualElem>(
3720 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3722 &allocatorDeleter<UnqualElem>);
3726#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 4
3727template <
class ELEMENT_TYPE,
class ARGS_01,
3732ManagedPtr<ELEMENT_TYPE>
3743 ELEMENT_TYPE *objPtr = bslma::AllocatorUtil::newObject<UnqualElem>(
3750 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3752 &allocatorDeleter<UnqualElem>);
3756#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 5
3757template <
class ELEMENT_TYPE,
class ARGS_01,
3763ManagedPtr<ELEMENT_TYPE>
3775 ELEMENT_TYPE *objPtr = bslma::AllocatorUtil::newObject<UnqualElem>(
3783 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3785 &allocatorDeleter<UnqualElem>);
3789#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 6
3790template <
class ELEMENT_TYPE,
class ARGS_01,
3797ManagedPtr<ELEMENT_TYPE>
3810 ELEMENT_TYPE *objPtr = bslma::AllocatorUtil::newObject<UnqualElem>(
3819 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3821 &allocatorDeleter<UnqualElem>);
3825#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 7
3826template <
class ELEMENT_TYPE,
class ARGS_01,
3834ManagedPtr<ELEMENT_TYPE>
3848 ELEMENT_TYPE *objPtr = bslma::AllocatorUtil::newObject<UnqualElem>(
3858 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3860 &allocatorDeleter<UnqualElem>);
3864#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 8
3865template <
class ELEMENT_TYPE,
class ARGS_01,
3874ManagedPtr<ELEMENT_TYPE>
3889 ELEMENT_TYPE *objPtr = bslma::AllocatorUtil::newObject<UnqualElem>(
3900 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3902 &allocatorDeleter<UnqualElem>);
3906#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 9
3907template <
class ELEMENT_TYPE,
class ARGS_01,
3917ManagedPtr<ELEMENT_TYPE>
3933 ELEMENT_TYPE *objPtr = bslma::AllocatorUtil::newObject<UnqualElem>(
3945 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3947 &allocatorDeleter<UnqualElem>);
3951#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 10
3952template <
class ELEMENT_TYPE,
class ARGS_01,
3963ManagedPtr<ELEMENT_TYPE>
3980 ELEMENT_TYPE *objPtr = bslma::AllocatorUtil::newObject<UnqualElem>(
3993 return ManagedPtr<ELEMENT_TYPE>(objPtr,
3995 &allocatorDeleter<UnqualElem>);
3999#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 11
4000template <
class ELEMENT_TYPE,
class ARGS_01,
4012ManagedPtr<ELEMENT_TYPE>
4030 ELEMENT_TYPE *objPtr = bslma::AllocatorUtil::newObject<UnqualElem>(
4044 return ManagedPtr<ELEMENT_TYPE>(objPtr,
4046 &allocatorDeleter<UnqualElem>);
4050#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 12
4051template <
class ELEMENT_TYPE,
class ARGS_01,
4064ManagedPtr<ELEMENT_TYPE>
4083 ELEMENT_TYPE *objPtr = bslma::AllocatorUtil::newObject<UnqualElem>(
4098 return ManagedPtr<ELEMENT_TYPE>(objPtr,
4100 &allocatorDeleter<UnqualElem>);
4104#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 13
4105template <
class ELEMENT_TYPE,
class ARGS_01,
4119ManagedPtr<ELEMENT_TYPE>
4139 ELEMENT_TYPE *objPtr = bslma::AllocatorUtil::newObject<UnqualElem>(
4155 return ManagedPtr<ELEMENT_TYPE>(objPtr,
4157 &allocatorDeleter<UnqualElem>);
4161#if BSLMA_MANAGEDPTR_VARIADIC_LIMIT_B >= 14
4162template <
class ELEMENT_TYPE,
class ARGS_01,
4177ManagedPtr<ELEMENT_TYPE>
4198 ELEMENT_TYPE *objPtr = bslma::AllocatorUtil::newObject<UnqualElem>(
4215 return ManagedPtr<ELEMENT_TYPE>(objPtr,
4217 &allocatorDeleter<UnqualElem>);
4225template <
class ELEMENT_TYPE,
class ALLOCATOR,
class... ARGS>
4228 ManagedPtr<ELEMENT_TYPE> >::type
4229ManagedPtrUtil::allocateManaged(
const ALLOCATOR& allocator,
4232 return allocateManaged<ELEMENT_TYPE>(
4233 allocator.mechanism(),
4237template <
class ELEMENT_TYPE,
class... ARGS>
4239ManagedPtr<ELEMENT_TYPE> ManagedPtrUtil::makeManaged(
4246 UnqualElem *objPtr =
4247 bslma::AllocatorUtil::allocateObject<UnqualElem>(defaultAllocator);
4250 defaultAllocator, objPtr);
4252 ::new (PointerUtil::voidify(objPtr)) ELEMENT_TYPE(
4256 return ManagedPtr<ELEMENT_TYPE>(objPtr,
4258 &allocatorDeleter<UnqualElem>);
4261template <
class ELEMENT_TYPE,
class... ARGS>
4263ManagedPtr<ELEMENT_TYPE>
4271 ELEMENT_TYPE *objPtr = bslma::AllocatorUtil::newObject<UnqualElem>(
4275 return ManagedPtr<ELEMENT_TYPE>(objPtr,
4277 &allocatorDeleter<UnqualElem>);
4288template <
class TARGET_TYPE>
4290void ManagedPtrNilDeleter<TARGET_TYPE>::deleter(
void *,
void *)
4299template <
class MANAGED_TYPE>
4301void ManagedPtr_DefaultDeleter<MANAGED_TYPE>::deleter(
void *ptr,
void *)
4303 delete reinterpret_cast<MANAGED_TYPE *
>(ptr);
4314template <
class TARGET_TYPE>
4319template <
class TARGET_TYPE>
4329template <
class TARGET_TYPE>
4330struct is_nothrow_move_constructible<
4338# error Not valid except when included from bslma_managedptr.h
Definition bslma_allocator.h:545
Definition bslma_deallocateobjectproctor.h:273
void(* Deleter)(void *managedObject, void *cookie)
Deleter function prototype used to destroy the managed pointer.
Definition bslma_managedptrdeleter.h:120
~ManagedPtr_Ref()
Definition bslma_managedptr.h:1928
ManagedPtr_Ref & operator=(const ManagedPtr_Ref &original)=default
TARGET_TYPE * target() const
Return a pointer to the referenced object.
Definition bslma_managedptr.h:1943
ManagedPtr_Ref(ManagedPtr_Members *base, TARGET_TYPE *target)
Definition bslma_managedptr.h:1918
ManagedPtr_Members * base() const
Return a pointer to the managed state of a ManagedPtr object.
Definition bslma_managedptr.h:1936
Definition bslma_managedptr.h:1173
TARGET_TYPE * get() const
Definition bslma_managedptr.h:2596
TARGET_TYPE * ptr() const
Definition bslma_managedptr.h:2603
~ManagedPtr()
Definition bslma_managedptr.h:2254
bslmf::AddReference< TARGET_TYPE >::Type operator*() const
Definition bslma_managedptr.h:2571
const ManagedPtrDeleter & deleter() const
Definition bslma_managedptr.h:2587
void swap(ManagedPtr &other)
Definition bslma_managedptr.h:2535
TARGET_TYPE * operator->() const
Definition bslma_managedptr.h:2580
void clear()
Definition bslma_managedptr.h:2366
ManagedPtr & operator=(ManagedPtr &rhs) BSLS_KEYWORD_NOEXCEPT
Definition bslma_managedptr.h:2263
TARGET_TYPE element_type
Alias to the TARGET_TYPE template parameter.
Definition bslma_managedptr.h:1183
ManagedPtr_PairProxy< TARGET_TYPE, ManagedPtrDeleter > release()
Definition bslma_managedptr.h:2490
friend class ManagedPtr
Definition bslma_managedptr.h:1282
void reset()
Definition bslma_managedptr.h:2527
void loadAlias(ManagedPtr< ALIASED_TYPE > &alias, TARGET_TYPE *ptr)
Definition bslma_managedptr.h:2473
ManagedPtrDeleter::Deleter DeleterFunc
Definition bslma_managedptr.h:1180
Definition bslmf_movableref.h:752
static BoolType trueValue()
Return a value that converts to the bool value true.
Definition bsls_unspecifiedbool.h:223
int UnspecifiedBool::* BoolType
Definition bsls_unspecifiedbool.h:190
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:231
#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_KEYWORD_NOEXCEPT
Definition bsls_keyword.h:674
void swap(OptionValue &a, OptionValue &b)
void reset(TYPE *object)
Reset the value of the specified object to its default value.
Definition bdlat_valuetypefunctions.h:939
BloombergLP::bsls::Nullptr_Impl::Type nullptr_t
Definition bsls_nullptr.h:283
BSLS_KEYWORD_CONSTEXPR_CPP14 TYPE & get(array< TYPE, SIZE > &a) BSLS_KEYWORD_NOEXCEPT
reference_wrapper< T > ref(T &object)
Return a reference wrapper that represents the specified object.
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
Definition baljsn_encoder_testtypes.h:76
Definition bdlbb_blob.h:579
Definition bdlt_iso8601util.h:707
Definition bslmf_conditional.h:123
Definition bslmf_enableif.h:530
Definition bslmf_isconvertible.h:875
Definition bslmf_isvoid.h:138
remove_const< typenameremove_volatile< t_TYPE >::type >::type type
Definition bslmf_removecv.h:128
static Allocator * allocator(Allocator *basicAllocator=0)
Definition bslma_default.h:913
static Allocator * defaultAllocator()
Definition bslma_default.h:905
static void deleter(void *, void *)
Deleter function that does nothing.
Definition bslma_managedptr.h:2697
static ManagedPtr< ELEMENT_TYPE > makeManaged(ARGS &&... args)
Definition bslma_managedptr.h:2646
static void allocatorDeleter(void *object, void *allocator)
Definition bslma_managedptr.h:2622
static ManagedPtr< ELEMENT_TYPE > allocateManaged(bslma::Allocator *allocator, ARGS &&... args)
Definition bslma_managedptr.h:2673
static void noOpDeleter(void *, void *)
Deleter function that does nothing.
static void deleter(void *ptr, void *)
Definition bslma_managedptr.h:2708
bsl::add_lvalue_reference< t_TYPE >::type Type
Definition bslmf_addreference.h:191
Definition bslmf_movableref.h:795