123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776 |
- #ifndef Y_ABSL_STATUS_STATUSOR_H_
- #define Y_ABSL_STATUS_STATUSOR_H_
- #include <exception>
- #include <initializer_list>
- #include <new>
- #include <util/generic/string.h>
- #include <type_traits>
- #include <utility>
- #include "y_absl/base/attributes.h"
- #include "y_absl/base/call_once.h"
- #include "y_absl/meta/type_traits.h"
- #include "y_absl/status/internal/statusor_internal.h"
- #include "y_absl/status/status.h"
- #include "y_absl/types/variant.h"
- #include "y_absl/utility/utility.h"
- namespace y_absl {
- Y_ABSL_NAMESPACE_BEGIN
- class BadStatusOrAccess : public std::exception {
- public:
- explicit BadStatusOrAccess(y_absl::Status status);
- ~BadStatusOrAccess() override = default;
- BadStatusOrAccess(const BadStatusOrAccess& other);
- BadStatusOrAccess& operator=(const BadStatusOrAccess& other);
- BadStatusOrAccess(BadStatusOrAccess&& other);
- BadStatusOrAccess& operator=(BadStatusOrAccess&& other);
-
-
-
-
-
-
-
-
- const char* what() const noexcept override;
-
-
-
-
- const y_absl::Status& status() const;
- private:
- void InitWhat() const;
- y_absl::Status status_;
- mutable y_absl::once_flag init_what_;
- mutable TString what_;
- };
- template <typename T>
- #if Y_ABSL_HAVE_CPP_ATTRIBUTE(nodiscard)
- class [[nodiscard]] StatusOr;
- #else
- class Y_ABSL_MUST_USE_RESULT StatusOr;
- #endif
- template <typename T>
- class StatusOr : private internal_statusor::StatusOrData<T>,
- private internal_statusor::CopyCtorBase<T>,
- private internal_statusor::MoveCtorBase<T>,
- private internal_statusor::CopyAssignBase<T>,
- private internal_statusor::MoveAssignBase<T> {
- template <typename U>
- friend class StatusOr;
- typedef internal_statusor::StatusOrData<T> Base;
- public:
-
-
-
-
-
- typedef T value_type;
-
-
-
-
-
-
- explicit StatusOr();
-
- StatusOr(const StatusOr&) = default;
-
-
- StatusOr& operator=(const StatusOr&) = default;
-
- StatusOr(StatusOr&&) = default;
-
-
- StatusOr& operator=(StatusOr&&) = default;
-
-
-
-
-
-
-
- template <
- typename U,
- y_absl::enable_if_t<
- y_absl::conjunction<
- y_absl::negation<std::is_same<T, U>>,
- std::is_constructible<T, const U&>,
- std::is_convertible<const U&, T>,
- y_absl::negation<
- internal_statusor::IsConstructibleOrConvertibleFromStatusOr<
- T, U>>>::value,
- int> = 0>
- StatusOr(const StatusOr<U>& other)
- : Base(static_cast<const typename StatusOr<U>::Base&>(other)) {}
- template <
- typename U,
- y_absl::enable_if_t<
- y_absl::conjunction<
- y_absl::negation<std::is_same<T, U>>,
- std::is_constructible<T, const U&>,
- y_absl::negation<std::is_convertible<const U&, T>>,
- y_absl::negation<
- internal_statusor::IsConstructibleOrConvertibleFromStatusOr<
- T, U>>>::value,
- int> = 0>
- explicit StatusOr(const StatusOr<U>& other)
- : Base(static_cast<const typename StatusOr<U>::Base&>(other)) {}
- template <
- typename U,
- y_absl::enable_if_t<
- y_absl::conjunction<
- y_absl::negation<std::is_same<T, U>>, std::is_constructible<T, U&&>,
- std::is_convertible<U&&, T>,
- y_absl::negation<
- internal_statusor::IsConstructibleOrConvertibleFromStatusOr<
- T, U>>>::value,
- int> = 0>
- StatusOr(StatusOr<U>&& other)
- : Base(static_cast<typename StatusOr<U>::Base&&>(other)) {}
- template <
- typename U,
- y_absl::enable_if_t<
- y_absl::conjunction<
- y_absl::negation<std::is_same<T, U>>, std::is_constructible<T, U&&>,
- y_absl::negation<std::is_convertible<U&&, T>>,
- y_absl::negation<
- internal_statusor::IsConstructibleOrConvertibleFromStatusOr<
- T, U>>>::value,
- int> = 0>
- explicit StatusOr(StatusOr<U>&& other)
- : Base(static_cast<typename StatusOr<U>::Base&&>(other)) {}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- template <
- typename U,
- y_absl::enable_if_t<
- y_absl::conjunction<
- y_absl::negation<std::is_same<T, U>>,
- std::is_constructible<T, const U&>,
- std::is_assignable<T, const U&>,
- y_absl::negation<
- internal_statusor::
- IsConstructibleOrConvertibleOrAssignableFromStatusOr<
- T, U>>>::value,
- int> = 0>
- StatusOr& operator=(const StatusOr<U>& other) {
- this->Assign(other);
- return *this;
- }
- template <
- typename U,
- y_absl::enable_if_t<
- y_absl::conjunction<
- y_absl::negation<std::is_same<T, U>>, std::is_constructible<T, U&&>,
- std::is_assignable<T, U&&>,
- y_absl::negation<
- internal_statusor::
- IsConstructibleOrConvertibleOrAssignableFromStatusOr<
- T, U>>>::value,
- int> = 0>
- StatusOr& operator=(StatusOr<U>&& other) {
- this->Assign(std::move(other));
- return *this;
- }
-
-
-
-
-
-
-
-
-
-
-
- template <
- typename U = y_absl::Status,
- y_absl::enable_if_t<
- y_absl::conjunction<
- std::is_convertible<U&&, y_absl::Status>,
- std::is_constructible<y_absl::Status, U&&>,
- y_absl::negation<std::is_same<y_absl::decay_t<U>, y_absl::StatusOr<T>>>,
- y_absl::negation<std::is_same<y_absl::decay_t<U>, T>>,
- y_absl::negation<std::is_same<y_absl::decay_t<U>, y_absl::in_place_t>>,
- y_absl::negation<internal_statusor::HasConversionOperatorToStatusOr<
- T, U&&>>>::value,
- int> = 0>
- StatusOr(U&& v) : Base(std::forward<U>(v)) {}
- template <
- typename U = y_absl::Status,
- y_absl::enable_if_t<
- y_absl::conjunction<
- y_absl::negation<std::is_convertible<U&&, y_absl::Status>>,
- std::is_constructible<y_absl::Status, U&&>,
- y_absl::negation<std::is_same<y_absl::decay_t<U>, y_absl::StatusOr<T>>>,
- y_absl::negation<std::is_same<y_absl::decay_t<U>, T>>,
- y_absl::negation<std::is_same<y_absl::decay_t<U>, y_absl::in_place_t>>,
- y_absl::negation<internal_statusor::HasConversionOperatorToStatusOr<
- T, U&&>>>::value,
- int> = 0>
- explicit StatusOr(U&& v) : Base(std::forward<U>(v)) {}
- template <
- typename U = y_absl::Status,
- y_absl::enable_if_t<
- y_absl::conjunction<
- std::is_convertible<U&&, y_absl::Status>,
- std::is_constructible<y_absl::Status, U&&>,
- y_absl::negation<std::is_same<y_absl::decay_t<U>, y_absl::StatusOr<T>>>,
- y_absl::negation<std::is_same<y_absl::decay_t<U>, T>>,
- y_absl::negation<std::is_same<y_absl::decay_t<U>, y_absl::in_place_t>>,
- y_absl::negation<internal_statusor::HasConversionOperatorToStatusOr<
- T, U&&>>>::value,
- int> = 0>
- StatusOr& operator=(U&& v) {
- this->AssignStatus(std::forward<U>(v));
- return *this;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- template <
- typename U = T,
- typename = typename std::enable_if<y_absl::conjunction<
- std::is_constructible<T, U&&>, std::is_assignable<T&, U&&>,
- y_absl::disjunction<
- std::is_same<y_absl::remove_cv_t<y_absl::remove_reference_t<U>>, T>,
- y_absl::conjunction<
- y_absl::negation<std::is_convertible<U&&, y_absl::Status>>,
- y_absl::negation<internal_statusor::
- HasConversionOperatorToStatusOr<T, U&&>>>>,
- internal_statusor::IsForwardingAssignmentValid<T, U&&>>::value>::type>
- StatusOr& operator=(U&& v) {
- this->Assign(std::forward<U>(v));
- return *this;
- }
-
-
- template <typename... Args>
- explicit StatusOr(y_absl::in_place_t, Args&&... args);
- template <typename U, typename... Args>
- explicit StatusOr(y_absl::in_place_t, std::initializer_list<U> ilist,
- Args&&... args);
-
-
-
-
-
-
-
- template <
- typename U = T,
- y_absl::enable_if_t<
- y_absl::conjunction<
- internal_statusor::IsDirectInitializationValid<T, U&&>,
- std::is_constructible<T, U&&>, std::is_convertible<U&&, T>,
- y_absl::disjunction<
- std::is_same<y_absl::remove_cv_t<y_absl::remove_reference_t<U>>,
- T>,
- y_absl::conjunction<
- y_absl::negation<std::is_convertible<U&&, y_absl::Status>>,
- y_absl::negation<
- internal_statusor::HasConversionOperatorToStatusOr<
- T, U&&>>>>>::value,
- int> = 0>
- StatusOr(U&& u)
- : StatusOr(y_absl::in_place, std::forward<U>(u)) {}
- template <
- typename U = T,
- y_absl::enable_if_t<
- y_absl::conjunction<
- internal_statusor::IsDirectInitializationValid<T, U&&>,
- y_absl::disjunction<
- std::is_same<y_absl::remove_cv_t<y_absl::remove_reference_t<U>>,
- T>,
- y_absl::conjunction<
- y_absl::negation<std::is_constructible<y_absl::Status, U&&>>,
- y_absl::negation<
- internal_statusor::HasConversionOperatorToStatusOr<
- T, U&&>>>>,
- std::is_constructible<T, U&&>,
- y_absl::negation<std::is_convertible<U&&, T>>>::value,
- int> = 0>
- explicit StatusOr(U&& u)
- : StatusOr(y_absl::in_place, std::forward<U>(u)) {}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Y_ABSL_MUST_USE_RESULT bool ok() const { return this->status_.ok(); }
-
-
-
-
-
- const Status& status() const&;
- Status status() &&;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- const T& value() const& Y_ABSL_ATTRIBUTE_LIFETIME_BOUND;
- T& value() & Y_ABSL_ATTRIBUTE_LIFETIME_BOUND;
- const T&& value() const&& Y_ABSL_ATTRIBUTE_LIFETIME_BOUND;
- T&& value() && Y_ABSL_ATTRIBUTE_LIFETIME_BOUND;
-
-
-
-
-
-
-
-
-
-
- const T& operator*() const& Y_ABSL_ATTRIBUTE_LIFETIME_BOUND;
- T& operator*() & Y_ABSL_ATTRIBUTE_LIFETIME_BOUND;
- const T&& operator*() const&& Y_ABSL_ATTRIBUTE_LIFETIME_BOUND;
- T&& operator*() && Y_ABSL_ATTRIBUTE_LIFETIME_BOUND;
-
-
-
-
-
-
-
- const T* operator->() const Y_ABSL_ATTRIBUTE_LIFETIME_BOUND;
- T* operator->() Y_ABSL_ATTRIBUTE_LIFETIME_BOUND;
-
-
-
-
-
-
-
-
-
-
-
-
-
- template <typename U>
- T value_or(U&& default_value) const&;
- template <typename U>
- T value_or(U&& default_value) &&;
-
-
-
-
-
- void IgnoreError() const;
-
-
-
-
- template <typename... Args>
- T& emplace(Args&&... args) {
- if (ok()) {
- this->Clear();
- this->MakeValue(std::forward<Args>(args)...);
- } else {
- this->MakeValue(std::forward<Args>(args)...);
- this->status_ = y_absl::OkStatus();
- }
- return this->data_;
- }
- template <
- typename U, typename... Args,
- y_absl::enable_if_t<
- std::is_constructible<T, std::initializer_list<U>&, Args&&...>::value,
- int> = 0>
- T& emplace(std::initializer_list<U> ilist, Args&&... args) {
- if (ok()) {
- this->Clear();
- this->MakeValue(ilist, std::forward<Args>(args)...);
- } else {
- this->MakeValue(ilist, std::forward<Args>(args)...);
- this->status_ = y_absl::OkStatus();
- }
- return this->data_;
- }
- private:
- using internal_statusor::StatusOrData<T>::Assign;
- template <typename U>
- void Assign(const y_absl::StatusOr<U>& other);
- template <typename U>
- void Assign(y_absl::StatusOr<U>&& other);
- };
- template <typename T>
- bool operator==(const StatusOr<T>& lhs, const StatusOr<T>& rhs) {
- if (lhs.ok() && rhs.ok()) return *lhs == *rhs;
- return lhs.status() == rhs.status();
- }
- template <typename T>
- bool operator!=(const StatusOr<T>& lhs, const StatusOr<T>& rhs) {
- return !(lhs == rhs);
- }
- template <typename T>
- StatusOr<T>::StatusOr() : Base(Status(y_absl::StatusCode::kUnknown, "")) {}
- template <typename T>
- template <typename U>
- inline void StatusOr<T>::Assign(const StatusOr<U>& other) {
- if (other.ok()) {
- this->Assign(*other);
- } else {
- this->AssignStatus(other.status());
- }
- }
- template <typename T>
- template <typename U>
- inline void StatusOr<T>::Assign(StatusOr<U>&& other) {
- if (other.ok()) {
- this->Assign(*std::move(other));
- } else {
- this->AssignStatus(std::move(other).status());
- }
- }
- template <typename T>
- template <typename... Args>
- StatusOr<T>::StatusOr(y_absl::in_place_t, Args&&... args)
- : Base(y_absl::in_place, std::forward<Args>(args)...) {}
- template <typename T>
- template <typename U, typename... Args>
- StatusOr<T>::StatusOr(y_absl::in_place_t, std::initializer_list<U> ilist,
- Args&&... args)
- : Base(y_absl::in_place, ilist, std::forward<Args>(args)...) {}
- template <typename T>
- const Status& StatusOr<T>::status() const& {
- return this->status_;
- }
- template <typename T>
- Status StatusOr<T>::status() && {
- return ok() ? OkStatus() : std::move(this->status_);
- }
- template <typename T>
- const T& StatusOr<T>::value() const& {
- if (!this->ok()) internal_statusor::ThrowBadStatusOrAccess(this->status_);
- return this->data_;
- }
- template <typename T>
- T& StatusOr<T>::value() & {
- if (!this->ok()) internal_statusor::ThrowBadStatusOrAccess(this->status_);
- return this->data_;
- }
- template <typename T>
- const T&& StatusOr<T>::value() const&& {
- if (!this->ok()) {
- internal_statusor::ThrowBadStatusOrAccess(std::move(this->status_));
- }
- return std::move(this->data_);
- }
- template <typename T>
- T&& StatusOr<T>::value() && {
- if (!this->ok()) {
- internal_statusor::ThrowBadStatusOrAccess(std::move(this->status_));
- }
- return std::move(this->data_);
- }
- template <typename T>
- const T& StatusOr<T>::operator*() const& {
- this->EnsureOk();
- return this->data_;
- }
- template <typename T>
- T& StatusOr<T>::operator*() & {
- this->EnsureOk();
- return this->data_;
- }
- template <typename T>
- const T&& StatusOr<T>::operator*() const&& {
- this->EnsureOk();
- return std::move(this->data_);
- }
- template <typename T>
- T&& StatusOr<T>::operator*() && {
- this->EnsureOk();
- return std::move(this->data_);
- }
- template <typename T>
- const T* StatusOr<T>::operator->() const {
- this->EnsureOk();
- return &this->data_;
- }
- template <typename T>
- T* StatusOr<T>::operator->() {
- this->EnsureOk();
- return &this->data_;
- }
- template <typename T>
- template <typename U>
- T StatusOr<T>::value_or(U&& default_value) const& {
- if (ok()) {
- return this->data_;
- }
- return std::forward<U>(default_value);
- }
- template <typename T>
- template <typename U>
- T StatusOr<T>::value_or(U&& default_value) && {
- if (ok()) {
- return std::move(this->data_);
- }
- return std::forward<U>(default_value);
- }
- template <typename T>
- void StatusOr<T>::IgnoreError() const {
-
- }
- Y_ABSL_NAMESPACE_END
- }
- #endif
|