11#ifndef INCLUDED_BDLB_NULLABLEALLOCATEDVALUE_CPP03
12#define INCLUDED_BDLB_NULLABLEALLOCATEDVALUE_CPP03
63#ifdef COMPILING_BDLB_NULLABLEALLOCATEDVALUE_H
88class NullableAllocatedValue {
90 enum { k_HAS_VALUE = 0 };
94 NullableAllocatedValue_PointerBitsPair<bslma::Allocator, 1> d_allocator;
101# ifndef BSLS_COMPILERFEATURES_SUPPORT_OPERATOR_EXPLICIT
108 typedef BloombergLP::bsls::UnspecifiedBool<NullableAllocatedValue>
110 typedef typename UnspecifiedBoolUtil::BoolType UnspecifiedBool;
126 const TYPE *getAddress() const;
141 void setRemoteAddress(TYPE *newPtr);
170 bslma::UsesBslmaAllocator);
172 bslmf::IsBitwiseMoveable);
174 bdlb::HasPrintMethod);
245#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
248#ifndef BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT
249#define BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT 10
251#ifndef BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A
252#define BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT
254#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 0
258#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 1
259 template <
class ARGS_01>
263#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 2
264 template <
class ARGS_01,
270#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 3
271 template <
class ARGS_01,
279#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 4
280 template <
class ARGS_01,
290#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 5
291 template <
class ARGS_01,
303#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 6
304 template <
class ARGS_01,
318#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 7
319 template <
class ARGS_01,
335#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 8
336 template <
class ARGS_01,
354#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 9
355 template <
class ARGS_01,
375#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 10
376 template <
class ARGS_01,
399# if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
400#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 0
401 template <
class INIT_LIST_TYPE>
402 TYPE&
emplace(std::initializer_list<INIT_LIST_TYPE> il);
405#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 1
406 template <
class INIT_LIST_TYPE,
class ARGS_01>
407 TYPE&
emplace(std::initializer_list<INIT_LIST_TYPE> il,
411#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 2
412 template <
class INIT_LIST_TYPE,
class ARGS_01,
414 TYPE&
emplace(std::initializer_list<INIT_LIST_TYPE> il,
419#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 3
420 template <
class INIT_LIST_TYPE,
class ARGS_01,
423 TYPE&
emplace(std::initializer_list<INIT_LIST_TYPE> il,
429#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 4
430 template <
class INIT_LIST_TYPE,
class ARGS_01,
434 TYPE&
emplace(std::initializer_list<INIT_LIST_TYPE> il,
441#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 5
442 template <
class INIT_LIST_TYPE,
class ARGS_01,
447 TYPE&
emplace(std::initializer_list<INIT_LIST_TYPE> il,
455#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 6
456 template <
class INIT_LIST_TYPE,
class ARGS_01,
462 TYPE&
emplace(std::initializer_list<INIT_LIST_TYPE> il,
471#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 7
472 template <
class INIT_LIST_TYPE,
class ARGS_01,
479 TYPE&
emplace(std::initializer_list<INIT_LIST_TYPE> il,
489#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 8
490 template <
class INIT_LIST_TYPE,
class ARGS_01,
498 TYPE&
emplace(std::initializer_list<INIT_LIST_TYPE> il,
509#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 9
510 template <
class INIT_LIST_TYPE,
class ARGS_01,
519 TYPE&
emplace(std::initializer_list<INIT_LIST_TYPE> il,
531#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_A >= 10
532 template <
class INIT_LIST_TYPE,
class ARGS_01,
542 TYPE&
emplace(std::initializer_list<INIT_LIST_TYPE> il,
560 template <
class... ARGS>
563# if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
564 template <
class INIT_LIST_TYPE,
class... ARGS>
565 TYPE&
emplace(std::initializer_list<INIT_LIST_TYPE> il,
583 template <
class STREAM>
623 template <
class STREAM>
654#ifndef BDE_OMIT_INTERNAL_DEPRECATED
666 template <
class ANY_TYPE>
667 TYPE
value_or(
const ANY_TYPE& default_value)
const;
682# ifdef BSLS_COMPILERFEATURES_SUPPORT_OPERATOR_EXPLICIT
689 operator UnspecifiedBool() const BSLS_NOTHROW_SPEC
691 return UnspecifiedBoolUtil::makeValue(
has_value());
709 bsl::ostream&
print(bsl::ostream& stream,
711 int spacesPerLevel = 4)
const;
717 const TYPE&
value()
const;
726 "Use 'has_value() ? &value() : address' instead")
727 const TYPE *addressOr(const TYPE *address) const;
729#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
732#ifndef BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT
733#define BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT 10
735#ifndef BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_B
736#define BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_B BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT
739#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_B >= 0
741 "Use 'emplace' instead")
742 TYPE& makeValueInplace();
745#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_B >= 1
746 template <
class ARGS_01>
748 "Use 'emplace' instead")
752#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_B >= 2
753 template <
class ARGS_01,
756 "Use 'emplace' instead")
761#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_B >= 3
762 template <
class ARGS_01,
766 "Use 'emplace' instead")
772#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_B >= 4
773 template <
class ARGS_01,
778 "Use 'emplace' instead")
785#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_B >= 5
786 template <
class ARGS_01,
792 "Use 'emplace' instead")
800#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_B >= 6
801 template <
class ARGS_01,
808 "Use 'emplace' instead")
817#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_B >= 7
818 template <
class ARGS_01,
826 "Use 'emplace' instead")
836#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_B >= 8
837 template <
class ARGS_01,
846 "Use 'emplace' instead")
857#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_B >= 9
858 template <
class ARGS_01,
868 "Use 'emplace' instead")
880#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_B >= 10
881 template <
class ARGS_01,
892 "Use 'emplace' instead")
909 template <
class... ARGS>
911 "Use 'emplace' instead")
922 "Use 'value_or' instead")
923 TYPE valueOr(const TYPE& otherValue) const;
930 const TYPE *valueOrNull() const;
942template <class LHS_TYPE, class RHS_TYPE>
953template <class LHS_TYPE, class RHS_TYPE>
955 const RHS_TYPE& rhs);
956template <class LHS_TYPE, class RHS_TYPE>
957bool operator==(const LHS_TYPE& lhs,
967template <class LHS_TYPE, class RHS_TYPE>
978template <class LHS_TYPE, class RHS_TYPE>
980 const RHS_TYPE& rhs);
981template <class LHS_TYPE, class RHS_TYPE>
982bool operator!=(const LHS_TYPE& lhs,
992template <class LHS_TYPE, class RHS_TYPE>
999template <class LHS_TYPE, class RHS_TYPE>
1001 const RHS_TYPE& rhs);
1006template <class LHS_TYPE, class RHS_TYPE>
1007bool operator<(const LHS_TYPE& lhs,
1018template <class LHS_TYPE, class RHS_TYPE>
1027template <class LHS_TYPE, class RHS_TYPE>
1029 const RHS_TYPE& rhs);
1036template <class LHS_TYPE, class RHS_TYPE>
1037bool operator<=(const LHS_TYPE& lhs,
1048template <class LHS_TYPE, class RHS_TYPE>
1057template <class LHS_TYPE, class RHS_TYPE>
1059 const RHS_TYPE& rhs);
1066template <class LHS_TYPE, class RHS_TYPE>
1067bool operator>(const LHS_TYPE& lhs,
1077template <class LHS_TYPE, class RHS_TYPE>
1086template <class LHS_TYPE, class RHS_TYPE>
1088 const RHS_TYPE& rhs);
1095template <class LHS_TYPE, class RHS_TYPE>
1096bool operator>=(const LHS_TYPE& lhs,
1108template <class TYPE>
1109bsl::ostream& operator<<(
bsl::ostream& stream,
1117template <class TYPE>
1122template <class TYPE>
1127template <class TYPE>
1133template <class TYPE>
1140template <class TYPE>
1148template <class TYPE>
1154template <class TYPE>
1161template <class TYPE>
1166template <class TYPE>
1171template <class TYPE>
1176template <class TYPE>
1181template <class TYPE>
1192template <class LHS_TYPE, class RHS_TYPE>
1194 const
bsl::optional<RHS_TYPE>& rhs);
1195template <class LHS_TYPE, class RHS_TYPE>
1196bool operator==(const
bsl::optional<LHS_TYPE>& lhs,
1202template <class LHS_TYPE, class RHS_TYPE>
1204 const
bsl::optional<RHS_TYPE>& rhs);
1205template <class LHS_TYPE, class RHS_TYPE>
1206bool operator!=(const
bsl::optional<LHS_TYPE>& lhs,
1213template <class LHS_TYPE, class RHS_TYPE>
1215 const
bsl::optional<RHS_TYPE>& rhs);
1221template <class LHS_TYPE, class RHS_TYPE>
1222bool operator<(const
bsl::optional<LHS_TYPE>& lhs,
1229template <class LHS_TYPE, class RHS_TYPE>
1231 const
bsl::optional<RHS_TYPE>& rhs);
1237template <class LHS_TYPE, class RHS_TYPE>
1238bool operator>(const
bsl::optional<LHS_TYPE>& lhs,
1245template <class LHS_TYPE, class RHS_TYPE>
1247 const
bsl::optional<RHS_TYPE>& rhs);
1253template <class LHS_TYPE, class RHS_TYPE>
1254bool operator<=(const
bsl::optional<LHS_TYPE>& lhs,
1261template <class LHS_TYPE, class RHS_TYPE>
1263 const
bsl::optional<RHS_TYPE>& rhs);
1269template <class LHS_TYPE, class RHS_TYPE>
1270bool operator>=(const
bsl::optional<LHS_TYPE>& lhs,
1279template <class HASHALG, class TYPE>
1285template <class TYPE>
1298template <class TYPE>
1301: d_allocator(
bslma::Default::defaultAllocator())
1303 d_storage.d_pointer_p = 0;
1306template <
class TYPE>
1308NullableAllocatedValue<TYPE>
1312 d_storage.d_pointer_p = 0;
1315template <
class TYPE>
1317NullableAllocatedValue<TYPE>::NullableAllocatedValue(
const bsl::nullopt_t&)
1318: d_allocator(
bslma::Default::defaultAllocator())
1320 d_storage.d_pointer_p = 0;
1323template <
class TYPE>
1325NullableAllocatedValue<TYPE>
1328: d_allocator(allocator.mechanism())
1330 d_storage.d_pointer_p = 0;
1333template <
class TYPE>
1335NullableAllocatedValue<TYPE>
1336::NullableAllocatedValue(
const NullableAllocatedValue<TYPE>& original)
1337: d_allocator(
bslma::Default::defaultAllocator())
1339 if (original.has_value()) {
1343 d_storage.d_pointer_p = 0;
1347template <
class TYPE>
1349NullableAllocatedValue<TYPE>
1350::NullableAllocatedValue(
const NullableAllocatedValue<TYPE>& original,
1352: d_allocator(allocator.mechanism())
1354 if (original.has_value()) {
1358 d_storage.d_pointer_p = 0;
1362template <
class TYPE>
1364NullableAllocatedValue<TYPE>::NullableAllocatedValue(
const TYPE& value)
1365: d_allocator(
bslma::Default::defaultAllocator())
1370template <
class TYPE>
1372NullableAllocatedValue<TYPE>::NullableAllocatedValue(
1375: d_allocator(allocator.mechanism())
1380template <
class TYPE>
1382NullableAllocatedValue<TYPE>::~NullableAllocatedValue()
1388template <
class TYPE>
1393 return (
sizeof(TYPE) <=
sizeof(TYPE *)) &&
1400template <
class TYPE>
1402NullableAllocatedValue<TYPE>&
1403NullableAllocatedValue<TYPE>::operator=(
1404 const NullableAllocatedValue<TYPE>& rhs)
1406 if (
rhs.has_value()) {
1416template <
class TYPE>
1418NullableAllocatedValue<TYPE>&
1425template <
class TYPE>
1427NullableAllocatedValue<TYPE>&
1428NullableAllocatedValue<TYPE>::operator=(
const TYPE& rhs)
1434template <
class TYPE>
1435template <
class STREAM>
1436STREAM& NullableAllocatedValue<TYPE>::bdexStreamIn(STREAM& stream,
int version)
1440 char isNullFlag = 0;
1442 stream.getInt8(isNullFlag);
1457template <
class TYPE>
1459TYPE& NullableAllocatedValue<TYPE>::makeValue(
const TYPE& val)
1472 TYPE *tmpPtr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
1477 setRemoteAddress(tmpPtr);
1484template <
class TYPE>
1486TYPE& NullableAllocatedValue<TYPE>::makeValue()
1505 TYPE *tmpPtr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
1510 setRemoteAddress(tmpPtr);
1518template <
class TYPE>
1520void NullableAllocatedValue<TYPE>::reset()
1523 TYPE *p = getAddress();
1529 clearHasValueFlag();
1533template <
class TYPE>
1534void NullableAllocatedValue<TYPE>::swap(NullableAllocatedValue& other)
1541 if (
isNull() && other.isNull()) {
1553template <
class TYPE>
1555TYPE& NullableAllocatedValue<TYPE>::value()
1558 return *getAddress();
1561template <
class TYPE>
1563TYPE *NullableAllocatedValue<TYPE>::operator->()
1566 return getAddress();
1569template <
class TYPE>
1571TYPE& NullableAllocatedValue<TYPE>::operator*()
1577#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
1580#ifndef BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT
1581#define BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT 10
1583#ifndef BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C
1584#define BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT
1586#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 0
1587template <
class TYPE>
1589TYPE& NullableAllocatedValue<TYPE>::emplace(
1593 TYPE *ptr = getAddress();
1597 clearHasValueFlag();
1599 else if (!isLocal()) {
1600 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
1601 setRemoteAddress(ptr);
1605 BloombergLP::bslma::ConstructionUtil::construct(
1611 BloombergLP::bslma::ConstructionUtil::construct(
1621#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 1
1622template <
class TYPE>
1623template <
class ARGS_01>
1625TYPE& NullableAllocatedValue<TYPE>::emplace(
1629 TYPE *ptr = getAddress();
1633 clearHasValueFlag();
1635 else if (!isLocal()) {
1636 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
1637 setRemoteAddress(ptr);
1641 BloombergLP::bslma::ConstructionUtil::construct(
1648 BloombergLP::bslma::ConstructionUtil::construct(
1659#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 2
1660template <
class TYPE>
1661template <
class ARGS_01,
1664TYPE& NullableAllocatedValue<TYPE>::emplace(
1669 TYPE *ptr = getAddress();
1673 clearHasValueFlag();
1675 else if (!isLocal()) {
1676 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
1677 setRemoteAddress(ptr);
1681 BloombergLP::bslma::ConstructionUtil::construct(
1689 BloombergLP::bslma::ConstructionUtil::construct(
1701#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 3
1702template <
class TYPE>
1703template <
class ARGS_01,
1707TYPE& NullableAllocatedValue<TYPE>::emplace(
1713 TYPE *ptr = getAddress();
1717 clearHasValueFlag();
1719 else if (!isLocal()) {
1720 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
1721 setRemoteAddress(ptr);
1725 BloombergLP::bslma::ConstructionUtil::construct(
1734 BloombergLP::bslma::ConstructionUtil::construct(
1747#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 4
1748template <
class TYPE>
1749template <
class ARGS_01,
1754TYPE& NullableAllocatedValue<TYPE>::emplace(
1761 TYPE *ptr = getAddress();
1765 clearHasValueFlag();
1767 else if (!isLocal()) {
1768 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
1769 setRemoteAddress(ptr);
1773 BloombergLP::bslma::ConstructionUtil::construct(
1783 BloombergLP::bslma::ConstructionUtil::construct(
1797#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 5
1798template <
class TYPE>
1799template <
class ARGS_01,
1805TYPE& NullableAllocatedValue<TYPE>::emplace(
1813 TYPE *ptr = getAddress();
1817 clearHasValueFlag();
1819 else if (!isLocal()) {
1820 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
1821 setRemoteAddress(ptr);
1825 BloombergLP::bslma::ConstructionUtil::construct(
1836 BloombergLP::bslma::ConstructionUtil::construct(
1851#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 6
1852template <
class TYPE>
1853template <
class ARGS_01,
1860TYPE& NullableAllocatedValue<TYPE>::emplace(
1869 TYPE *ptr = getAddress();
1873 clearHasValueFlag();
1875 else if (!isLocal()) {
1876 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
1877 setRemoteAddress(ptr);
1881 BloombergLP::bslma::ConstructionUtil::construct(
1893 BloombergLP::bslma::ConstructionUtil::construct(
1909#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 7
1910template <
class TYPE>
1911template <
class ARGS_01,
1919TYPE& NullableAllocatedValue<TYPE>::emplace(
1929 TYPE *ptr = getAddress();
1933 clearHasValueFlag();
1935 else if (!isLocal()) {
1936 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
1937 setRemoteAddress(ptr);
1941 BloombergLP::bslma::ConstructionUtil::construct(
1954 BloombergLP::bslma::ConstructionUtil::construct(
1971#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 8
1972template <
class TYPE>
1973template <
class ARGS_01,
1982TYPE& NullableAllocatedValue<TYPE>::emplace(
1993 TYPE *ptr = getAddress();
1997 clearHasValueFlag();
1999 else if (!isLocal()) {
2000 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
2001 setRemoteAddress(ptr);
2005 BloombergLP::bslma::ConstructionUtil::construct(
2019 BloombergLP::bslma::ConstructionUtil::construct(
2037#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 9
2038template <
class TYPE>
2039template <
class ARGS_01,
2049TYPE& NullableAllocatedValue<TYPE>::emplace(
2061 TYPE *ptr = getAddress();
2065 clearHasValueFlag();
2067 else if (!isLocal()) {
2068 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
2069 setRemoteAddress(ptr);
2073 BloombergLP::bslma::ConstructionUtil::construct(
2088 BloombergLP::bslma::ConstructionUtil::construct(
2107#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 10
2108template <
class TYPE>
2109template <
class ARGS_01,
2120TYPE& NullableAllocatedValue<TYPE>::emplace(
2133 TYPE *ptr = getAddress();
2137 clearHasValueFlag();
2139 else if (!isLocal()) {
2140 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
2141 setRemoteAddress(ptr);
2145 BloombergLP::bslma::ConstructionUtil::construct(
2161 BloombergLP::bslma::ConstructionUtil::construct(
2182# if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
2183#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 0
2184template <
class TYPE>
2185template <
class INIT_LIST_TYPE>
2186TYPE& NullableAllocatedValue<TYPE>::emplace(
2187 std::initializer_list<INIT_LIST_TYPE> il)
2190 TYPE *ptr = getAddress();
2194 clearHasValueFlag();
2196 else if (!isLocal()) {
2197 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
2198 setRemoteAddress(ptr);
2202 BloombergLP::bslma::ConstructionUtil::construct(
2209 BloombergLP::bslma::ConstructionUtil::construct(
2220#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 1
2221template <
class TYPE>
2222template <
class INIT_LIST_TYPE,
class ARGS_01>
2223TYPE& NullableAllocatedValue<TYPE>::emplace(
2224 std::initializer_list<INIT_LIST_TYPE> il,
2228 TYPE *ptr = getAddress();
2232 clearHasValueFlag();
2234 else if (!isLocal()) {
2235 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
2236 setRemoteAddress(ptr);
2240 BloombergLP::bslma::ConstructionUtil::construct(
2248 BloombergLP::bslma::ConstructionUtil::construct(
2260#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 2
2261template <
class TYPE>
2262template <
class INIT_LIST_TYPE,
class ARGS_01,
2264TYPE& NullableAllocatedValue<TYPE>::emplace(
2265 std::initializer_list<INIT_LIST_TYPE> il,
2270 TYPE *ptr = getAddress();
2274 clearHasValueFlag();
2276 else if (!isLocal()) {
2277 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
2278 setRemoteAddress(ptr);
2282 BloombergLP::bslma::ConstructionUtil::construct(
2291 BloombergLP::bslma::ConstructionUtil::construct(
2304#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 3
2305template <
class TYPE>
2306template <
class INIT_LIST_TYPE,
class ARGS_01,
2309TYPE& NullableAllocatedValue<TYPE>::emplace(
2310 std::initializer_list<INIT_LIST_TYPE> il,
2316 TYPE *ptr = getAddress();
2320 clearHasValueFlag();
2322 else if (!isLocal()) {
2323 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
2324 setRemoteAddress(ptr);
2328 BloombergLP::bslma::ConstructionUtil::construct(
2338 BloombergLP::bslma::ConstructionUtil::construct(
2352#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 4
2353template <
class TYPE>
2354template <
class INIT_LIST_TYPE,
class ARGS_01,
2358TYPE& NullableAllocatedValue<TYPE>::emplace(
2359 std::initializer_list<INIT_LIST_TYPE> il,
2366 TYPE *ptr = getAddress();
2370 clearHasValueFlag();
2372 else if (!isLocal()) {
2373 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
2374 setRemoteAddress(ptr);
2378 BloombergLP::bslma::ConstructionUtil::construct(
2389 BloombergLP::bslma::ConstructionUtil::construct(
2404#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 5
2405template <
class TYPE>
2406template <
class INIT_LIST_TYPE,
class ARGS_01,
2411TYPE& NullableAllocatedValue<TYPE>::emplace(
2412 std::initializer_list<INIT_LIST_TYPE> il,
2420 TYPE *ptr = getAddress();
2424 clearHasValueFlag();
2426 else if (!isLocal()) {
2427 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
2428 setRemoteAddress(ptr);
2432 BloombergLP::bslma::ConstructionUtil::construct(
2444 BloombergLP::bslma::ConstructionUtil::construct(
2460#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 6
2461template <
class TYPE>
2462template <
class INIT_LIST_TYPE,
class ARGS_01,
2468TYPE& NullableAllocatedValue<TYPE>::emplace(
2469 std::initializer_list<INIT_LIST_TYPE> il,
2478 TYPE *ptr = getAddress();
2482 clearHasValueFlag();
2484 else if (!isLocal()) {
2485 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
2486 setRemoteAddress(ptr);
2490 BloombergLP::bslma::ConstructionUtil::construct(
2503 BloombergLP::bslma::ConstructionUtil::construct(
2520#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 7
2521template <
class TYPE>
2522template <
class INIT_LIST_TYPE,
class ARGS_01,
2529TYPE& NullableAllocatedValue<TYPE>::emplace(
2530 std::initializer_list<INIT_LIST_TYPE> il,
2540 TYPE *ptr = getAddress();
2544 clearHasValueFlag();
2546 else if (!isLocal()) {
2547 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
2548 setRemoteAddress(ptr);
2552 BloombergLP::bslma::ConstructionUtil::construct(
2566 BloombergLP::bslma::ConstructionUtil::construct(
2584#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 8
2585template <
class TYPE>
2586template <
class INIT_LIST_TYPE,
class ARGS_01,
2594TYPE& NullableAllocatedValue<TYPE>::emplace(
2595 std::initializer_list<INIT_LIST_TYPE> il,
2606 TYPE *ptr = getAddress();
2610 clearHasValueFlag();
2612 else if (!isLocal()) {
2613 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
2614 setRemoteAddress(ptr);
2618 BloombergLP::bslma::ConstructionUtil::construct(
2633 BloombergLP::bslma::ConstructionUtil::construct(
2652#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 9
2653template <
class TYPE>
2654template <
class INIT_LIST_TYPE,
class ARGS_01,
2663TYPE& NullableAllocatedValue<TYPE>::emplace(
2664 std::initializer_list<INIT_LIST_TYPE> il,
2676 TYPE *ptr = getAddress();
2680 clearHasValueFlag();
2682 else if (!isLocal()) {
2683 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
2684 setRemoteAddress(ptr);
2688 BloombergLP::bslma::ConstructionUtil::construct(
2704 BloombergLP::bslma::ConstructionUtil::construct(
2724#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_C >= 10
2725template <
class TYPE>
2726template <
class INIT_LIST_TYPE,
class ARGS_01,
2736TYPE& NullableAllocatedValue<TYPE>::emplace(
2737 std::initializer_list<INIT_LIST_TYPE> il,
2750 TYPE *ptr = getAddress();
2754 clearHasValueFlag();
2756 else if (!isLocal()) {
2757 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
2758 setRemoteAddress(ptr);
2762 BloombergLP::bslma::ConstructionUtil::construct(
2779 BloombergLP::bslma::ConstructionUtil::construct(
2804template <
class TYPE>
2805template <
class... ARGS>
2807TYPE& NullableAllocatedValue<TYPE>::emplace(
2811 TYPE *ptr = getAddress();
2815 clearHasValueFlag();
2817 else if (!isLocal()) {
2818 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
2819 setRemoteAddress(ptr);
2823 BloombergLP::bslma::ConstructionUtil::construct(
2830 BloombergLP::bslma::ConstructionUtil::construct(
2840# if defined(BSLS_COMPILERFEATURES_SUPPORT_GENERALIZED_INITIALIZERS)
2841template <
class TYPE>
2842template <
class INIT_LIST_TYPE,
class... ARGS>
2843TYPE& NullableAllocatedValue<TYPE>::emplace(
2844 std::initializer_list<INIT_LIST_TYPE> il,
2848 TYPE *ptr = getAddress();
2852 clearHasValueFlag();
2854 else if (!isLocal()) {
2855 ptr =
reinterpret_cast<TYPE *
>(alloc->
allocate(
sizeof(TYPE)));
2856 setRemoteAddress(ptr);
2860 BloombergLP::bslma::ConstructionUtil::construct(
2868 BloombergLP::bslma::ConstructionUtil::construct(
2883template <
class TYPE>
2885TYPE *NullableAllocatedValue<TYPE>::getAddress() {
2887 return reinterpret_cast<TYPE *
>(
2888 static_cast<void *
>(d_storage.d_buffer));
2891 return d_storage.d_pointer_p;
2895template <
class TYPE>
2897const TYPE *NullableAllocatedValue<TYPE>::getAddress()
const {
2899 return reinterpret_cast<const TYPE *
>(
2900 static_cast<const void *
>(d_storage.d_buffer));
2903 return d_storage.d_pointer_p;
2908template <
class TYPE>
2912 d_allocator.clearFlag(k_HAS_VALUE);
2915template <
class TYPE>
2919 d_allocator.setFlag(k_HAS_VALUE);
2922template <
class TYPE>
2924void NullableAllocatedValue<TYPE>::setRemoteAddress(TYPE *newPtr) {
2926 d_storage.d_pointer_p = newPtr;
2929template <
class TYPE>
2931void NullableAllocatedValue<TYPE>::swapLocal(NullableAllocatedValue& other)
2939 else if (other.isNull()) {
2940 other.makeValue(value());
2948template <
class TYPE>
2950void NullableAllocatedValue<TYPE>::swapRemote(NullableAllocatedValue& other)
2954 &other.d_storage.d_pointer_p);
2958template <
class TYPE>
2959template <
class STREAM>
2960STREAM& NullableAllocatedValue<TYPE>::bdexStreamOut(STREAM& stream,
2965 stream.putInt8(has_value() ? 0 : 1);
2974template <
class TYPE>
2982template <
class TYPE>
2986 return d_allocator.readFlag(k_HAS_VALUE);
2989template <
class TYPE>
2993 return !has_value();
2996# ifdef BSLS_COMPILERFEATURES_SUPPORT_OPERATOR_EXPLICIT
2997template <
class TYPE>
3004template <
class TYPE>
3006int NullableAllocatedValue<TYPE>::maxSupportedBdexVersion(
3007 int versionSelector)
const
3019#ifndef BDE_OMIT_INTERNAL_DEPRECATED
3020template <
class TYPE>
3022int NullableAllocatedValue<TYPE>::maxSupportedBdexVersion()
const
3028template <
class TYPE>
3029template <
class ANY_TYPE>
3031NullableAllocatedValue<TYPE>::value_or(
const ANY_TYPE& default_value)
const
3033 return has_value() ? value() : static_cast<TYPE>(default_value);
3036template <
class TYPE>
3038const TYPE *NullableAllocatedValue<TYPE>::operator->()
const
3044template <
class TYPE>
3046const TYPE& NullableAllocatedValue<TYPE>::operator*()
const
3054template <
class TYPE>
3058 return d_allocator.getPointer();
3061template <
class TYPE>
3063bsl::ostream& NullableAllocatedValue<TYPE>::print(
3064 bsl::ostream& stream,
3066 int spacesPerLevel)
const
3078template <
class TYPE>
3080const TYPE& NullableAllocatedValue<TYPE>::value()
const
3082#ifndef BDE_OMIT_INTERNAL_DEPRECATED
3092 return *getAddress();
3097template <
class TYPE>
3099const TYPE *NullableAllocatedValue<TYPE>::addressOr(
const TYPE *address)
const
3101 return has_value() ? &value() : address;
3104#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
3107#ifndef BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT
3108#define BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT 10
3110#ifndef BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_D
3111#define BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_D BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT
3113#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_D >= 0
3114template <
class TYPE>
3116TYPE& NullableAllocatedValue<TYPE>::makeValueInplace(
3123#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_D >= 1
3124template <
class TYPE>
3125template <
class ARGS_01>
3127TYPE& NullableAllocatedValue<TYPE>::makeValueInplace(
3134#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_D >= 2
3135template <
class TYPE>
3136template <
class ARGS_01,
3139TYPE& NullableAllocatedValue<TYPE>::makeValueInplace(
3148#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_D >= 3
3149template <
class TYPE>
3150template <
class ARGS_01,
3154TYPE& NullableAllocatedValue<TYPE>::makeValueInplace(
3165#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_D >= 4
3166template <
class TYPE>
3167template <
class ARGS_01,
3172TYPE& NullableAllocatedValue<TYPE>::makeValueInplace(
3185#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_D >= 5
3186template <
class TYPE>
3187template <
class ARGS_01,
3193TYPE& NullableAllocatedValue<TYPE>::makeValueInplace(
3208#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_D >= 6
3209template <
class TYPE>
3210template <
class ARGS_01,
3217TYPE& NullableAllocatedValue<TYPE>::makeValueInplace(
3234#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_D >= 7
3235template <
class TYPE>
3236template <
class ARGS_01,
3244TYPE& NullableAllocatedValue<TYPE>::makeValueInplace(
3263#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_D >= 8
3264template <
class TYPE>
3265template <
class ARGS_01,
3274TYPE& NullableAllocatedValue<TYPE>::makeValueInplace(
3295#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_D >= 9
3296template <
class TYPE>
3297template <
class ARGS_01,
3307TYPE& NullableAllocatedValue<TYPE>::makeValueInplace(
3330#if BDLB_NULLABLEALLOCATEDVALUE_VARIADIC_LIMIT_D >= 10
3331template <
class TYPE>
3332template <
class ARGS_01,
3343TYPE& NullableAllocatedValue<TYPE>::makeValueInplace(
3371template <
class TYPE>
3372template <
class... ARGS>
3374TYPE& NullableAllocatedValue<TYPE>::makeValueInplace(
3382template <
class TYPE>
3384TYPE NullableAllocatedValue<TYPE>::valueOr(
const TYPE& otherValue)
const
3386 return has_value() ? value() : otherValue;
3389template <
class TYPE>
3391const TYPE *NullableAllocatedValue<TYPE>::valueOrNull()
const {
3392 return has_value() ? &value() : NULL;
3398template <
class LHS_TYPE,
class RHS_TYPE>
3401 const NullableAllocatedValue<RHS_TYPE>& rhs)
3404 return rhs.isNull();
3407 return rhs.isNull() ? false :
lhs.value() ==
rhs.value();
3410template <
class LHS_TYPE,
class RHS_TYPE>
3413 const RHS_TYPE& rhs)
3415 return lhs.isNull() ? false :
lhs.value() ==
rhs;
3418template <
class LHS_TYPE,
class RHS_TYPE>
3421 const NullableAllocatedValue<RHS_TYPE>& rhs)
3423 return rhs.isNull() ? false :
lhs ==
rhs.value();
3426template <
class LHS_TYPE,
class RHS_TYPE>
3429 const NullableAllocatedValue<RHS_TYPE>& rhs)
3432 return !
rhs.isNull();
3435 return rhs.isNull() ? true :
lhs.value() !=
rhs.value();
3438template <
class LHS_TYPE,
class RHS_TYPE>
3441 const RHS_TYPE& rhs)
3443 return lhs.isNull() ? true :
lhs.value() !=
rhs;
3446template <
class LHS_TYPE,
class RHS_TYPE>
3449 const NullableAllocatedValue<RHS_TYPE>& rhs)
3451 return rhs.isNull() ? true :
lhs !=
rhs.value();
3454template <
class LHS_TYPE,
class RHS_TYPE>
3457 const NullableAllocatedValue<RHS_TYPE>& rhs)
3463 return lhs.isNull() ? true :
lhs.value() <
rhs.value();
3466template <
class LHS_TYPE,
class RHS_TYPE>
3469 const RHS_TYPE& rhs)
3471 return lhs.isNull() ? true :
lhs.value() <
rhs;
3474template <
class LHS_TYPE,
class RHS_TYPE>
3477 const NullableAllocatedValue<RHS_TYPE>& rhs)
3479 return rhs.isNull() ? false :
lhs <
rhs.value();
3482template <
class LHS_TYPE,
class RHS_TYPE>
3485 const NullableAllocatedValue<RHS_TYPE>& rhs)
3491 return rhs.isNull() ? false :
lhs.value() <=
rhs.value();
3494template <
class LHS_TYPE,
class RHS_TYPE>
3497 const RHS_TYPE& rhs)
3499 return lhs.isNull() ? true :
lhs.value() <=
rhs;
3502template <
class LHS_TYPE,
class RHS_TYPE>
3505 const NullableAllocatedValue<RHS_TYPE>& rhs)
3507 return rhs.isNull() ? false :
lhs <=
rhs.value();
3510template <
class LHS_TYPE,
class RHS_TYPE>
3513 const NullableAllocatedValue<RHS_TYPE>& rhs)
3519 return rhs.isNull() ? true :
lhs.value() >
rhs.value();
3522template <
class LHS_TYPE,
class RHS_TYPE>
3525 const RHS_TYPE& rhs)
3527 return lhs.isNull() ? false :
lhs.value() >
rhs;
3530template <
class LHS_TYPE,
class RHS_TYPE>
3533 const NullableAllocatedValue<RHS_TYPE>& rhs)
3535 return rhs.isNull() ? true :
lhs >
rhs.value();
3538template <
class LHS_TYPE,
class RHS_TYPE>
3541 const NullableAllocatedValue<RHS_TYPE>& rhs)
3547 return lhs.isNull() ? false :
lhs.value() >=
rhs.value();
3550template <
class LHS_TYPE,
class RHS_TYPE>
3553 const RHS_TYPE& rhs)
3555 return lhs.isNull() ? false :
lhs.value() >=
rhs;
3558template <
class LHS_TYPE,
class RHS_TYPE>
3561 const NullableAllocatedValue<RHS_TYPE>& rhs)
3563 return rhs.isNull() ? true :
lhs >=
rhs.value();
3566template <
class TYPE>
3569 const NullableAllocatedValue<TYPE>&
object)
3571 return object.print(stream, 0, -1);
3578template <
class TYPE>
3583 return !
lhs.has_value();
3586template <
class TYPE>
3592 return !
rhs.has_value();
3595template <
class TYPE>
3599 return lhs.has_value();
3602template <
class TYPE>
3608 return rhs.has_value();
3611template <
class TYPE>
3619template <
class TYPE>
3625 return rhs.has_value();
3628template <
class TYPE>
3633 return lhs.has_value();
3636template <
class TYPE>
3644template <
class TYPE>
3649 return !
lhs.has_value();
3652template <
class TYPE>
3661template <
class TYPE>
3669template <
class TYPE>
3675 return !
rhs.has_value();
3682template <
class LHS_TYPE,
class RHS_TYPE>
3687 if (
lhs.has_value() !=
rhs.has_value())
3689 return lhs.has_value () ?
lhs.value() ==
rhs.value () :
true;
3692template <
class LHS_TYPE,
class RHS_TYPE>
3695 const NullableAllocatedValue<RHS_TYPE>& rhs)
3697 if (
lhs.has_value() !=
rhs.has_value())
3699 return lhs.has_value () ?
lhs.value() ==
rhs.value () :
true;
3702template <
class LHS_TYPE,
class RHS_TYPE>
3707 if (
lhs.has_value() !=
rhs.has_value())
3709 return lhs.has_value () ?
lhs.value() !=
rhs.value () :
false;
3712template <
class LHS_TYPE,
class RHS_TYPE>
3715 const NullableAllocatedValue<RHS_TYPE>& rhs)
3717 if (
lhs.has_value() !=
rhs.has_value())
3719 return lhs.has_value () ?
lhs.value() !=
rhs.value () :
false;
3722template <
class LHS_TYPE,
class RHS_TYPE>
3727 if (
lhs.has_value() !=
rhs.has_value())
3728 return rhs.has_value();
3729 return lhs.has_value () ?
lhs.value() <
rhs.value () :
false;
3732template <
class LHS_TYPE,
class RHS_TYPE>
3735 const NullableAllocatedValue<RHS_TYPE>& rhs)
3737 if (
lhs.has_value() !=
rhs.has_value())
3738 return rhs.has_value();
3739 return lhs.has_value () ?
lhs.value() <
rhs.value () :
false;
3743template <
class LHS_TYPE,
class RHS_TYPE>
3748 if (
lhs.has_value() !=
rhs.has_value())
3749 return lhs.has_value();
3750 return lhs.has_value () ?
lhs.value() >
rhs.value () :
false;
3753template <
class LHS_TYPE,
class RHS_TYPE>
3756 const NullableAllocatedValue<RHS_TYPE>& rhs)
3758 if (
lhs.has_value() !=
rhs.has_value())
3759 return lhs.has_value();
3760 return lhs.has_value () ?
lhs.value() >
rhs.value () :
false;
3763template <
class LHS_TYPE,
class RHS_TYPE>
3768 if (
lhs.has_value() !=
rhs.has_value())
3769 return rhs.has_value();
3770 return lhs.has_value () ?
lhs.value() <=
rhs.value () :
true;
3773template <
class LHS_TYPE,
class RHS_TYPE>
3776 const NullableAllocatedValue<RHS_TYPE>& rhs)
3778 if (
lhs.has_value() !=
rhs.has_value())
3779 return rhs.has_value();
3780 return lhs.has_value () ?
lhs.value() <=
rhs.value () :
true;
3783template <
class LHS_TYPE,
class RHS_TYPE>
3788 if (
lhs.has_value() !=
rhs.has_value())
3789 return lhs.has_value();
3790 return lhs.has_value () ?
lhs.value() >=
rhs.value () :
true;
3793template <
class LHS_TYPE,
class RHS_TYPE>
3796 const NullableAllocatedValue<RHS_TYPE>& rhs)
3798 if (
lhs.has_value() !=
rhs.has_value())
3799 return lhs.has_value();
3800 return lhs.has_value () ?
lhs.value() >=
rhs.value () :
true;
3805template <
class HASHALG,
class TYPE>
3807 const NullableAllocatedValue<TYPE>& input)
3809 using ::BloombergLP::bslh::hashAppend;
3811 if (!input.isNull()) {
3820template <
class TYPE>
3821void bdlb::swap(NullableAllocatedValue<TYPE>& a,
3822 NullableAllocatedValue<TYPE>& b)
3824 if (a.allocator() == b.allocator()) {
3830 NullableAllocatedValue<TYPE> futureA(b, a.allocator());
3831 NullableAllocatedValue<TYPE> futureB(a, b.allocator());
3840# error Not valid except when included from bdlb_nullableallocatedvalue.h
#define BSLMF_NESTED_TRAIT_DECLARATION(t_TYPE, t_TRAIT)
Definition bslmf_nestedtraitdeclaration.h:231
char d_buffer[sizeof(TYPE *)]
Definition bdlb_nullableallocatedvalue.h:189
TYPE * d_pointer_p
Definition bdlb_nullableallocatedvalue.h:188
void reset()
Definition bdlb_nullableallocatedvalue.h:1148
TYPE ValueType
Definition bdlb_nullableallocatedvalue.h:258
TYPE value_or(const ANY_TYPE &default_value) const
Definition bdlb_nullableallocatedvalue.h:1440
bool has_value() const BSLS_KEYWORD_NOEXCEPT
Definition bdlb_nullableallocatedvalue.h:1393
TYPE & emplace(BSLS_COMPILERFEATURES_FORWARD_REF(ARGS)...)
NullableAllocatedValue()
Definition bdlb_nullableallocatedvalue.h:928
bsl::allocator< char > get_allocator() const
Definition bdlb_nullableallocatedvalue.h:1385
TYPE & makeValue()
Definition bdlb_nullableallocatedvalue.h:1114
STREAM & bdexStreamIn(STREAM &stream, int version)
Definition bdlb_nullableallocatedvalue.h:1064
bsl::ostream & print(bsl::ostream &stream, int level=0, int spacesPerLevel=4) const
Definition bdlb_nullableallocatedvalue.h:1472
TYPE * operator->()
Definition bdlb_nullableallocatedvalue.h:1191
bool isNull() const BSLS_KEYWORD_NOEXCEPT
Definition bdlb_nullableallocatedvalue.h:1400
void swap(NullableAllocatedValue &other)
Definition bdlb_nullableallocatedvalue.h:1162
STREAM & bdexStreamOut(STREAM &stream, int version) const
Definition bdlb_nullableallocatedvalue.h:1369
TYPE & value()
Definition bdlb_nullableallocatedvalue.h:1183
int maxSupportedBdexVersion() const
Definition bdlb_nullableallocatedvalue.h:1431
TYPE & operator*()
Definition bdlb_nullableallocatedvalue.h:1199
bslma::Allocator * allocator() const
Return the allocator used by this object to supply memory.
Definition bdlb_nullableallocatedvalue.h:1465
Definition bslma_bslallocator.h:588
void deallocate(TYPE *p, std::size_t n=1)
Definition bslma_bslallocator.h:1062
Definition bslstl_optional.h:2043
static void swap(T *a, T *b)
Definition bslalg_swaputil.h:182
Definition bslma_allocator.h:545
virtual void * allocate(size_type size)=0
Definition bslma_deallocatorproctor.h:312
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1976
#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_EXPLICIT
Definition bsls_keyword.h:683
#define BSLS_KEYWORD_NOEXCEPT
Definition bsls_keyword.h:674
STREAM & bdexStreamOut(STREAM &stream, const DayCountConvention::Enum &value, int version)
int maxSupportedBdexVersion(const DayCountConvention::Enum *, int versionSelector)
STREAM & bdexStreamIn(STREAM &stream, DayCountConvention::Enum &variable, int version)
bool isNull(const TYPE &object)
void makeValue(TYPE *object)
void reset(TYPE *object)
Reset the value of the specified object to its default value.
bsl::ostream & print(bsl::ostream &stream, const TYPE &object, int level=0, int spacesPerLevel=4)
Definition bdlb_printmethods.h:725
Definition bdlb_algorithmworkaroundutil.h:74
bool operator!=(const BigEndianInt16 &lhs, const BigEndianInt16 &rhs)
bsl::ostream & operator<<(bsl::ostream &stream, const BigEndianInt16 &integer)
bool operator>=(const Guid &lhs, const Guid &rhs)
void hashAppend(HASH_ALGORITHM &hashAlgorithm, const BigEndianInt16 &object)
void swap(NullableAllocatedValue< TYPE > &a, NullableAllocatedValue< TYPE > &b)
bool operator<=(const Guid &lhs, const Guid &rhs)
bool operator>(const Guid &lhs, const Guid &rhs)
bool operator<(const Guid &lhs, const Guid &rhs)
bool operator==(const BigEndianInt16 &lhs, const BigEndianInt16 &rhs)
Definition bdlat_valuetypefunctions.h:939
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
ALLOCATOR & lhs
Definition bslstl_string.h:3917
Definition baljsn_encoder_testtypes.h:76
Definition bdlbb_blob.h:579
STREAM & bdexStreamIn(STREAM &stream, VALUE_TYPE &variable)
Definition bslx_instreamfunctions.h:1263
STREAM & bdexStreamOut(STREAM &stream, const TYPE &value)
Definition bslx_outstreamfunctions.h:1004
int maxSupportedBdexVersion(const TYPE *, int versionSelector)
Definition bslx_versionfunctions.h:531
Definition bslstl_optional.h:522
static void defaultConstruct(TARGET_TYPE *address, bslma::Allocator *allocator)
Definition bslalg_scalarprimitives.h:1577
static void copyConstruct(TARGET_TYPE *address, const TARGET_TYPE &original, bslma::Allocator *allocator)
Definition bslalg_scalarprimitives.h:1617
Definition bslmf_isbitwisemoveable.h:718
Definition bsls_alignmentfromtype.h:378