36 #ifndef ABSL_STATUS_STATUSOR_H_
37 #define ABSL_STATUS_STATUSOR_H_
40 #include <initializer_list>
43 #include <type_traits>
46 #include "absl/base/attributes.h"
47 #include "absl/meta/type_traits.h"
48 #include "absl/status/internal/statusor_internal.h"
49 #include "absl/status/status.h"
50 #include "absl/types/variant.h"
51 #include "absl/utility/utility.h"
72 class BadStatusOrAccess :
public std::exception {
85 const char*
what()
const noexcept override;
171 class
StatusOr : private internal_statusor::StatusOrData<
T>,
172 private internal_statusor::CopyCtorBase<
T>,
173 private internal_statusor::MoveCtorBase<
T>,
174 private internal_statusor::CopyAssignBase<
T>,
175 private internal_statusor::MoveAssignBase<
T> {
176 template <
typename U>
223 std::is_constructible<T, const U&>,
224 std::is_convertible<const U&, T>,
236 std::is_constructible<T, const U&>,
250 std::is_convertible<U&&, T>,
294 std::is_constructible<T, const U&>,
295 std::is_assignable<T, const U&>,
298 IsConstructibleOrConvertibleOrAssignableFromStatusOr<
310 std::is_assignable<T, U&&>,
313 IsConstructibleOrConvertibleOrAssignableFromStatusOr<
336 std::is_convertible<U&&, absl::Status>,
337 std::is_constructible<absl::Status, U&&>,
351 std::is_constructible<absl::Status, U&&>,
364 std::is_convertible<U&&, absl::Status>,
365 std::is_constructible<absl::Status, U&&>,
373 this->AssignStatus(std::forward<U>(
v));
396 std::is_constructible<T, U&&>, std::is_assignable<T&, U&&>,
398 std::is_same<absl::remove_cv_t<absl::remove_reference_t<U>>,
T>,
402 HasConversionOperatorToStatusOr<T, U&&>>>>,
405 this->
Assign(std::forward<U>(
v));
411 template <
typename...
Args>
413 template <
typename U,
typename...
Args>
429 std::is_constructible<T, U&&>, std::is_convertible<U&&, T>,
431 std::is_same<absl::remove_cv_t<absl::remove_reference_t<U>>,
449 std::is_same<absl::remove_cv_t<absl::remove_reference_t<U>>,
456 std::is_constructible<T, U&&>,
557 T value_or(U&& default_value)
const&;
559 T value_or(U&& default_value) &&;
566 void IgnoreError()
const;
576 this->MakeValue(std::forward<Args>(
args)...);
578 this->MakeValue(std::forward<Args>(
args)...);
585 typename U,
typename...
Args,
587 std::is_constructible<T, std::initializer_list<U>&,
Args&&...>
::value,
592 this->MakeValue(ilist, std::forward<Args>(
args)...);
594 this->MakeValue(ilist, std::forward<Args>(
args)...);
602 template <
typename U>
604 template <
typename U>
611 template <
typename T>
612 bool operator==(
const StatusOr<T>& lhs,
const StatusOr<T>& rhs) {
613 if (lhs.ok() && rhs.ok())
return *lhs == *rhs;
614 return lhs.status() == rhs.status();
620 template <
typename T>
621 bool operator!=(
const StatusOr<T>& lhs,
const StatusOr<T>& rhs) {
622 return !(lhs == rhs);
630 template <
typename T>
633 template <
typename T>
634 template <
typename U>
639 this->AssignStatus(other.status());
643 template <
typename T>
644 template <
typename U>
652 template <
typename T>
653 template <
typename...
Args>
657 template <
typename T>
658 template <
typename U,
typename...
Args>
663 template <
typename T>
665 template <
typename T>
670 template <
typename T>
676 template <
typename T>
682 template <
typename T>
690 template <
typename T>
698 template <
typename T>
704 template <
typename T>
710 template <
typename T>
716 template <
typename T>
722 template <
typename T>
723 const T* StatusOr<T>::operator->()
const {
728 template <
typename T>
729 T* StatusOr<T>::operator->() {
734 template <
typename T>
735 template <
typename U>
740 return std::forward<U>(default_value);
743 template <
typename T>
744 template <
typename U>
749 return std::forward<U>(default_value);
752 template <
typename T>
760 #endif // ABSL_STATUS_STATUSOR_H_