11#ifndef INCLUDED_BDLB_NULLABLEVALUEREF_CPP03
12#define INCLUDED_BDLB_NULLABLEVALUEREF_CPP03
63#ifdef COMPILING_BDLB_NULLABLEVALUEREF_H
69class ConstNullableValueRef;
81class NullableValueRef {
84#ifndef BSLS_COMPILERFEATURES_SUPPORT_OPERATOR_EXPLICIT
91 typedef BloombergLP::bsls::UnspecifiedBool<NullableValueRef>
93 typedef typename UnspecifiedBoolUtil::BoolType UnspecifiedBool;
103 bool d_isTargetOptional;
110 NullableAllocatedValue<TYPE>& getNAV()
const;
122 friend class ConstNullableValueRef<TYPE>;
191#ifdef BSLS_COMPILERFEATURES_SUPPORT_OPERATOR_EXPLICIT
199 return UnspecifiedBoolUtil::makeValue(
has_value());
207 template <
class ANY_TYPE>
208 TYPE
value_or(
const ANY_TYPE& default_value)
const;
211#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
214#ifndef BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT
215#define BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT 5
217#ifndef BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_A
218#define BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_A BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT
220#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_A >= 0
224#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_A >= 1
225 template <
class ARGS_1>
229#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_A >= 2
230 template <
class ARGS_1,
236#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_A >= 3
237 template <
class ARGS_1,
245#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_A >= 4
246 template <
class ARGS_1,
256#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_A >= 5
257 template <
class ARGS_1,
272 template <
class... ARGS>
293 NullableValueRef<TYPE>&
operator=(
const TYPE& rhs);
302 const NullableAllocatedValue<TYPE>& rhs);
306 NullableValueRef<TYPE>&
operator=(
const NullableValueRef& rhs);
324 "Use 'has_value() ? &value() : address' instead")
325 const TYPE *addressOr(const TYPE *address) const;
327#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
330#ifndef BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT
331#define BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT 5
333#ifndef BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_B
334#define BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_B BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT
337#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_B >= 0
339 "Use 'emplace' instead")
340 TYPE& makeValueInplace();
343#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_B >= 1
344 template <
class ARGS_1>
346 "Use 'emplace' instead")
350#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_B >= 2
351 template <
class ARGS_1,
354 "Use 'emplace' instead")
359#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_B >= 3
360 template <
class ARGS_1,
364 "Use 'emplace' instead")
370#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_B >= 4
371 template <
class ARGS_1,
376 "Use 'emplace' instead")
383#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_B >= 5
384 template <
class ARGS_1,
390 "Use 'emplace' instead")
402 template <
class... ARGS>
404 "Use 'emplace' instead")
410 "Use 'value_or' instead")
415 TYPE valueOr(const TYPE& otherValue) const;
422 const TYPE *valueOrNull() const;
431template <class HASHALG, class TYPE>
432void hashAppend(HASHALG& hashAlg, const NullableValueRef<TYPE>& input);
442template <class LHS_TYPE, class RHS_TYPE>
443bool operator==(const NullableValueRef<LHS_TYPE>& lhs,
444 const NullableValueRef<RHS_TYPE>& rhs);
452template <class LHS_TYPE, class RHS_TYPE>
453bool operator==(const NullableValueRef<LHS_TYPE>& lhs,
454 const RHS_TYPE& rhs);
455template <class LHS_TYPE, class RHS_TYPE>
456bool operator==(const LHS_TYPE& lhs,
457 const NullableValueRef<RHS_TYPE>& rhs);
465template <class LHS_TYPE, class RHS_TYPE>
466bool operator!=(const NullableValueRef<LHS_TYPE>& lhs,
467 const NullableValueRef<RHS_TYPE>& rhs);
475template <class LHS_TYPE, class RHS_TYPE>
476bool operator!=(const NullableValueRef<LHS_TYPE>& lhs,
477 const RHS_TYPE& rhs);
478template <class LHS_TYPE, class RHS_TYPE>
479bool operator!=(const LHS_TYPE& lhs,
480 const NullableValueRef<RHS_TYPE>& rhs);
488template <class LHS_TYPE, class RHS_TYPE>
489bool operator<(const NullableValueRef<LHS_TYPE>& lhs,
490 const NullableValueRef<RHS_TYPE>& rhs);
495template <class LHS_TYPE, class RHS_TYPE>
496bool operator<(const NullableValueRef<LHS_TYPE>& lhs,
497 const RHS_TYPE& rhs);
502template <class LHS_TYPE, class RHS_TYPE>
503bool operator<(const LHS_TYPE& lhs,
504 const NullableValueRef<RHS_TYPE>& rhs);
512template <class LHS_TYPE, class RHS_TYPE>
513bool operator<=(const NullableValueRef<LHS_TYPE>& lhs,
514 const NullableValueRef<RHS_TYPE>& rhs);
520template <class LHS_TYPE, class RHS_TYPE>
521bool operator<=(const NullableValueRef<LHS_TYPE>& lhs,
522 const RHS_TYPE& rhs);
528template <class LHS_TYPE, class RHS_TYPE>
529bool operator<=(const LHS_TYPE& lhs,
530 const NullableValueRef<RHS_TYPE>& rhs);
539template <class LHS_TYPE, class RHS_TYPE>
540bool operator>(const NullableValueRef<LHS_TYPE>& lhs,
541 const NullableValueRef<RHS_TYPE>& rhs);
547template <class LHS_TYPE, class RHS_TYPE>
548bool operator>(const NullableValueRef<LHS_TYPE>& lhs,
549 const RHS_TYPE& rhs);
555template <class LHS_TYPE, class RHS_TYPE>
556bool operator>(const LHS_TYPE& lhs,
557 const NullableValueRef<RHS_TYPE>& rhs);
565template <class LHS_TYPE, class RHS_TYPE>
566bool operator>=(const NullableValueRef<LHS_TYPE>& lhs,
567 const NullableValueRef<RHS_TYPE>& rhs);
573template <class LHS_TYPE, class RHS_TYPE>
574bool operator>=(const NullableValueRef<LHS_TYPE>& lhs,
575 const RHS_TYPE& rhs);
581template <class LHS_TYPE, class RHS_TYPE>
582bool operator>=(const LHS_TYPE& lhs,
583 const NullableValueRef<RHS_TYPE>& rhs);
592bool operator==(const NullableValueRef<TYPE>& lhs, const
bsl::nullopt_t&)
597bool operator==(const
bsl::nullopt_t&, const NullableValueRef<TYPE>& rhs)
602bool operator!=(const NullableValueRef<TYPE>& lhs, const
bsl::nullopt_t&)
608bool operator!=(const
bsl::nullopt_t&, const NullableValueRef<TYPE>& rhs)
614bool operator<(const NullableValueRef<TYPE>&, const
bsl::nullopt_t&)
621bool operator<(const
bsl::nullopt_t&, const NullableValueRef<TYPE>& rhs)
627bool operator>(const NullableValueRef<TYPE>& lhs, const
bsl::nullopt_t&)
633bool operator>(const
bsl::nullopt_t&, const NullableValueRef<TYPE>&)
638bool operator<=(const NullableValueRef<TYPE>& lhs, const
bsl::nullopt_t&)
643bool operator<=(const
bsl::nullopt_t&, const NullableValueRef<TYPE>&)
648bool operator>=(const NullableValueRef<TYPE>&, const
bsl::nullopt_t&)
653bool operator>=(const
bsl::nullopt_t&, const NullableValueRef<TYPE>& rhs)
666class ConstNullableValueRef {
669#ifndef BSLS_COMPILERFEATURES_SUPPORT_OPERATOR_EXPLICIT
676 typedef BloombergLP::bsls::UnspecifiedBool<ConstNullableValueRef>
678 typedef typename UnspecifiedBoolUtil::BoolType UnspecifiedBool;
684 const void *d_target_p;
688 bool d_isTargetOptional;
695 const NullableAllocatedValue<TYPE>& getNAV()
const;
733 ConstNullableValueRef(
const NullableAllocatedValue<TYPE>& opt);
741 ConstNullableValueRef(
const NullableValueRef<TYPE>& ref);
748 ConstNullableValueRef(
const ConstNullableValueRef& original);
752 ~ConstNullableValueRef();
780#ifdef BSLS_COMPILERFEATURES_SUPPORT_OPERATOR_EXPLICIT
788 return UnspecifiedBoolUtil::makeValue(
has_value());
796 template <
class ANY_TYPE>
797 TYPE
value_or(
const ANY_TYPE& default_value)
const;
806 "Use 'has_value() ? &value() : address' instead")
807 const TYPE *addressOr(const TYPE *address) const;
815 TYPE valueOr(const TYPE& otherValue) const;
822 const TYPE *valueOrNull() const;
832template <class HASHALG, class TYPE>
833void hashAppend(HASHALG& hashAlg, const ConstNullableValueRef<TYPE>& input);
843template <class LHS_TYPE, class RHS_TYPE>
844bool operator==(const ConstNullableValueRef<LHS_TYPE>& lhs,
845 const ConstNullableValueRef<RHS_TYPE>& rhs);
853template <class LHS_TYPE, class RHS_TYPE>
854bool operator==(const ConstNullableValueRef<LHS_TYPE>& lhs,
855 const RHS_TYPE& rhs);
856template <class LHS_TYPE, class RHS_TYPE>
857bool operator==(const LHS_TYPE& lhs,
858 const ConstNullableValueRef<RHS_TYPE>& rhs);
866template <class LHS_TYPE, class RHS_TYPE>
867bool operator!=(const ConstNullableValueRef<LHS_TYPE>& lhs,
868 const ConstNullableValueRef<RHS_TYPE>& rhs);
876template <class LHS_TYPE, class RHS_TYPE>
877bool operator!=(const ConstNullableValueRef<LHS_TYPE>& lhs,
878 const RHS_TYPE& rhs);
879template <class LHS_TYPE, class RHS_TYPE>
880bool operator!=(const LHS_TYPE& lhs,
881 const ConstNullableValueRef<RHS_TYPE>& rhs);
889template <class LHS_TYPE, class RHS_TYPE>
890bool operator<(const ConstNullableValueRef<LHS_TYPE>& lhs,
891 const ConstNullableValueRef<RHS_TYPE>& rhs);
896template <class LHS_TYPE, class RHS_TYPE>
897bool operator<(const ConstNullableValueRef<LHS_TYPE>& lhs,
898 const RHS_TYPE& rhs);
903template <class LHS_TYPE, class RHS_TYPE>
904bool operator<(const LHS_TYPE& lhs,
905 const ConstNullableValueRef<RHS_TYPE>& rhs);
912template <class LHS_TYPE, class RHS_TYPE>
913bool operator<=(const ConstNullableValueRef<LHS_TYPE>& lhs,
914 const ConstNullableValueRef<RHS_TYPE>& rhs);
920template <class LHS_TYPE, class RHS_TYPE>
921bool operator<=(const ConstNullableValueRef<LHS_TYPE>& lhs,
922 const RHS_TYPE& rhs);
928template <class LHS_TYPE, class RHS_TYPE>
929bool operator<=(const LHS_TYPE& lhs,
930 const ConstNullableValueRef<RHS_TYPE>& rhs);
939template <class LHS_TYPE, class RHS_TYPE>
940bool operator>(const ConstNullableValueRef<LHS_TYPE>& lhs,
941 const ConstNullableValueRef<RHS_TYPE>& rhs);
947template <class LHS_TYPE, class RHS_TYPE>
948bool operator>(const ConstNullableValueRef<LHS_TYPE>& lhs,
949 const RHS_TYPE& rhs);
955template <class LHS_TYPE, class RHS_TYPE>
956bool operator>(const LHS_TYPE& lhs,
957 const ConstNullableValueRef<RHS_TYPE>& rhs);
965template <class LHS_TYPE, class RHS_TYPE>
966bool operator>=(const ConstNullableValueRef<LHS_TYPE>& lhs,
967 const ConstNullableValueRef<RHS_TYPE>& rhs);
973template <class LHS_TYPE, class RHS_TYPE>
974bool operator>=(const ConstNullableValueRef<LHS_TYPE>& lhs,
975 const RHS_TYPE& rhs);
981template <class LHS_TYPE, class RHS_TYPE>
982bool operator>=(const LHS_TYPE& lhs,
983 const ConstNullableValueRef<RHS_TYPE>& rhs);
991bool operator==(const ConstNullableValueRef<TYPE>& lhs,
996bool operator==(const
bsl::nullopt_t&,
1000template <class TYPE>
1001bool operator!=(const ConstNullableValueRef<TYPE>& lhs,
1006template <class TYPE>
1007bool operator!=(const
bsl::nullopt_t&,
1012template <class TYPE>
1013bool operator<(const ConstNullableValueRef<TYPE>&, const
bsl::nullopt_t&)
1019template <class TYPE>
1020bool operator<(const
bsl::nullopt_t&,
1025template <class TYPE>
1026bool operator>(const ConstNullableValueRef<TYPE>& lhs,
1031template <class TYPE>
1032bool operator>(const
bsl::nullopt_t&, const ConstNullableValueRef<TYPE>&)
1036template <class TYPE>
1037bool operator<=(const ConstNullableValueRef<TYPE>& lhs,
1041template <class TYPE>
1042bool operator<=(const
bsl::nullopt_t&, const ConstNullableValueRef<TYPE>&)
1046template <class TYPE>
1047bool operator>=(const ConstNullableValueRef<TYPE>&, const
bsl::nullopt_t&)
1051template <class TYPE>
1052bool operator>=(const
bsl::nullopt_t&,
1065template <class LHS_TYPE, class RHS_TYPE>
1066bool operator==(const ConstNullableValueRef<LHS_TYPE>& lhs,
1067 const NullableValueRef<RHS_TYPE>& rhs);
1068template <class LHS_TYPE, class RHS_TYPE>
1069bool operator==(const NullableValueRef<LHS_TYPE>& lhs,
1070 const ConstNullableValueRef<RHS_TYPE>& rhs);
1078template <class LHS_TYPE, class RHS_TYPE>
1079bool operator!=(const ConstNullableValueRef<LHS_TYPE>& lhs,
1080 const NullableValueRef<RHS_TYPE>& rhs);
1081template <class LHS_TYPE, class RHS_TYPE>
1082bool operator!=(const NullableValueRef<LHS_TYPE>& lhs,
1083 const ConstNullableValueRef<RHS_TYPE>& rhs);
1091template <class LHS_TYPE, class RHS_TYPE>
1092bool operator<(const ConstNullableValueRef<LHS_TYPE>& lhs,
1093 const NullableValueRef<RHS_TYPE>& rhs);
1094template <class LHS_TYPE, class RHS_TYPE>
1095bool operator<(const NullableValueRef<LHS_TYPE>& lhs,
1096 const ConstNullableValueRef<RHS_TYPE>& rhs);
1103template <class LHS_TYPE, class RHS_TYPE>
1104bool operator<=(const ConstNullableValueRef<LHS_TYPE>& lhs,
1105 const NullableValueRef<RHS_TYPE>& rhs);
1106template <class LHS_TYPE, class RHS_TYPE>
1107bool operator<=(const NullableValueRef<LHS_TYPE>& lhs,
1108 const ConstNullableValueRef<RHS_TYPE>& rhs);
1117template <class LHS_TYPE, class RHS_TYPE>
1118bool operator>(const ConstNullableValueRef<LHS_TYPE>& lhs,
1119 const NullableValueRef<RHS_TYPE>& rhs);
1120template <class LHS_TYPE, class RHS_TYPE>
1121bool operator>(const NullableValueRef<LHS_TYPE>& lhs,
1122 const ConstNullableValueRef<RHS_TYPE>& rhs);
1130template <class LHS_TYPE, class RHS_TYPE>
1131bool operator>=(const ConstNullableValueRef<LHS_TYPE>& lhs,
1132 const NullableValueRef<RHS_TYPE>& rhs);
1133template <class LHS_TYPE, class RHS_TYPE>
1134bool operator>=(const NullableValueRef<LHS_TYPE>& lhs,
1135 const ConstNullableValueRef<RHS_TYPE>& rhs);
1144template <class TYPE>
1146bdlb::NullableAllocatedValue<TYPE>&
1147bdlb::NullableValueRef<TYPE>::getNAV()
const
1153template <
class TYPE>
1162template <
class TYPE>
1166 return d_isTargetOptional;
1170template <
class TYPE>
1174, d_isTargetOptional(true)
1178template <
class TYPE>
1181 NullableAllocatedValue<TYPE>& opt)
1183, d_isTargetOptional(false)
1187template <
class TYPE>
1190 const NullableValueRef& original)
1191: d_target_p(original.d_target_p)
1192, d_isTargetOptional(original.d_isTargetOptional)
1197template <
class TYPE>
1202 ? getOpt().has_value()
1203 : getNAV().has_value();
1206template <
class TYPE>
1210 return !has_value();
1213template <
class TYPE>
1224template <
class TYPE>
1230 ? getOpt().operator->()
1231 : getNAV().operator->();
1234template <
class TYPE>
1240 ? getOpt().operator*()
1241 : getNAV().operator*();
1244#ifdef BSLS_COMPILERFEATURES_SUPPORT_OPERATOR_EXPLICIT
1245template <
class TYPE>
1252template <
class TYPE>
1253template <
class ANY_TYPE>
1256 const ANY_TYPE& default_value)
const
1263 return default_value;
1268#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
1271#ifndef BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT
1272#define BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT 5
1274#ifndef BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_C
1275#define BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_C BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT
1277#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_C >= 0
1278template <
class TYPE>
1284 ? getOpt().emplace()
1285 : getNAV().emplace();
1289#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_C >= 1
1290template <
class TYPE>
1291template <
class ARGS_1>
1303#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_C >= 2
1304template <
class TYPE>
1305template <
class ARGS_1,
1321#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_C >= 3
1322template <
class TYPE>
1323template <
class ARGS_1,
1343#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_C >= 4
1344template <
class TYPE>
1345template <
class ARGS_1,
1369#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_C >= 5
1370template <
class TYPE>
1371template <
class ARGS_1,
1402template <
class TYPE>
1403template <
class... ARGS>
1415template <
class TYPE>
1421 ? getOpt().operator->()
1422 : getNAV().operator->();
1425template <
class TYPE>
1431 ? getOpt().operator*()
1432 : getNAV().operator*();
1435template <
class TYPE>
1444template <
class TYPE>
1459template <
class TYPE>
1464 if (rhs.has_value()) {
1465 *
this = rhs.value();
1473template <
class TYPE>
1477 const NullableAllocatedValue<TYPE>& rhs)
1479 if (rhs.has_value()) {
1480 *
this = rhs.
value();
1489template <
class TYPE>
1494 if (rhs.has_value()) {
1495 *
this = rhs.value();
1504template <
class TYPE>
1516template <
class TYPE>
1527template <
class TYPE>
1532 return has_value() ? &value() : address;
1535#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
1538#ifndef BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT
1539#define BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT 5
1541#ifndef BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_D
1542#define BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_D BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT
1544#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_D >= 0
1545template <
class TYPE>
1554#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_D >= 1
1555template <
class TYPE>
1556template <
class ARGS_1>
1565#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_D >= 2
1566template <
class TYPE>
1567template <
class ARGS_1,
1579#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_D >= 3
1580template <
class TYPE>
1581template <
class ARGS_1,
1596#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_D >= 4
1597template <
class TYPE>
1598template <
class ARGS_1,
1616#if BDLB_NULLABLEVALUEREF_VARIADIC_LIMIT_D >= 5
1617template <
class TYPE>
1618template <
class ARGS_1,
1642template <
class TYPE>
1643template <
class... ARGS>
1653template <
class TYPE>
1657 return value_or(otherValue);
1660template <
class TYPE>
1664 return has_value() ? &value() : 0;
1668template <
class HASHALG,
class TYPE>
1670 const NullableValueRef<TYPE>& input)
1672 using ::BloombergLP::bslh::hashAppend;
1674 if (!input.has_value()) {
1684template <
class LHS_TYPE,
class RHS_TYPE>
1687 const NullableValueRef<RHS_TYPE>& rhs)
1689 if (lhs.has_value()) {
1690 return rhs.has_value() ? lhs.value() == rhs.value() :
false;
1693 return !rhs.has_value();
1696template <
class LHS_TYPE,
class RHS_TYPE>
1699 const RHS_TYPE& rhs)
1701 return lhs.has_value() ? lhs.value() == rhs :
false;
1704template <
class LHS_TYPE,
class RHS_TYPE>
1707 const NullableValueRef<RHS_TYPE>& rhs)
1709 return rhs.has_value() ? lhs == rhs.value():
false;
1712template <
class LHS_TYPE,
class RHS_TYPE>
1715 const NullableValueRef<RHS_TYPE>& rhs)
1717 if (lhs.has_value()) {
1718 return rhs.has_value() ? lhs.value() != rhs.value() :
true;
1721 return rhs.has_value();
1724template <
class LHS_TYPE,
class RHS_TYPE>
1727 const RHS_TYPE& rhs)
1729 return lhs.has_value() ? lhs.value() != rhs :
true;
1732template <
class LHS_TYPE,
class RHS_TYPE>
1735 const NullableValueRef<RHS_TYPE>& rhs)
1737 return rhs.has_value() ? lhs != rhs.value() :
true;
1740template <
class LHS_TYPE,
class RHS_TYPE>
1743 const NullableValueRef<RHS_TYPE>& rhs)
1745 if (!rhs.has_value()) {
1749 return lhs.has_value() ? lhs.value() < rhs.value() :
true;
1752template <
class LHS_TYPE,
class RHS_TYPE>
1755 const RHS_TYPE& rhs)
1757 return lhs.has_value() ? lhs.value() < rhs :
true;
1760template <
class LHS_TYPE,
class RHS_TYPE>
1763 const NullableValueRef<RHS_TYPE>& rhs)
1765 return rhs.has_value() ? lhs < rhs.value() :
false;
1768template <
class LHS_TYPE,
class RHS_TYPE>
1771 const NullableValueRef<RHS_TYPE>& rhs)
1773 if (!lhs.has_value()) {
1777 return rhs.has_value() ? lhs.value() <= rhs.value() :
false;
1780template <
class LHS_TYPE,
class RHS_TYPE>
1783 const RHS_TYPE& rhs)
1785 return lhs.has_value() ? lhs.value() <= rhs :
true;
1788template <
class LHS_TYPE,
class RHS_TYPE>
1791 const NullableValueRef<RHS_TYPE>& rhs)
1793 return rhs.has_value() ? lhs <= rhs.value() :
false;
1796template <
class LHS_TYPE,
class RHS_TYPE>
1799 const NullableValueRef<RHS_TYPE>& rhs)
1801 if (!lhs.has_value()) {
1805 return rhs.has_value() ? lhs.value() > rhs.value() :
true;
1808template <
class LHS_TYPE,
class RHS_TYPE>
1811 const RHS_TYPE& rhs)
1813 return lhs.has_value() ? lhs.value() > rhs :
false;
1816template <
class LHS_TYPE,
class RHS_TYPE>
1819 const NullableValueRef<RHS_TYPE>& rhs)
1821 return rhs.has_value() ? lhs > rhs.value() :
true;
1824template <
class LHS_TYPE,
class RHS_TYPE>
1827 const NullableValueRef<RHS_TYPE>& rhs)
1829 if (!rhs.has_value()) {
1833 return lhs.has_value() ? lhs.value() >= rhs.value() :
false;
1836template <
class LHS_TYPE,
class RHS_TYPE>
1839 const RHS_TYPE& rhs)
1841 return lhs.has_value() ? lhs.value() >= rhs :
false;
1844template <
class LHS_TYPE,
class RHS_TYPE>
1847 const NullableValueRef<RHS_TYPE>& rhs)
1849 return rhs.has_value() ? lhs >= rhs.value() :
true;
1856template <
class TYPE>
1861 return !lhs.has_value();
1864template <
class TYPE>
1870 return !rhs.has_value();
1873template <
class TYPE>
1877 return lhs.has_value();
1880template <
class TYPE>
1886 return rhs.has_value();
1889template <
class TYPE>
1897template <
class TYPE>
1903 return rhs.has_value();
1906template <
class TYPE>
1911 return lhs.has_value();
1914template <
class TYPE>
1922template <
class TYPE>
1927 return !lhs.has_value();
1930template <
class TYPE>
1939template <
class TYPE>
1947template <
class TYPE>
1953 return !rhs.has_value();
1961template <
class TYPE>
1967 return *
static_cast<const NullableAllocatedValue<value_type> *
>(
1971template <
class TYPE>
1980template <
class TYPE>
1984 return d_isTargetOptional;
1988template <
class TYPE>
1993, d_isTargetOptional(true)
1997template <
class TYPE>
2000 const NullableAllocatedValue<TYPE>& opt)
2002, d_isTargetOptional(false)
2006template <
class TYPE>
2009 const NullableValueRef<TYPE>& ref)
2010: d_target_p(ref.d_target_p)
2011, d_isTargetOptional(ref.d_isTargetOptional)
2015template <
class TYPE>
2018 const ConstNullableValueRef& original)
2019: d_target_p(original.d_target_p)
2020, d_isTargetOptional(original.d_isTargetOptional)
2025template <
class TYPE>
2031 ? getOpt().has_value()
2032 : getNAV().has_value();
2035template <
class TYPE>
2040 return !has_value();
2043template <
class TYPE>
2054template <
class TYPE>
2060 ? getOpt().operator->()
2061 : getNAV().operator->();
2064template <
class TYPE>
2070 ? getOpt().operator*()
2071 : getNAV().operator*();
2074#ifdef BSLS_COMPILERFEATURES_SUPPORT_OPERATOR_EXPLICIT
2075template <
class TYPE>
2082template <
class TYPE>
2083template <
class ANY_TYPE>
2086 const ANY_TYPE& default_value)
const
2093 return default_value;
2097template <
class TYPE>
2102 return has_value() ? &value() : address;
2105template <
class TYPE>
2110 return value_or(otherValue);
2113template <
class TYPE>
2117 return has_value() ? &value() : 0;
2121template <
class HASHALG,
class TYPE>
2123 const ConstNullableValueRef<TYPE>& input)
2125 using ::BloombergLP::bslh::hashAppend;
2127 if (!input.has_value()) {
2137template <
class LHS_TYPE,
class RHS_TYPE>
2140 const ConstNullableValueRef<RHS_TYPE>& rhs)
2142 if (lhs.has_value()) {
2143 return rhs.has_value() ? lhs.value() == rhs.value() :
false;
2146 return !rhs.has_value();
2149template <
class LHS_TYPE,
class RHS_TYPE>
2152 const RHS_TYPE& rhs)
2154 return lhs.has_value() ? lhs.value() == rhs :
false;
2157template <
class LHS_TYPE,
class RHS_TYPE>
2160 const ConstNullableValueRef<RHS_TYPE>& rhs)
2162 return rhs.has_value() ? lhs == rhs.value():
false;
2165template <
class LHS_TYPE,
class RHS_TYPE>
2168 const ConstNullableValueRef<RHS_TYPE>& rhs)
2170 if (lhs.has_value()) {
2171 return rhs.has_value() ? lhs.value() != rhs.value() :
true;
2174 return rhs.has_value();
2177template <
class LHS_TYPE,
class RHS_TYPE>
2180 const RHS_TYPE& rhs)
2182 return lhs.has_value() ? lhs.value() != rhs :
true;
2185template <
class LHS_TYPE,
class RHS_TYPE>
2188 const ConstNullableValueRef<RHS_TYPE>& rhs)
2190 return rhs.has_value() ? lhs != rhs.value() :
true;
2193template <
class LHS_TYPE,
class RHS_TYPE>
2196 const ConstNullableValueRef<RHS_TYPE>& rhs)
2198 if (!rhs.has_value()) {
2202 return lhs.has_value() ? lhs.value() < rhs.value() :
true;
2205template <
class LHS_TYPE,
class RHS_TYPE>
2208 const RHS_TYPE& rhs)
2210 return lhs.has_value() ? lhs.value() < rhs :
true;
2213template <
class LHS_TYPE,
class RHS_TYPE>
2216 const ConstNullableValueRef<RHS_TYPE>& rhs)
2218 return rhs.has_value() ? lhs < rhs.value() :
false;
2221template <
class LHS_TYPE,
class RHS_TYPE>
2224 const ConstNullableValueRef<RHS_TYPE>& rhs)
2226 if (!lhs.has_value()) {
2230 return rhs.has_value() ? lhs.value() <= rhs.value() :
false;
2233template <
class LHS_TYPE,
class RHS_TYPE>
2236 const RHS_TYPE& rhs)
2238 return lhs.has_value() ? lhs.value() <= rhs :
true;
2241template <
class LHS_TYPE,
class RHS_TYPE>
2244 const ConstNullableValueRef<RHS_TYPE>& rhs)
2246 return rhs.has_value() ? lhs <= rhs.value() :
false;
2249template <
class LHS_TYPE,
class RHS_TYPE>
2252 const ConstNullableValueRef<RHS_TYPE>& rhs)
2254 if (!lhs.has_value()) {
2258 return rhs.has_value() ? lhs.value() > rhs.value() :
true;
2261template <
class LHS_TYPE,
class RHS_TYPE>
2264 const RHS_TYPE& rhs)
2266 return lhs.has_value() ? lhs.value() > rhs :
false;
2269template <
class LHS_TYPE,
class RHS_TYPE>
2272 const ConstNullableValueRef<RHS_TYPE>& rhs)
2274 return rhs.has_value() ? lhs > rhs.value() :
true;
2277template <
class LHS_TYPE,
class RHS_TYPE>
2280 const ConstNullableValueRef<RHS_TYPE>& rhs)
2282 if (!rhs.has_value()) {
2286 return lhs.has_value() ? lhs.value() >= rhs.value() :
false;
2289template <
class LHS_TYPE,
class RHS_TYPE>
2292 const RHS_TYPE& rhs)
2294 return lhs.has_value() ? lhs.value() >= rhs :
false;
2297template <
class LHS_TYPE,
class RHS_TYPE>
2300 const ConstNullableValueRef<RHS_TYPE>& rhs)
2302 return rhs.has_value() ? lhs >= rhs.value() :
true;
2309template <
class TYPE>
2314 return !lhs.has_value();
2317template <
class TYPE>
2323 return !rhs.has_value();
2326template <
class TYPE>
2330 return lhs.has_value();
2333template <
class TYPE>
2339 return rhs.has_value();
2342template <
class TYPE>
2350template <
class TYPE>
2356 return rhs.has_value();
2359template <
class TYPE>
2364 return lhs.has_value();
2367template <
class TYPE>
2376template <
class TYPE>
2381 return !lhs.has_value();
2384template <
class TYPE>
2393template <
class TYPE>
2401template <
class TYPE>
2407 return !rhs.has_value();
2414template <
class LHS_TYPE,
class RHS_TYPE>
2417 const NullableValueRef<RHS_TYPE>& rhs)
2419 if (lhs.has_value()) {
2420 return rhs.has_value() ? lhs.value() == rhs.value() :
false;
2423 return !rhs.has_value();
2426template <
class LHS_TYPE,
class RHS_TYPE>
2429 const ConstNullableValueRef<RHS_TYPE>& rhs)
2431 if (lhs.has_value()) {
2432 return rhs.has_value() ? lhs.value() == rhs.value() :
false;
2435 return !rhs.has_value();
2438template <
class LHS_TYPE,
class RHS_TYPE>
2441 const NullableValueRef<RHS_TYPE>& rhs)
2443 if (lhs.has_value()) {
2444 return rhs.has_value() ? lhs.value() != rhs.value() :
true;
2447 return rhs.has_value();
2450template <
class LHS_TYPE,
class RHS_TYPE>
2453 const ConstNullableValueRef<RHS_TYPE>& rhs)
2455 if (lhs.has_value()) {
2456 return rhs.has_value() ? lhs.value() != rhs.value() :
true;
2459 return rhs.has_value();
2462template <
class LHS_TYPE,
class RHS_TYPE>
2465 const NullableValueRef<RHS_TYPE>& rhs)
2467 if (!rhs.has_value()) {
2471 return lhs.has_value() ? lhs.value() < rhs.value() :
true;
2474template <
class LHS_TYPE,
class RHS_TYPE>
2477 const ConstNullableValueRef<RHS_TYPE>& rhs)
2479 if (!rhs.has_value()) {
2483 return lhs.has_value() ? lhs.value() < rhs.value() :
true;
2486template <
class LHS_TYPE,
class RHS_TYPE>
2489 const NullableValueRef<RHS_TYPE>& rhs)
2491 if (!lhs.has_value()) {
2495 return rhs.has_value() ? lhs.value() <= rhs.value() :
false;
2498template <
class LHS_TYPE,
class RHS_TYPE>
2501 const ConstNullableValueRef<RHS_TYPE>& rhs)
2503 if (!lhs.has_value()) {
2507 return rhs.has_value() ? lhs.value() <= rhs.value() :
false;
2510template <
class LHS_TYPE,
class RHS_TYPE>
2513 const NullableValueRef<RHS_TYPE>& rhs)
2515 if (!lhs.has_value()) {
2519 return rhs.has_value() ? lhs.value() > rhs.value() :
true;
2522template <
class LHS_TYPE,
class RHS_TYPE>
2525 const ConstNullableValueRef<RHS_TYPE>& rhs)
2527 if (!lhs.has_value()) {
2531 return rhs.has_value() ? lhs.value() > rhs.value() :
true;
2534template <
class LHS_TYPE,
class RHS_TYPE>
2537 const NullableValueRef<RHS_TYPE>& rhs)
2539 if (!rhs.has_value()) {
2543 return lhs.has_value() ? lhs.value() >= rhs.value() :
false;
2546template <
class LHS_TYPE,
class RHS_TYPE>
2549 const ConstNullableValueRef<RHS_TYPE>& rhs)
2551 if (!rhs.has_value()) {
2555 return lhs.has_value() ? lhs.value() >= rhs.value() :
false;
2561# error Not valid except when included from bdlb_nullablevalueref.h
Definition bdlb_nullablevalueref.h:633
TYPE value_type
Definition bdlb_nullablevalueref.h:686
Definition bdlb_nullableallocatedvalue.h:174
Definition bdlb_nullablevalueref.h:163
TYPE & emplace(BSLS_COMPILERFEATURES_FORWARD_REF(ARGS)...)
TYPE value_type
Definition bdlb_nullablevalueref.h:220
Definition bslstl_optional.h:1861
TYPE value_or(const ANY_TYPE &default_value) const
Definition bdlb_nullablevalueref.h:1222
void reset()
Definition bdlb_nullablevalueref.h:1339
TYPE value_or(const ANY_TYPE &default_value) const
Definition bdlb_nullablevalueref.h:1810
const value_type * operator->() const
Definition bdlb_nullablevalueref.h:1194
const value_type * operator->() const
Definition bdlb_nullablevalueref.h:1782
bool has_value() const BSLS_KEYWORD_NOEXCEPT
Return true if the target contains a value, and false otherwise.
Definition bdlb_nullablevalueref.h:1166
NullableValueRef(bsl::optional< TYPE > &opt)
Definition bdlb_nullablevalueref.h:1139
bool has_value() const BSLS_KEYWORD_NOEXCEPT
Return true if the target contains a value, and false otherwise.
Definition bdlb_nullablevalueref.h:1753
const value_type & operator*() const
Definition bdlb_nullablevalueref.h:1792
const value_type & value() const
Definition bdlb_nullablevalueref.h:1183
bool isNull() const BSLS_KEYWORD_NOEXCEPT
Definition bdlb_nullablevalueref.h:1175
bool isNull() const BSLS_KEYWORD_NOEXCEPT
Definition bdlb_nullablevalueref.h:1763
const value_type & operator*() const
Definition bdlb_nullablevalueref.h:1204
NullableValueRef< TYPE > & operator=(const bsl::nullopt_t &)
Definition bdlb_nullablevalueref.h:1271
ConstNullableValueRef(const bsl::optional< TYPE > &opt)
Definition bdlb_nullablevalueref.h:1715
const value_type & value() const
Definition bdlb_nullablevalueref.h:1771
#define BSLMF_ASSERT(expr)
Definition bslmf_assert.h:229
#define BSLS_ASSERT(X)
Definition bsls_assert.h:1804
#define BSLS_COMPILERFEATURES_FORWARD_REF(T)
Definition bsls_compilerfeatures.h:2012
#define BSLS_COMPILERFEATURES_FORWARD(T, V)
Definition bsls_compilerfeatures.h:2018
#define BSLS_DEPRECATE_FEATURE(UOR, FEATURE, MESSAGE)
Definition bsls_deprecatefeature.h:319
#define BSLS_NOTHROW_SPEC
Definition bsls_exceptionutil.h:386
#define BSLS_KEYWORD_EXPLICIT
Definition bsls_keyword.h:641
#define BSLS_KEYWORD_NOEXCEPT
Definition bsls_keyword.h:632
void hashAppend(HASH_ALGORITHM &hashAlg, const baljsn::EncoderTestAddress &object)
Definition baljsn_encoder_testtypes.h:9236
void reset(TYPE *object)
Reset the value of the specified object to its default value.
Definition bdlb_algorithmworkaroundutil.h:74
bool operator!=(const BigEndianInt16 &lhs, const BigEndianInt16 &rhs)
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)
bool operator<(const Guid &lhs, const Guid &rhs)
bool operator==(const BigEndianInt16 &lhs, const BigEndianInt16 &rhs)
Definition bdlb_printmethods.h:283
Definition bslmf_issame.h:146
Definition bslstl_optional.h:467
bsl::remove_cv< typenamebsl::remove_reference< t_TYPE >::type >::type type
Definition bslmf_removecvref.h:136