14 #ifndef ABSL_STATUS_INTERNAL_STATUSOR_INTERNAL_H_
15 #define ABSL_STATUS_INTERNAL_STATUSOR_INTERNAL_H_
17 #include <type_traits>
20 #include "absl/base/attributes.h"
21 #include "absl/meta/type_traits.h"
22 #include "absl/status/status.h"
23 #include "absl/utility/utility.h"
31 namespace internal_statusor {
35 template <
typename T,
typename U,
typename =
void>
38 template <
typename T,
typename U>
41 template <
typename T,
typename U>
46 template <
typename T,
typename U>
49 std::is_constructible<T, const StatusOr<U>&>,
50 std::is_constructible<T, StatusOr<U>&&>,
51 std::is_constructible<T, const StatusOr<U>&&>,
52 std::is_convertible<StatusOr<U>&,
T>,
53 std::is_convertible<const StatusOr<U>&,
T>,
54 std::is_convertible<StatusOr<U>&&,
T>,
55 std::is_convertible<const StatusOr<U>&&,
T>>;
59 template <
typename T,
typename U>
62 std::is_assignable<T&, StatusOr<U>&>,
63 std::is_assignable<T&, const StatusOr<U>&>,
64 std::is_assignable<T&, StatusOr<U>&&>,
65 std::is_assignable<T&, const StatusOr<U>&&>>;
69 template <
typename T,
typename U>
72 std::is_same<absl::remove_cv_t<absl::remove_reference_t<U>>,
75 IsDirectInitializationAmbiguous<
76 T, absl::remove_cv_t<absl::remove_reference_t<U>>>> {};
78 template <
typename T,
typename V>
84 template <
typename T,
typename U>
87 std::is_same<T, absl::remove_cv_t<absl::remove_reference_t<U>>>,
89 std::is_same<absl::StatusOr<T>,
107 template <
typename T,
typename U>
110 std::is_same<absl::remove_cv_t<absl::remove_reference_t<U>>,
113 IsForwardingAssignmentAmbiguous<
114 T, absl::remove_cv_t<absl::remove_reference_t<U>>>> {};
116 template <
typename T,
typename U>
122 template <
typename T,
typename U>
125 std::is_same<T, absl::remove_cv_t<absl::remove_reference_t<U>>>,
127 std::is_same<absl::StatusOr<T>,
145 template <
typename T,
typename...
Args>
147 new (p)
T(std::forward<Args>(
args)...);
153 template <
typename T>
155 template <
typename U>
179 template <
typename U>
189 template <
typename U>
199 template <
typename...
Args>
212 template <
typename U,
220 if (
this == &other)
return *
this;
229 if (
this == &other)
return *
this;
246 template <
typename U>
256 template <
typename U>
298 template <
typename...
Arg>
300 internal_statusor::PlacementNew<T>(&
dummy_, std::forward<Arg>(
arg)...);
305 template <
typename...
Args>
307 internal_statusor::PlacementNew<Status>(&
status_,
308 std::forward<Args>(
args)...);
325 template <
typename T>
343 template <
typename T>
362 template <
typename T>
381 template <
typename T>
396 #endif // ABSL_STATUS_INTERNAL_STATUSOR_INTERNAL_H_