11#ifndef INCLUDED_BDLB_NULLABLEVALUE_CPP03
12#define INCLUDED_BDLB_NULLABLEVALUE_CPP03
63#ifdef COMPILING_BDLB_NULLABLEVALUE_H
69class NullableValue_WithAllocator;
72class NullableValue_WithoutAllocator;
78#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
79template <
class t_TYPE>
82template <
class t_TYPE>
83void nullableValue_acceptsStdOptional(
const std::optional<t_TYPE>&);
87template <
class t_TYPE>
88concept NullableValue_ConvertibleToBool =
89 bsl::is_convertible_v<t_TYPE, bool>;
93template <
class t_TYPE>
94concept NullableValue_DerivedFromBslOptional =
95 requires (
const t_TYPE& t) { optional_acceptsBslOptional(t); };
99template <
class t_TYPE>
100concept NullableValue_DerivedFromStdOptional =
101 requires (
const t_TYPE& t) { optional_acceptsStdOptional(t); };
107template <
class t_TYPE>
108concept NullableValue_DerivedFromOptional =
109 NullableValue_DerivedFromBslOptional<t_TYPE> ||
110 NullableValue_DerivedFromStdOptional<t_TYPE>;
153 NoAlloc>::type AllocType;
156 template <
class ANY_TYPE>
220 bsl::is_nothrow_move_constructible<TYPE>::
value);
246 template <class BDE_OTHER_TYPE>
248 typename
bsl::enable_if<
249 bsl::is_convertible<BDE_OTHER_TYPE, TYPE>::
value &&
250 !
bsl::is_convertible<BDE_OTHER_TYPE,
252 EnableType>::type = EnableType());
260 template <class BDE_OTHER_TYPE>
264 typename
bsl::enable_if<
265 bsl::is_convertible<BDE_OTHER_TYPE, TYPE>::
value,
266 EnableType>::type = EnableType());
268 template <class BDE_OTHER_TYPE>
270 typename
bsl::enable_if<
271 bsl::is_convertible<BDE_OTHER_TYPE, TYPE>::
value &&
273 EnableType>::type = EnableType());
275 template <class BDE_OTHER_TYPE>
278 typename
bsl::enable_if<
279 bsl::is_convertible<BDE_OTHER_TYPE, TYPE>::
value &&
281 EnableType>::type = EnableType());
283 template <class BDE_OTHER_TYPE>
286 typename
bsl::enable_if<
287 bsl::is_convertible<BDE_OTHER_TYPE, TYPE>::
value &&
289 EnableType>::type = EnableType());
291 template <class BDE_OTHER_TYPE>
295 typename
bsl::enable_if<
296 bsl::is_convertible<BDE_OTHER_TYPE, TYPE>::
value &&
298 EnableType>::type = EnableType());
300 template <class BDE_OTHER_TYPE>
302 typename
bsl::enable_if<
303 bsl::is_convertible<BDE_OTHER_TYPE, TYPE>::
value &&
305 EnableType>::type = EnableType());
307 template <class BDE_OTHER_TYPE>
311 typename
bsl::enable_if<
312 bsl::is_convertible<BDE_OTHER_TYPE, TYPE>::
value &&
314 EnableType>::type = EnableType());
322 template <class BDE_OTHER_TYPE>
333 template <class BDE_OTHER_TYPE>
371 template <class BDE_OTHER_TYPE>
379 template <class BDE_OTHER_TYPE>
389 template <class BDE_OTHER_TYPE>
390 typename
bsl::enable_if<
bsl::is_convertible<BDE_OTHER_TYPE, TYPE>::
value,
392 operator=(const
bsl::
optional<BDE_OTHER_TYPE>& rhs);
399 template <class BDE_OTHER_TYPE>
400 typename
bsl::enable_if<
bsl::is_convertible<BDE_OTHER_TYPE, TYPE>::
value,
422 template <class BDE_OTHER_TYPE>
441 template <class STREAM>
448 template <class BDE_OTHER_TYPE>
456#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
459#ifndef BDLB_NULLABLEVALUE_VARIADIC_LIMIT
460#define BDLB_NULLABLEVALUE_VARIADIC_LIMIT 5
462#ifndef BDLB_NULLABLEVALUE_VARIADIC_LIMIT_A
463#define BDLB_NULLABLEVALUE_VARIADIC_LIMIT_A BDLB_NULLABLEVALUE_VARIADIC_LIMIT
466#if BDLB_NULLABLEVALUE_VARIADIC_LIMIT_A >= 0
470#if BDLB_NULLABLEVALUE_VARIADIC_LIMIT_A >= 1
471 template <
class ARGS_1>
475#if BDLB_NULLABLEVALUE_VARIADIC_LIMIT_A >= 2
476 template <
class ARGS_1,
482#if BDLB_NULLABLEVALUE_VARIADIC_LIMIT_A >= 3
483 template <
class ARGS_1,
491#if BDLB_NULLABLEVALUE_VARIADIC_LIMIT_A >= 4
492 template <
class ARGS_1,
502#if BDLB_NULLABLEVALUE_VARIADIC_LIMIT_A >= 5
503 template <
class ARGS_1,
519 template <
class... ARGS>
534 const TYPE *
addressOr(
const TYPE *address)
const;
544 template <
class STREAM>
561#ifndef BDE_OMIT_INTERNAL_DEPRECATED
578 bsl::ostream&
print(bsl::ostream& stream,
580 int spacesPerLevel = 4)
const;
585 const TYPE&
value()
const;
593 #if BSLS_DEPRECATE_IS_ACTIVE(BDL, 3, 5)
617template <
class LHS_TYPE,
class RHS_TYPE>
618bool operator==(
const NullableValue<LHS_TYPE>& lhs,
619 const NullableValue<RHS_TYPE>& rhs)
620#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
622 { *lhs == *rhs } -> NullableValue_ConvertibleToBool;
626template <
class LHS_TYPE,
class RHS_TYPE>
627bool operator==(
const NullableValue<LHS_TYPE>& lhs,
629#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
631 { *lhs == *rhs } -> NullableValue_ConvertibleToBool;
635template <
class LHS_TYPE,
class RHS_TYPE>
637 const NullableValue<RHS_TYPE>& rhs)
638#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
640 { *lhs == *rhs } -> NullableValue_ConvertibleToBool;
644#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
645template <
class LHS_TYPE,
class RHS_TYPE>
646bool operator==(
const NullableValue<LHS_TYPE>& lhs,
647 const std::optional<RHS_TYPE>& rhs)
648#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
650 { *lhs == *rhs } -> NullableValue_ConvertibleToBool;
654template <
class LHS_TYPE,
class RHS_TYPE>
655bool operator==(
const std::optional<LHS_TYPE>& lhs,
656 const NullableValue<RHS_TYPE>& rhs)
657#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
659 { *lhs == *rhs } -> NullableValue_ConvertibleToBool;
671template <
class LHS_TYPE,
class RHS_TYPE>
672bool operator!=(
const NullableValue<LHS_TYPE>& lhs,
673 const NullableValue<RHS_TYPE>& rhs)
674#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
676 { *lhs != *rhs } -> NullableValue_ConvertibleToBool;
680template <
class LHS_TYPE,
class RHS_TYPE>
682 const NullableValue<RHS_TYPE>& rhs)
683#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
685 { *lhs != *rhs } -> NullableValue_ConvertibleToBool;
689template <
class LHS_TYPE,
class RHS_TYPE>
690bool operator!=(
const NullableValue<LHS_TYPE>& lhs,
692#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
694 { *lhs != *rhs } -> NullableValue_ConvertibleToBool;
698#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
699template <
class LHS_TYPE,
class RHS_TYPE>
700bool operator!=(
const std::optional<LHS_TYPE>& lhs,
701 const NullableValue<RHS_TYPE>& rhs)
702#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
704 { *lhs != *rhs } -> NullableValue_ConvertibleToBool;
708template <
class LHS_TYPE,
class RHS_TYPE>
709bool operator!=(
const NullableValue<LHS_TYPE>& lhs,
710 const std::optional<RHS_TYPE>& rhs)
711#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
713 { *lhs != *rhs } -> NullableValue_ConvertibleToBool;
725template <
class LHS_TYPE,
class RHS_TYPE>
726bool operator!=(
const NullableValue<LHS_TYPE>& lhs,
728#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
729 requires (!NullableValue_DerivedFromOptional<RHS_TYPE>) &&
730 requires { { *lhs != rhs } -> NullableValue_ConvertibleToBool; }
733template <
class LHS_TYPE,
class RHS_TYPE>
735 const NullableValue<RHS_TYPE>& rhs)
736#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
737 requires (!NullableValue_DerivedFromOptional<LHS_TYPE>) &&
738 requires { { lhs != *rhs } -> NullableValue_ConvertibleToBool; }
748template <
class LHS_TYPE,
class RHS_TYPE>
749bool operator==(
const NullableValue<LHS_TYPE>& lhs,
751#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
752 requires (!NullableValue_DerivedFromOptional<RHS_TYPE>) &&
753 requires { { *lhs == rhs } -> NullableValue_ConvertibleToBool; }
756template <
class LHS_TYPE,
class RHS_TYPE>
758 const NullableValue<RHS_TYPE>& rhs)
759#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
760 requires (!NullableValue_DerivedFromOptional<LHS_TYPE>) &&
761 requires { { lhs == *rhs } -> NullableValue_ConvertibleToBool; }
772template <
class LHS_TYPE,
class RHS_TYPE>
773bool operator<(
const NullableValue<LHS_TYPE>& lhs,
774 const NullableValue<RHS_TYPE>& rhs)
775#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
777 { *lhs < *rhs } -> NullableValue_ConvertibleToBool;
781template <
class LHS_TYPE,
class RHS_TYPE>
783 const NullableValue<RHS_TYPE>& rhs)
784#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
786 { *lhs < *rhs } -> NullableValue_ConvertibleToBool;
790template <
class LHS_TYPE,
class RHS_TYPE>
791bool operator<(
const NullableValue<LHS_TYPE>& lhs,
793#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
795 { *lhs < *rhs } -> NullableValue_ConvertibleToBool;
799#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
800template <
class LHS_TYPE,
class RHS_TYPE>
801bool operator<(
const std::optional<LHS_TYPE>& lhs,
802 const NullableValue<RHS_TYPE>& rhs)
803#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
805 { *lhs < *rhs } -> NullableValue_ConvertibleToBool;
809template <
class LHS_TYPE,
class RHS_TYPE>
810bool operator<(
const NullableValue<LHS_TYPE>& lhs,
811 const std::optional<RHS_TYPE>& rhs)
812#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
814 { *lhs < *rhs } -> NullableValue_ConvertibleToBool;
823template <
class LHS_TYPE,
class RHS_TYPE>
824bool operator<(
const NullableValue<LHS_TYPE>& lhs,
826#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
827 requires (!NullableValue_DerivedFromOptional<RHS_TYPE>) &&
828 requires { { *lhs < rhs } -> NullableValue_ConvertibleToBool; }
835template <
class LHS_TYPE,
class RHS_TYPE>
837 const NullableValue<RHS_TYPE>& rhs)
838#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
839 requires (!NullableValue_DerivedFromOptional<LHS_TYPE>) &&
840 requires { { lhs < *rhs } -> NullableValue_ConvertibleToBool; }
851template <
class LHS_TYPE,
class RHS_TYPE>
852bool operator>(
const NullableValue<LHS_TYPE>& lhs,
853 const NullableValue<RHS_TYPE>& rhs)
854#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
856 { *lhs > *rhs } -> NullableValue_ConvertibleToBool;
860template <
class LHS_TYPE,
class RHS_TYPE>
862 const NullableValue<RHS_TYPE>& rhs)
863#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
865 { *lhs > *rhs } -> NullableValue_ConvertibleToBool;
869template <
class LHS_TYPE,
class RHS_TYPE>
870bool operator>(
const NullableValue<LHS_TYPE>& lhs,
872#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
874 { *lhs > *rhs } -> NullableValue_ConvertibleToBool;
878#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
879template <
class LHS_TYPE,
class RHS_TYPE>
880bool operator>(
const std::optional<LHS_TYPE>& lhs,
881 const NullableValue<RHS_TYPE>& rhs)
882#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
884 { *lhs > *rhs } -> NullableValue_ConvertibleToBool;
888template <
class LHS_TYPE,
class RHS_TYPE>
889bool operator>(
const NullableValue<LHS_TYPE>& lhs,
890 const std::optional<RHS_TYPE>& rhs)
891#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
893 { *lhs > *rhs } -> NullableValue_ConvertibleToBool;
902template <
class LHS_TYPE,
class RHS_TYPE>
903bool operator>(
const NullableValue<LHS_TYPE>& lhs,
905#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
906 requires (!NullableValue_DerivedFromOptional<RHS_TYPE>) &&
907 requires { { *lhs > rhs } -> NullableValue_ConvertibleToBool; }
914template <
class LHS_TYPE,
class RHS_TYPE>
916 const NullableValue<RHS_TYPE>& rhs)
917#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
918 requires (!NullableValue_DerivedFromOptional<LHS_TYPE>) &&
919 requires { { lhs > *rhs } -> NullableValue_ConvertibleToBool; }
929template <
class LHS_TYPE,
class RHS_TYPE>
930bool operator<=(
const NullableValue<LHS_TYPE>& lhs,
931 const NullableValue<RHS_TYPE>& rhs)
932#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
934 { *lhs <= *rhs } -> NullableValue_ConvertibleToBool;
938template <
class LHS_TYPE,
class RHS_TYPE>
940 const NullableValue<RHS_TYPE>& rhs)
941#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
943 { *lhs <= *rhs } -> NullableValue_ConvertibleToBool;
947template <
class LHS_TYPE,
class RHS_TYPE>
948bool operator<=(
const NullableValue<LHS_TYPE>& lhs,
950#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
952 { *lhs <= *rhs } -> NullableValue_ConvertibleToBool;
956#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
957template <
class LHS_TYPE,
class RHS_TYPE>
958bool operator<=(
const std::optional<LHS_TYPE>& lhs,
959 const NullableValue<RHS_TYPE>& rhs)
960#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
962 { *lhs <= *rhs } -> NullableValue_ConvertibleToBool;
966template <
class LHS_TYPE,
class RHS_TYPE>
967bool operator<=(
const NullableValue<LHS_TYPE>& lhs,
968 const std::optional<RHS_TYPE>& rhs)
969#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
971 { *lhs <= *rhs } -> NullableValue_ConvertibleToBool;
980template <
class LHS_TYPE,
class RHS_TYPE>
981bool operator<=(
const NullableValue<LHS_TYPE>& lhs,
983#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
984 requires (!NullableValue_DerivedFromOptional<RHS_TYPE>) &&
985 requires { { *lhs <= rhs } -> NullableValue_ConvertibleToBool; }
992template <
class LHS_TYPE,
class RHS_TYPE>
994 const NullableValue<RHS_TYPE>& rhs)
995#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
996 requires (!NullableValue_DerivedFromOptional<LHS_TYPE>) &&
997 requires { { lhs <= *rhs } -> NullableValue_ConvertibleToBool; }
1007template <
class LHS_TYPE,
class RHS_TYPE>
1008bool operator>=(
const NullableValue<LHS_TYPE>& lhs,
1009 const NullableValue<RHS_TYPE>& rhs)
1010#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
1012 { *lhs >= *rhs } -> NullableValue_ConvertibleToBool;
1016template <
class LHS_TYPE,
class RHS_TYPE>
1018 const NullableValue<RHS_TYPE>& rhs)
1019#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
1021 { *lhs >= *rhs } -> NullableValue_ConvertibleToBool;
1025template <
class LHS_TYPE,
class RHS_TYPE>
1026bool operator>=(
const NullableValue<LHS_TYPE>& lhs,
1028#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
1030 { *lhs >= *rhs } -> NullableValue_ConvertibleToBool;
1034#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
1035template <
class LHS_TYPE,
class RHS_TYPE>
1036bool operator>=(
const std::optional<LHS_TYPE>& lhs,
1037 const NullableValue<RHS_TYPE>& rhs)
1038#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
1040 { *lhs >= *rhs } -> NullableValue_ConvertibleToBool;
1044template <
class LHS_TYPE,
class RHS_TYPE>
1045bool operator>=(
const NullableValue<LHS_TYPE>& lhs,
1046 const std::optional<RHS_TYPE>& rhs)
1047#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
1049 { *lhs >= *rhs } -> NullableValue_ConvertibleToBool;
1058template <
class LHS_TYPE,
class RHS_TYPE>
1059bool operator>=(
const NullableValue<LHS_TYPE>& lhs,
1060 const RHS_TYPE& rhs)
1061#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
1062 requires (!NullableValue_DerivedFromOptional<RHS_TYPE>) &&
1063 requires { { *lhs >= rhs } -> NullableValue_ConvertibleToBool; }
1070template <
class LHS_TYPE,
class RHS_TYPE>
1072 const NullableValue<RHS_TYPE>& rhs)
1073#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
1074 requires (!NullableValue_DerivedFromOptional<LHS_TYPE>) &&
1075 requires { { lhs >= *rhs } -> NullableValue_ConvertibleToBool; }
1079#if defined BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON && \
1080 defined BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
1085template <
class LHS_TYPE, bsl::three_way_comparable_with<LHS_TYPE> RHS_TYPE>
1086constexpr std::compare_three_way_result_t<LHS_TYPE, RHS_TYPE> operator<=>(
1087 const NullableValue<LHS_TYPE>& lhs,
1088 const NullableValue<RHS_TYPE>& rhs);
1089template <
class LHS_TYPE, bsl::three_way_comparable_with<LHS_TYPE> RHS_TYPE>
1090constexpr std::compare_three_way_result_t<LHS_TYPE, RHS_TYPE> operator<=>(
1091 const NullableValue<LHS_TYPE>& lhs,
1093template <
class LHS_TYPE, bsl::three_way_comparable_with<LHS_TYPE> RHS_TYPE>
1094constexpr std::compare_three_way_result_t<LHS_TYPE, RHS_TYPE> operator<=>(
1095 const NullableValue<LHS_TYPE>& lhs,
1096 const std::optional<RHS_TYPE>& rhs);
1097template <
class LHS_TYPE,
class RHS_TYPE>
1098 requires(!NullableValue_DerivedFromOptional<RHS_TYPE>) &&
1099 bsl::three_way_comparable_with<LHS_TYPE, RHS_TYPE>
1100constexpr std::compare_three_way_result_t<LHS_TYPE, RHS_TYPE>
1101 operator<=>(
const NullableValue<LHS_TYPE>& lhs,
const RHS_TYPE& rhs);
1105template <
class TYPE>
1106constexpr std::strong_ordering
1107 operator<=>(
const NullableValue<TYPE>& value,
1113template <
class TYPE>
1118#ifndef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
1121template <
class TYPE>
1128template <
class TYPE>
1132template <
class TYPE>
1137# ifndef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
1141template <
class TYPE>
1149template <
class TYPE>
1156template <
class TYPE>
1163template <
class TYPE>
1169template <
class TYPE>
1175template <
class TYPE>
1181template <
class TYPE>
1187template <
class TYPE>
1203template <
class TYPE>
1204bsl::ostream&
operator<<(bsl::ostream& stream,
1205 const NullableValue<TYPE>&
object);
1213template <
class HASHALG,
class TYPE>
1214void hashAppend(HASHALG& hashAlg,
const NullableValue<TYPE>& input);
1222template <
class TYPE>
1225swap(NullableValue<TYPE>& lhs, NullableValue<TYPE>& rhs);
1226template <
class TYPE>
1229swap(NullableValue<TYPE>& lhs, NullableValue<TYPE>& rhs);
1241template <
class TYPE>
1246template <
class TYPE>
1250: Base(bsl::allocator_arg, allocator)
1253template <
class TYPE>
1256: Base(static_cast<const
bsl::optional<TYPE>&>(original))
1259template <
class TYPE>
1261NullableValue<TYPE>::NullableValue(
const NullableValue& original,
1262 const allocator_type& allocator)
1263: Base(
bsl::allocator_arg,
1265 static_cast<const
bsl::optional<TYPE>&>(original))
1268template <
class TYPE>
1273: Base(MoveUtil::move(
1274 static_cast<
bsl::optional<TYPE>&>(MoveUtil::access(original))))
1277template <
class TYPE>
1280 const allocator_type& allocator)
1281: Base(
bsl::allocator_arg,
1283 MoveUtil::move(static_cast<
bsl::optional<TYPE>&>(
1284 MoveUtil::access(original))))
1287template <
class TYPE>
1288template <
class BDE_OTHER_TYPE>
1290NullableValue<TYPE>::NullableValue(
1299template <
class TYPE>
1300template <
class BDE_OTHER_TYPE>
1302NullableValue<TYPE>::NullableValue(
1304 const allocator_type& allocator,
1307: Base(
bsl::allocator_arg,
1312template <
class TYPE>
1313template <
class BDE_OTHER_TYPE>
1315NullableValue<TYPE>::NullableValue(
1324template <
class TYPE>
1325template <
class BDE_OTHER_TYPE>
1327NullableValue<TYPE>::NullableValue(
1329 const allocator_type& allocator,
1334: Base(
bsl::allocator_arg, allocator, value)
1337template <
class TYPE>
1338template <
class BDE_OTHER_TYPE>
1341 NullableValue<BDE_OTHER_TYPE>) value,
1346: Base(MoveUtil::move(static_cast<
bsl::optional<BDE_OTHER_TYPE>&>(
1347 MoveUtil::access(value))))
1350template <
class TYPE>
1351template <
class BDE_OTHER_TYPE>
1354 NullableValue<BDE_OTHER_TYPE>) value,
1355 const allocator_type& allocator,
1360: Base(
bsl::allocator_arg,
1362 MoveUtil::move(static_cast<
bsl::optional<BDE_OTHER_TYPE>&>(
1363 MoveUtil::access(value))))
1366template <
class TYPE>
1367template <
class BDE_OTHER_TYPE>
1369NullableValue<TYPE>::NullableValue(
1375: Base(MoveUtil::move(value))
1378template <
class TYPE>
1379template <
class BDE_OTHER_TYPE>
1381NullableValue<TYPE>::NullableValue(
1384 const allocator_type& allocator,
1389: Base(
bsl::allocator_arg, allocator, MoveUtil::move(value))
1392template <
class TYPE>
1393template <
class BDE_OTHER_TYPE>
1395NullableValue<TYPE>::NullableValue(
1396 const NullableValue<BDE_OTHER_TYPE>& original)
1397: Base(static_cast<const
bsl::optional<BDE_OTHER_TYPE>&>(original))
1400template <
class TYPE>
1401template <
class BDE_OTHER_TYPE>
1403NullableValue<TYPE>::NullableValue(
1404 const NullableValue<BDE_OTHER_TYPE>& original,
1405 const allocator_type& allocator)
1406: Base(
bsl::allocator_arg,
1408 static_cast<const
bsl::optional<BDE_OTHER_TYPE>&>(original))
1411template <
class TYPE>
1417template <
class TYPE>
1419NullableValue<TYPE>::NullableValue(
1422: Base(bsl::allocator_arg, allocator)
1426template <
class TYPE>
1428NullableValue<TYPE>& NullableValue<TYPE>::operator=(
const NullableValue& rhs)
1434 if (rhs.has_value()) {
1435 if (this->has_value()) {
1436 this->value() = rhs.value();
1439 this->emplace(rhs.value());
1449template <
class TYPE>
1451NullableValue<TYPE>& NullableValue<TYPE>::operator=(
1458 NullableValue& localRhs = rhs;
1460 if (localRhs.has_value()) {
1461 if (this->has_value()) {
1462 this->value() = MoveUtil::move(localRhs.value());
1465 this->emplace(MoveUtil::move(localRhs.value()));
1475template <
class TYPE>
1476template <
class BDE_OTHER_TYPE>
1477NullableValue<TYPE>& NullableValue<TYPE>::operator=(
1478 const NullableValue<BDE_OTHER_TYPE>& rhs)
1484 if (rhs.has_value()) {
1485 if (this->has_value()) {
1486 this->value() = rhs.value();
1489 this->emplace(rhs.value());
1499template <
class TYPE>
1500template <
class BDE_OTHER_TYPE>
1501NullableValue<TYPE>& NullableValue<TYPE>::operator=(
1508 NullableValue<BDE_OTHER_TYPE>& rhsLocal = rhs;
1510 if (rhsLocal.has_value()) {
1511 if (this->has_value()) {
1512 this->value() = MoveUtil::move(rhsLocal.value());
1515 this->emplace(MoveUtil::move(rhsLocal.value()));
1525template <
class TYPE>
1526template <
class BDE_OTHER_TYPE>
1528 NullableValue<TYPE>&>::type
1538template <
class TYPE>
1539template <
class BDE_OTHER_TYPE>
1541 NullableValue<TYPE>&>::type
1542NullableValue<TYPE>::operator=(
1547 base = MoveUtil::move(rhs);
1552template <
class TYPE>
1554NullableValue<TYPE>& NullableValue<TYPE>::operator=(
const TYPE& rhs)
1560 if (this->has_value()) {
1561 this->value() = rhs;
1570template <
class TYPE>
1572NullableValue<TYPE>& NullableValue<TYPE>::operator=(
1579 if (this->has_value()) {
1580 this->value() = MoveUtil::move(rhs);
1583 this->emplace(MoveUtil::move(rhs));
1589template <
class TYPE>
1590template <
class BDE_OTHER_TYPE>
1592NullableValue<TYPE>& NullableValue<TYPE>::operator=(
const BDE_OTHER_TYPE& rhs)
1598 if (this->has_value()) {
1599 this->value() = rhs;
1608template <
class TYPE>
1610NullableValue<TYPE>& NullableValue<TYPE>::operator=(
1618template <
class TYPE>
1619template <
class STREAM>
1620STREAM& NullableValue<TYPE>::bdexStreamIn(STREAM& stream,
int version)
1626 stream.getInt8(isNull);
1640template <
class TYPE>
1641template <
class BDE_OTHER_TYPE>
1643TYPE& NullableValue<TYPE>::makeValue(
1649template <
class TYPE>
1651TYPE& NullableValue<TYPE>::makeValue()
1653 return this->emplace();
1656#if BSLS_COMPILERFEATURES_SIMULATE_VARIADIC_TEMPLATES
1659#ifndef BDLB_NULLABLEVALUE_VARIADIC_LIMIT
1660#define BDLB_NULLABLEVALUE_VARIADIC_LIMIT 5
1662#ifndef BDLB_NULLABLEVALUE_VARIADIC_LIMIT_B
1663#define BDLB_NULLABLEVALUE_VARIADIC_LIMIT_B BDLB_NULLABLEVALUE_VARIADIC_LIMIT
1665#if BDLB_NULLABLEVALUE_VARIADIC_LIMIT_B >= 0
1666template <
class TYPE>
1668TYPE& NullableValue<TYPE>::makeValueInplace(
1671 return this->emplace();
1675#if BDLB_NULLABLEVALUE_VARIADIC_LIMIT_B >= 1
1676template <
class TYPE>
1677template <
class ARGS_1>
1679TYPE& NullableValue<TYPE>::makeValueInplace(
1686#if BDLB_NULLABLEVALUE_VARIADIC_LIMIT_B >= 2
1687template <
class TYPE>
1688template <
class ARGS_1,
1691TYPE& NullableValue<TYPE>::makeValueInplace(
1700#if BDLB_NULLABLEVALUE_VARIADIC_LIMIT_B >= 3
1701template <
class TYPE>
1702template <
class ARGS_1,
1706TYPE& NullableValue<TYPE>::makeValueInplace(
1717#if BDLB_NULLABLEVALUE_VARIADIC_LIMIT_B >= 4
1718template <
class TYPE>
1719template <
class ARGS_1,
1724TYPE& NullableValue<TYPE>::makeValueInplace(
1737#if BDLB_NULLABLEVALUE_VARIADIC_LIMIT_B >= 5
1738template <
class TYPE>
1739template <
class ARGS_1,
1745TYPE& NullableValue<TYPE>::makeValueInplace(
1763template <
class TYPE>
1764template <
class... ARGS>
1766TYPE& NullableValue<TYPE>::makeValueInplace(
1774template <
class TYPE>
1776TYPE& NullableValue<TYPE>::value()
1778#ifndef BDE_OMIT_INTERNAL_DEPRECATED
1781 return this->dereferenceRaw();
1787template <
class TYPE>
1789const TYPE *NullableValue<TYPE>::addressOr(
const TYPE *address)
const
1791 return this->has_value() ? this-> operator->() : address;
1794template <
class TYPE>
1795template <
class STREAM>
1796STREAM& NullableValue<TYPE>::bdexStreamOut(STREAM& stream,
int version)
const
1800 const bool isNull = !this->has_value();
1802 stream.putInt8(isNull ? 1 : 0);
1811template <
class TYPE>
1815 return !this->has_value();
1818template <
class TYPE>
1820int NullableValue<TYPE>::maxSupportedBdexVersion(
int versionSelector)
const
1832#ifndef BDE_OMIT_INTERNAL_DEPRECATED
1833template <
class TYPE>
1835int NullableValue<TYPE>::maxSupportedBdexVersion()
const
1847template <
class TYPE>
1848bsl::ostream& NullableValue<TYPE>::print(bsl::ostream& stream,
1850 int spacesPerLevel)
const
1852 if (!this->has_value()) {
1860 stream, this->value(), level, spacesPerLevel);
1863template <
class TYPE>
1865const TYPE& NullableValue<TYPE>::value()
const
1867#ifndef BDE_OMIT_INTERNAL_DEPRECATED
1870 return this->dereferenceRaw();
1876template <
class TYPE>
1878TYPE NullableValue<TYPE>::valueOr(
const TYPE& value)
const
1880 return this->value_or(value);
1883template <
class TYPE>
1885const TYPE *NullableValue<TYPE>::valueOr(
const TYPE *value)
const
1887 return this->has_value() ? this-> operator->() : value;
1890template <
class TYPE>
1892const TYPE *NullableValue<TYPE>::valueOrNull()
const
1894 return this->has_value() ? this-> operator->() : 0;
1900template <
class LHS_TYPE,
class RHS_TYPE>
1903 const NullableValue<RHS_TYPE>& rhs)
1904#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
1906 { *lhs == *rhs } -> NullableValue_ConvertibleToBool;
1915template <
class LHS_TYPE,
class RHS_TYPE>
1919#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
1921 { *lhs == *rhs } -> NullableValue_ConvertibleToBool;
1928template <
class LHS_TYPE,
class RHS_TYPE>
1931 const NullableValue<RHS_TYPE>& rhs)
1932#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
1934 { *lhs == *rhs } -> NullableValue_ConvertibleToBool;
1941#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
1942template <
class LHS_TYPE,
class RHS_TYPE>
1945 const std::optional<RHS_TYPE>& rhs)
1946#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
1948 { *lhs == *rhs } -> NullableValue_ConvertibleToBool;
1955template <
class LHS_TYPE,
class RHS_TYPE>
1958 const NullableValue<RHS_TYPE>& rhs)
1959#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
1961 { *lhs == *rhs } -> NullableValue_ConvertibleToBool;
1969template <
class LHS_TYPE,
class RHS_TYPE>
1972 const NullableValue<RHS_TYPE>& rhs)
1973 #ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
1975 { *lhs != *rhs } -> NullableValue_ConvertibleToBool;
1983template <
class LHS_TYPE,
class RHS_TYPE>
1986 const NullableValue<RHS_TYPE>& rhs)
1987#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
1989 { *lhs != *rhs } -> NullableValue_ConvertibleToBool;
1996template <
class LHS_TYPE,
class RHS_TYPE>
2000#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2002 { *lhs != *rhs } -> NullableValue_ConvertibleToBool;
2009#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
2010template <
class LHS_TYPE,
class RHS_TYPE>
2013 const NullableValue<RHS_TYPE>& rhs)
2014#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2016 { *lhs != *rhs } -> NullableValue_ConvertibleToBool;
2023template <
class LHS_TYPE,
class RHS_TYPE>
2026 const std::optional<RHS_TYPE>& rhs)
2027#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2029 { *lhs != *rhs } -> NullableValue_ConvertibleToBool;
2037template <
class LHS_TYPE,
class RHS_TYPE>
2039bool bdlb::operator==(
const NullableValue<LHS_TYPE>& lhs,
const RHS_TYPE& rhs)
2040#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2041 requires (!NullableValue_DerivedFromOptional<RHS_TYPE>) &&
2042 requires { { *lhs == rhs } -> NullableValue_ConvertibleToBool; }
2048template <
class LHS_TYPE,
class RHS_TYPE>
2050bool bdlb::operator==(
const LHS_TYPE& lhs,
const NullableValue<RHS_TYPE>& rhs)
2051#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2052 requires (!NullableValue_DerivedFromOptional<LHS_TYPE>) &&
2053 requires { { lhs == *rhs } -> NullableValue_ConvertibleToBool; }
2059template <
class LHS_TYPE,
class RHS_TYPE>
2061bool bdlb::operator!=(
const NullableValue<LHS_TYPE>& lhs,
const RHS_TYPE& rhs)
2062#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2063 requires (!NullableValue_DerivedFromOptional<RHS_TYPE>) &&
2064 requires { { *lhs != rhs } -> NullableValue_ConvertibleToBool; }
2070template <
class LHS_TYPE,
class RHS_TYPE>
2072bool bdlb::operator!=(
const LHS_TYPE& lhs,
const NullableValue<RHS_TYPE>& rhs)
2073#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2074 requires (!NullableValue_DerivedFromOptional<LHS_TYPE>) &&
2075 requires { { lhs != *rhs } -> NullableValue_ConvertibleToBool; }
2081template <
class LHS_TYPE,
class RHS_TYPE>
2084 const NullableValue<RHS_TYPE>& rhs)
2085#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2087 { *lhs < *rhs } -> NullableValue_ConvertibleToBool;
2095template <
class LHS_TYPE,
class RHS_TYPE>
2098 const NullableValue<RHS_TYPE>& rhs)
2099#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2101 { *lhs < *rhs } -> NullableValue_ConvertibleToBool;
2105 return lhs < static_cast<const bsl::optional<RHS_TYPE>&>(rhs);
2108template <
class LHS_TYPE,
class RHS_TYPE>
2112#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2114 { *lhs < *rhs } -> NullableValue_ConvertibleToBool;
2121#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
2122template <
class LHS_TYPE,
class RHS_TYPE>
2125 const NullableValue<RHS_TYPE>& rhs)
2126#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2128 { *lhs < *rhs } -> NullableValue_ConvertibleToBool;
2132 return lhs < static_cast<const bsl::optional<RHS_TYPE>&>(rhs);
2135template <
class LHS_TYPE,
class RHS_TYPE>
2138 const std::optional<RHS_TYPE>& rhs)
2139#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2141 { *lhs < *rhs } -> NullableValue_ConvertibleToBool;
2149template <
class LHS_TYPE,
class RHS_TYPE>
2151bool bdlb::operator<(
const NullableValue<LHS_TYPE>& lhs,
const RHS_TYPE& rhs)
2152#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2153 requires (!NullableValue_DerivedFromOptional<RHS_TYPE>) &&
2154 requires { { *lhs < rhs } -> NullableValue_ConvertibleToBool; }
2160template <
class LHS_TYPE,
class RHS_TYPE>
2162bool bdlb::operator<(
const LHS_TYPE& lhs,
const NullableValue<RHS_TYPE>& rhs)
2163#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2164 requires (!NullableValue_DerivedFromOptional<LHS_TYPE>) &&
2165 requires { { lhs < *rhs } -> NullableValue_ConvertibleToBool; }
2168 return lhs < static_cast<const bsl::optional<RHS_TYPE>&>(rhs);
2171template <
class LHS_TYPE,
class RHS_TYPE>
2174 const NullableValue<RHS_TYPE>& rhs)
2175#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2177 { *lhs > *rhs } -> NullableValue_ConvertibleToBool;
2185template <
class LHS_TYPE,
class RHS_TYPE>
2188 const NullableValue<RHS_TYPE>& rhs)
2189#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2191 { *lhs > *rhs } -> NullableValue_ConvertibleToBool;
2198template <
class LHS_TYPE,
class RHS_TYPE>
2202#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2204 { *lhs > *rhs } -> NullableValue_ConvertibleToBool;
2211#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
2212template <
class LHS_TYPE,
class RHS_TYPE>
2215 const NullableValue<RHS_TYPE>& rhs)
2216#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2218 { *lhs > *rhs } -> NullableValue_ConvertibleToBool;
2225template <
class LHS_TYPE,
class RHS_TYPE>
2228 const std::optional<RHS_TYPE>& rhs)
2229#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2231 { *lhs > *rhs } -> NullableValue_ConvertibleToBool;
2239template <
class LHS_TYPE,
class RHS_TYPE>
2242 const RHS_TYPE& rhs)
2243#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2244 requires (!NullableValue_DerivedFromOptional<RHS_TYPE>) &&
2245 requires { { *lhs > rhs } -> NullableValue_ConvertibleToBool; }
2251template <
class LHS_TYPE,
class RHS_TYPE>
2254 const NullableValue<RHS_TYPE>& rhs)
2255#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2256 requires (!NullableValue_DerivedFromOptional<LHS_TYPE>) &&
2257 requires { { lhs > *rhs } -> NullableValue_ConvertibleToBool; }
2263template <
class LHS_TYPE,
class RHS_TYPE>
2266 const NullableValue<RHS_TYPE>& rhs)
2267#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2269 { *lhs <= *rhs } -> NullableValue_ConvertibleToBool;
2277template <
class LHS_TYPE,
class RHS_TYPE>
2280 const NullableValue<RHS_TYPE>& rhs)
2281#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2283 { *lhs <= *rhs } -> NullableValue_ConvertibleToBool;
2287 return lhs <= static_cast<const bsl::optional<RHS_TYPE>&>(rhs);
2290template <
class LHS_TYPE,
class RHS_TYPE>
2294#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2296 { *lhs <= *rhs } -> NullableValue_ConvertibleToBool;
2303#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
2304template <
class LHS_TYPE,
class RHS_TYPE>
2307 const NullableValue<RHS_TYPE>& rhs)
2308#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2310 { *lhs <= *rhs } -> NullableValue_ConvertibleToBool;
2314 return lhs <= static_cast<const bsl::optional<RHS_TYPE>&>(rhs);
2317template <
class LHS_TYPE,
class RHS_TYPE>
2320 const std::optional<RHS_TYPE>& rhs)
2321#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2323 { *lhs <= *rhs } -> NullableValue_ConvertibleToBool;
2331template <
class LHS_TYPE,
class RHS_TYPE>
2334 const RHS_TYPE& rhs)
2335#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2336 requires (!NullableValue_DerivedFromOptional<RHS_TYPE>) &&
2337 requires { { *lhs <= rhs } -> NullableValue_ConvertibleToBool; }
2343template <
class LHS_TYPE,
class RHS_TYPE>
2346 const NullableValue<RHS_TYPE>& rhs)
2347#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2348 requires (!NullableValue_DerivedFromOptional<LHS_TYPE>) &&
2349 requires { { lhs <= *rhs } -> NullableValue_ConvertibleToBool; }
2352 return lhs <= static_cast<const bsl::optional<RHS_TYPE>&>(rhs);
2356template <
class LHS_TYPE,
class RHS_TYPE>
2359 const NullableValue<RHS_TYPE>& rhs)
2360#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2362 { *lhs >= *rhs } -> NullableValue_ConvertibleToBool;
2370template <
class LHS_TYPE,
class RHS_TYPE>
2373 const NullableValue<RHS_TYPE>& rhs)
2374#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2376 { *lhs >= *rhs } -> NullableValue_ConvertibleToBool;
2383template <
class LHS_TYPE,
class RHS_TYPE>
2387#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2389 { *lhs >= *rhs } -> NullableValue_ConvertibleToBool;
2396#ifdef BSLS_LIBRARYFEATURES_HAS_CPP17_BASELINE_LIBRARY
2397template <
class LHS_TYPE,
class RHS_TYPE>
2400 const NullableValue<RHS_TYPE>& rhs)
2401#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2403 { *lhs >= *rhs } -> NullableValue_ConvertibleToBool;
2410template <
class LHS_TYPE,
class RHS_TYPE>
2413 const std::optional<RHS_TYPE>& rhs)
2414#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2416 { *lhs >= *rhs } -> NullableValue_ConvertibleToBool;
2424template <
class LHS_TYPE,
class RHS_TYPE>
2427 const RHS_TYPE& rhs)
2428#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2429 requires (!NullableValue_DerivedFromOptional<RHS_TYPE>) &&
2430 requires { { *lhs >= rhs } -> NullableValue_ConvertibleToBool; }
2436template <
class LHS_TYPE,
class RHS_TYPE>
2439 const NullableValue<RHS_TYPE>& rhs)
2440#ifdef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2441 requires (!NullableValue_DerivedFromOptional<LHS_TYPE>) &&
2442 requires { { lhs >= *rhs } -> NullableValue_ConvertibleToBool; }
2449#if defined BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON && \
2450 defined BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2452template <
class LHS_TYPE, bsl::three_way_comparable_with<LHS_TYPE> RHS_TYPE>
2453constexpr std::compare_three_way_result_t<LHS_TYPE, RHS_TYPE>
2454bdlb::operator<=>(
const NullableValue<LHS_TYPE>& lhs,
2455 const NullableValue<RHS_TYPE>& rhs)
2461template <
class LHS_TYPE, bsl::three_way_comparable_with<LHS_TYPE> RHS_TYPE>
2462constexpr std::compare_three_way_result_t<LHS_TYPE, RHS_TYPE>
2463bdlb::operator<=>(
const NullableValue<LHS_TYPE>& lhs,
2469template <
class LHS_TYPE, bsl::three_way_comparable_with<LHS_TYPE> RHS_TYPE>
2470constexpr std::compare_three_way_result_t<LHS_TYPE, RHS_TYPE>
2471bdlb::operator<=>(
const NullableValue<LHS_TYPE>& lhs,
2472 const std::optional<RHS_TYPE>& rhs)
2477template <
class LHS_TYPE,
class RHS_TYPE>
2478 requires(!bdlb::NullableValue_DerivedFromOptional<RHS_TYPE>) &&
2479 bsl::three_way_comparable_with<LHS_TYPE, RHS_TYPE>
2480constexpr std::compare_three_way_result_t<LHS_TYPE, RHS_TYPE>
2481bdlb::operator<=>(
const NullableValue<LHS_TYPE>& lhs,
const RHS_TYPE& rhs)
2486template <
class TYPE>
2487constexpr std::strong_ordering
2488bdlb::operator<=>(
const NullableValue<TYPE>& value,
2491 return (!value.isNull()) <=>
false;
2496template <
class TYPE>
2501 return !value.has_value();
2504#ifndef BSLS_COMPILERFEATURES_SUPPORT_THREE_WAY_COMPARISON
2506template <
class TYPE>
2511 return !value.has_value();
2514template <
class TYPE>
2519 return value.has_value();
2522template <
class TYPE>
2527 return value.has_value();
2530# ifndef BSLS_LIBRARYFEATURES_HAS_CPP20_CONCEPTS
2532template <
class TYPE>
2540template <
class TYPE>
2545 return value.has_value();
2548template <
class TYPE>
2553 return value.has_value();
2556template <
class TYPE>
2564template <
class TYPE>
2569 return !value.has_value();
2572template <
class TYPE>
2580template <
class TYPE>
2588template <
class TYPE>
2593 return !value.has_value();
2599template <
class TYPE>
2602 const NullableValue<TYPE>&
object)
2604 return object.print(stream, 0, -1);
2608template <
class HASHALG,
class TYPE>
2611 if (!input.isNull()) {
2620template <
class TYPE>
2624bdlb::swap(NullableValue<TYPE>& lhs, NullableValue<TYPE>& rhs)
2630template <
class TYPE>
2634bdlb::swap(NullableValue<TYPE>& lhs, NullableValue<TYPE>& rhs)
2641#ifdef BSLSTL_OPTIONAL_CPP20_IS_OPTIONAL_GNU_WORKAROUND_NEEDED
2646template <
typename _Tp>
2647inline constexpr bool __is_optional_v<BloombergLP::bdlb::NullableValue<_Tp>> =
2652#ifdef BSLSTL_OPTIONAL_CPP20_IS_OPTIONAL_MSVC_WORKAROUND_NEEDED
2657template <
typename _Tp>
2659constexpr bool _Is_specialization_v<BloombergLP::bdlb::NullableValue<_Tp>,
2660 std::optional> =
true;
2665# error Not valid except when included from bdlb_nullablevalue.h
#define BSLMF_NESTED_TRAIT_DECLARATION(t_TYPE, t_TRAIT)
Definition bslmf_nestedtraitdeclaration.h:231
#define BSLMF_NESTED_TRAIT_DECLARATION_IF(t_TYPE, t_TRAIT, t_COND)
Definition bslmf_nestedtraitdeclaration.h:243
STREAM & bdexStreamIn(STREAM &stream, int version)
Definition bdlb_nullablevalue.h:1694
bsl::optional< TYPE > Base
Base class of this type.
Definition bdlb_nullablevalue.h:286
bool isNull() const BSLS_KEYWORD_NOEXCEPT
Return true if this object is null, and false otherwise.
Definition bdlb_nullablevalue.h:1779
const TYPE * valueOrNull() const
Definition bdlb_nullablevalue.h:1858
AllocType allocator_type
Definition bdlb_nullablevalue.h:297
TYPE & makeValue()
Definition bdlb_nullablevalue.h:1725
TYPE valueOr(const TYPE &value) const
Definition bdlb_nullablevalue.h:1844
bsl::ostream & print(bsl::ostream &stream, int level=0, int spacesPerLevel=4) const
Definition bdlb_nullablevalue.h:1814
const TYPE * addressOr(const TYPE *address) const
Definition bdlb_nullablevalue.h:1755
TYPE & makeValueInplace(ARGS &&... args)
Definition bdlb_nullablevalue.h:1734
STREAM & bdexStreamOut(STREAM &stream, int version) const
Definition bdlb_nullablevalue.h:1762
int maxSupportedBdexVersion() const
Definition bdlb_nullablevalue.h:1801
friend class NullableValue
Definition bdlb_nullablevalue.h:280
TYPE & value()
Definition bdlb_nullablevalue.h:1742
TYPE ValueType
Definition bdlb_nullablevalue.h:291
Definition bslma_bslallocator.h:580
Definition bslstl_optional.h:1861
optional() BSLS_KEYWORD_NOEXCEPT
Definition bslstl_optional.h:4630
Definition bslmf_movableref.h:751
#define BSLMF_MOVABLEREF_DEDUCE(...)
Definition bslmf_movableref.h:690
#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
Definition bsls_deprecate.h:720
#define BSLS_KEYWORD_CONSTEXPR
Definition bsls_keyword.h:588
#define BSLS_KEYWORD_NOEXCEPT
Definition bsls_keyword.h:632
#define BSLS_KEYWORD_NOEXCEPT_SPECIFICATION(...)
Definition bsls_keyword.h:634
#define BSLS_REVIEW_OPT(X)
Definition bsls_review.h:977
bool operator!=(const FileCleanerConfiguration &lhs, const FileCleanerConfiguration &rhs)
bool operator==(const FileCleanerConfiguration &lhs, const FileCleanerConfiguration &rhs)
void swap(OptionValue &a, OptionValue &b)
void hashAppend(HASH_ALGORITHM &hashAlg, const baljsn::EncoderTestAddress &object)
Definition baljsn_encoder_testtypes.h:9236
bool operator<(const MetricId &lhs, const MetricId &rhs)
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 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:719
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 bdlb_printmethods.h:283
Definition bdlbb_blob.h:576
STREAM & bdexStreamIn(STREAM &stream, VALUE_TYPE &variable)
Definition bslx_instreamfunctions.h:1247
STREAM & bdexStreamOut(STREAM &stream, const TYPE &value)
Definition bslx_outstreamfunctions.h:992
int maxSupportedBdexVersion(const TYPE *, int versionSelector)
Definition bslx_versionfunctions.h:519
Definition bdldfp_decimal.h:5188
Definition bdlb_printmethods.h:306
Definition bslmf_conditional.h:120
Definition bslmf_enableif.h:525
Definition bslmf_isconvertible.h:867
Definition bslmf_isnothrowmoveconstructible.h:358
Definition bslmf_issame.h:146
Definition bslstl_optional.h:467
Definition bslma_usesbslmaallocator.h:343
Definition bslmf_isbitwisecopyable.h:298
Definition bslmf_isbitwisemoveable.h:718
Definition bslmf_movableref.h:791