| //===--- MockHeaders.cpp - Mock headers for dataflow analyses -*- C++ ---*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines mock headers for testing of dataflow analyses. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "MockHeaders.h" |
| |
| namespace clang { |
| namespace dataflow { |
| namespace test { |
| static constexpr char CStdDefHeader[] = R"( |
| #ifndef CSTDDEF_H |
| #define CSTDDEF_H |
| |
| namespace std { |
| |
| typedef decltype(sizeof(char)) size_t; |
| |
| using nullptr_t = decltype(nullptr); |
| |
| } // namespace std |
| |
| typedef decltype(sizeof(char)) size_t; |
| typedef decltype(sizeof(char*)) ptrdiff_t; |
| |
| #endif // CSTDDEF_H |
| )"; |
| |
| static constexpr char StdTypeTraitsHeader[] = R"( |
| #ifndef STD_TYPE_TRAITS_H |
| #define STD_TYPE_TRAITS_H |
| |
| #include "cstddef.h" |
| |
| namespace std { |
| |
| template <typename T, T V> |
| struct integral_constant { |
| static constexpr T value = V; |
| }; |
| |
| using true_type = integral_constant<bool, true>; |
| using false_type = integral_constant<bool, false>; |
| |
| template< class T > struct remove_reference {typedef T type;}; |
| template< class T > struct remove_reference<T&> {typedef T type;}; |
| template< class T > struct remove_reference<T&&> {typedef T type;}; |
| |
| template <class T> |
| using remove_reference_t = typename remove_reference<T>::type; |
| |
| template <class T> |
| struct remove_extent { |
| typedef T type; |
| }; |
| |
| template <class T> |
| struct remove_extent<T[]> { |
| typedef T type; |
| }; |
| |
| template <class T, size_t N> |
| struct remove_extent<T[N]> { |
| typedef T type; |
| }; |
| |
| template <class T> |
| struct is_array : false_type {}; |
| |
| template <class T> |
| struct is_array<T[]> : true_type {}; |
| |
| template <class T, size_t N> |
| struct is_array<T[N]> : true_type {}; |
| |
| template <class> |
| struct is_function : false_type {}; |
| |
| template <class Ret, class... Args> |
| struct is_function<Ret(Args...)> : true_type {}; |
| |
| namespace detail { |
| |
| template <class T> |
| struct type_identity { |
| using type = T; |
| }; // or use type_identity (since C++20) |
| |
| template <class T> |
| auto try_add_pointer(int) -> type_identity<typename remove_reference<T>::type*>; |
| template <class T> |
| auto try_add_pointer(...) -> type_identity<T>; |
| |
| } // namespace detail |
| |
| template <class T> |
| struct add_pointer : decltype(detail::try_add_pointer<T>(0)) {}; |
| |
| template <bool B, class T, class F> |
| struct conditional { |
| typedef T type; |
| }; |
| |
| template <class T, class F> |
| struct conditional<false, T, F> { |
| typedef F type; |
| }; |
| |
| template <class T> |
| struct remove_cv { |
| typedef T type; |
| }; |
| template <class T> |
| struct remove_cv<const T> { |
| typedef T type; |
| }; |
| template <class T> |
| struct remove_cv<volatile T> { |
| typedef T type; |
| }; |
| template <class T> |
| struct remove_cv<const volatile T> { |
| typedef T type; |
| }; |
| |
| template <class T> |
| using remove_cv_t = typename remove_cv<T>::type; |
| |
| template <class T> |
| struct decay { |
| private: |
| typedef typename remove_reference<T>::type U; |
| |
| public: |
| typedef typename conditional< |
| is_array<U>::value, typename remove_extent<U>::type*, |
| typename conditional<is_function<U>::value, typename add_pointer<U>::type, |
| typename remove_cv<U>::type>::type>::type type; |
| }; |
| |
| template <bool B, class T = void> |
| struct enable_if {}; |
| |
| template <class T> |
| struct enable_if<true, T> { |
| typedef T type; |
| }; |
| |
| template <bool B, class T = void> |
| using enable_if_t = typename enable_if<B, T>::type; |
| |
| template <class T, class U> |
| struct is_same : false_type {}; |
| |
| template <class T> |
| struct is_same<T, T> : true_type {}; |
| |
| template <class T> |
| struct is_void : is_same<void, typename remove_cv<T>::type> {}; |
| |
| namespace detail { |
| |
| template <class T> |
| auto try_add_lvalue_reference(int) -> type_identity<T&>; |
| template <class T> |
| auto try_add_lvalue_reference(...) -> type_identity<T>; |
| |
| template <class T> |
| auto try_add_rvalue_reference(int) -> type_identity<T&&>; |
| template <class T> |
| auto try_add_rvalue_reference(...) -> type_identity<T>; |
| |
| } // namespace detail |
| |
| template <class T> |
| struct add_lvalue_reference : decltype(detail::try_add_lvalue_reference<T>(0)) { |
| }; |
| |
| template <class T> |
| struct add_rvalue_reference : decltype(detail::try_add_rvalue_reference<T>(0)) { |
| }; |
| |
| template <class T> |
| typename add_rvalue_reference<T>::type declval() noexcept; |
| |
| namespace detail { |
| |
| template <class T> |
| auto test_returnable(int) |
| -> decltype(void(static_cast<T (*)()>(nullptr)), true_type{}); |
| template <class> |
| auto test_returnable(...) -> false_type; |
| |
| template <class From, class To> |
| auto test_implicitly_convertible(int) |
| -> decltype(void(declval<void (&)(To)>()(declval<From>())), true_type{}); |
| template <class, class> |
| auto test_implicitly_convertible(...) -> false_type; |
| |
| } // namespace detail |
| |
| template <class From, class To> |
| struct is_convertible |
| : integral_constant<bool, |
| (decltype(detail::test_returnable<To>(0))::value && |
| decltype(detail::test_implicitly_convertible<From, To>( |
| 0))::value) || |
| (is_void<From>::value && is_void<To>::value)> {}; |
| |
| template <class From, class To> |
| inline constexpr bool is_convertible_v = is_convertible<From, To>::value; |
| |
| template <class...> |
| using void_t = void; |
| |
| template <class, class T, class... Args> |
| struct is_constructible_ : false_type {}; |
| |
| template <class T, class... Args> |
| struct is_constructible_<void_t<decltype(T(declval<Args>()...))>, T, Args...> |
| : true_type {}; |
| |
| template <class T, class... Args> |
| using is_constructible = is_constructible_<void_t<>, T, Args...>; |
| |
| template <class T, class... Args> |
| inline constexpr bool is_constructible_v = is_constructible<T, Args...>::value; |
| |
| template <class _Tp> |
| struct __uncvref { |
| typedef typename remove_cv<typename remove_reference<_Tp>::type>::type type; |
| }; |
| |
| template <class _Tp> |
| using __uncvref_t = typename __uncvref<_Tp>::type; |
| |
| template <bool _Val> |
| using _BoolConstant = integral_constant<bool, _Val>; |
| |
| template <class _Tp, class _Up> |
| using _IsSame = _BoolConstant<__is_same(_Tp, _Up)>; |
| |
| template <class _Tp, class _Up> |
| using _IsNotSame = _BoolConstant<!__is_same(_Tp, _Up)>; |
| |
| template <bool> |
| struct _MetaBase; |
| template <> |
| struct _MetaBase<true> { |
| template <class _Tp, class _Up> |
| using _SelectImpl = _Tp; |
| template <template <class...> class _FirstFn, template <class...> class, |
| class... _Args> |
| using _SelectApplyImpl = _FirstFn<_Args...>; |
| template <class _First, class...> |
| using _FirstImpl = _First; |
| template <class, class _Second, class...> |
| using _SecondImpl = _Second; |
| template <class _Result, class _First, class... _Rest> |
| using _OrImpl = |
| typename _MetaBase<_First::value != true && sizeof...(_Rest) != 0>:: |
| template _OrImpl<_First, _Rest...>; |
| }; |
| |
| template <> |
| struct _MetaBase<false> { |
| template <class _Tp, class _Up> |
| using _SelectImpl = _Up; |
| template <template <class...> class, template <class...> class _SecondFn, |
| class... _Args> |
| using _SelectApplyImpl = _SecondFn<_Args...>; |
| template <class _Result, class...> |
| using _OrImpl = _Result; |
| }; |
| |
| template <bool _Cond, class _IfRes, class _ElseRes> |
| using _If = typename _MetaBase<_Cond>::template _SelectImpl<_IfRes, _ElseRes>; |
| |
| template <class... _Rest> |
| using _Or = typename _MetaBase<sizeof...(_Rest) != |
| 0>::template _OrImpl<false_type, _Rest...>; |
| |
| template <bool _Bp, class _Tp = void> |
| using __enable_if_t = typename enable_if<_Bp, _Tp>::type; |
| |
| template <class...> |
| using __expand_to_true = true_type; |
| template <class... _Pred> |
| __expand_to_true<__enable_if_t<_Pred::value>...> __and_helper(int); |
| template <class...> |
| false_type __and_helper(...); |
| template <class... _Pred> |
| using _And = decltype(__and_helper<_Pred...>(0)); |
| |
| template <class _Pred> |
| struct _Not : _BoolConstant<!_Pred::value> {}; |
| |
| struct __check_tuple_constructor_fail { |
| static constexpr bool __enable_explicit_default() { return false; } |
| static constexpr bool __enable_implicit_default() { return false; } |
| template <class...> |
| static constexpr bool __enable_explicit() { |
| return false; |
| } |
| template <class...> |
| static constexpr bool __enable_implicit() { |
| return false; |
| } |
| }; |
| |
| template <typename, typename _Tp> |
| struct __select_2nd { |
| typedef _Tp type; |
| }; |
| template <class _Tp, class _Arg> |
| typename __select_2nd<decltype((declval<_Tp>() = declval<_Arg>())), |
| true_type>::type |
| __is_assignable_test(int); |
| template <class, class> |
| false_type __is_assignable_test(...); |
| template <class _Tp, class _Arg, |
| bool = is_void<_Tp>::value || is_void<_Arg>::value> |
| struct __is_assignable_imp |
| : public decltype((__is_assignable_test<_Tp, _Arg>(0))) {}; |
| template <class _Tp, class _Arg> |
| struct __is_assignable_imp<_Tp, _Arg, true> : public false_type {}; |
| template <class _Tp, class _Arg> |
| struct is_assignable : public __is_assignable_imp<_Tp, _Arg> {}; |
| |
| template <class _Tp> |
| struct __libcpp_is_integral : public false_type {}; |
| template <> |
| struct __libcpp_is_integral<bool> : public true_type {}; |
| template <> |
| struct __libcpp_is_integral<char> : public true_type {}; |
| template <> |
| struct __libcpp_is_integral<signed char> : public true_type {}; |
| template <> |
| struct __libcpp_is_integral<unsigned char> : public true_type {}; |
| template <> |
| struct __libcpp_is_integral<wchar_t> : public true_type {}; |
| template <> |
| struct __libcpp_is_integral<short> : public true_type {}; // NOLINT |
| template <> |
| struct __libcpp_is_integral<unsigned short> : public true_type {}; // NOLINT |
| template <> |
| struct __libcpp_is_integral<int> : public true_type {}; |
| template <> |
| struct __libcpp_is_integral<unsigned int> : public true_type {}; |
| template <> |
| struct __libcpp_is_integral<long> : public true_type {}; // NOLINT |
| template <> |
| struct __libcpp_is_integral<unsigned long> : public true_type {}; // NOLINT |
| template <> |
| struct __libcpp_is_integral<long long> : public true_type {}; // NOLINT |
| template <> // NOLINTNEXTLINE |
| struct __libcpp_is_integral<unsigned long long> : public true_type {}; |
| template <class _Tp> |
| struct is_integral |
| : public __libcpp_is_integral<typename remove_cv<_Tp>::type> {}; |
| |
| template <class _Tp> |
| struct __libcpp_is_floating_point : public false_type {}; |
| template <> |
| struct __libcpp_is_floating_point<float> : public true_type {}; |
| template <> |
| struct __libcpp_is_floating_point<double> : public true_type {}; |
| template <> |
| struct __libcpp_is_floating_point<long double> : public true_type {}; |
| template <class _Tp> |
| struct is_floating_point |
| : public __libcpp_is_floating_point<typename remove_cv<_Tp>::type> {}; |
| |
| template <class _Tp> |
| struct is_arithmetic |
| : public integral_constant<bool, is_integral<_Tp>::value || |
| is_floating_point<_Tp>::value> {}; |
| |
| template <class _Tp> |
| struct __libcpp_is_pointer : public false_type {}; |
| template <class _Tp> |
| struct __libcpp_is_pointer<_Tp*> : public true_type {}; |
| template <class _Tp> |
| struct is_pointer : public __libcpp_is_pointer<typename remove_cv<_Tp>::type> { |
| }; |
| |
| template <class _Tp> |
| struct __libcpp_is_member_pointer : public false_type {}; |
| template <class _Tp, class _Up> |
| struct __libcpp_is_member_pointer<_Tp _Up::*> : public true_type {}; |
| template <class _Tp> |
| struct is_member_pointer |
| : public __libcpp_is_member_pointer<typename remove_cv<_Tp>::type> {}; |
| |
| template <class _Tp> |
| struct __libcpp_union : public false_type {}; |
| template <class _Tp> |
| struct is_union : public __libcpp_union<typename remove_cv<_Tp>::type> {}; |
| |
| template <class T> |
| struct is_reference : false_type {}; |
| template <class T> |
| struct is_reference<T&> : true_type {}; |
| template <class T> |
| struct is_reference<T&&> : true_type {}; |
| |
| template <class T> |
| inline constexpr bool is_reference_v = is_reference<T>::value; |
| |
| struct __two { |
| char __lx[2]; |
| }; |
| |
| namespace __is_class_imp { |
| template <class _Tp> |
| char __test(int _Tp::*); |
| template <class _Tp> |
| __two __test(...); |
| } // namespace __is_class_imp |
| template <class _Tp> |
| struct is_class |
| : public integral_constant<bool, |
| sizeof(__is_class_imp::__test<_Tp>(0)) == 1 && |
| !is_union<_Tp>::value> {}; |
| |
| template <class _Tp> |
| struct __is_nullptr_t_impl : public false_type {}; |
| template <> |
| struct __is_nullptr_t_impl<nullptr_t> : public true_type {}; |
| template <class _Tp> |
| struct __is_nullptr_t |
| : public __is_nullptr_t_impl<typename remove_cv<_Tp>::type> {}; |
| template <class _Tp> |
| struct is_null_pointer |
| : public __is_nullptr_t_impl<typename remove_cv<_Tp>::type> {}; |
| |
| template <class _Tp> |
| struct is_enum |
| : public integral_constant< |
| bool, !is_void<_Tp>::value && !is_integral<_Tp>::value && |
| !is_floating_point<_Tp>::value && !is_array<_Tp>::value && |
| !is_pointer<_Tp>::value && !is_reference<_Tp>::value && |
| !is_member_pointer<_Tp>::value && !is_union<_Tp>::value && |
| !is_class<_Tp>::value && !is_function<_Tp>::value> {}; |
| |
| template <class _Tp> |
| struct is_scalar |
| : public integral_constant< |
| bool, is_arithmetic<_Tp>::value || is_member_pointer<_Tp>::value || |
| is_pointer<_Tp>::value || __is_nullptr_t<_Tp>::value || |
| is_enum<_Tp>::value> {}; |
| template <> |
| struct is_scalar<nullptr_t> : public true_type {}; |
| |
| struct in_place_t {}; |
| |
| constexpr in_place_t in_place; |
| |
| } // namespace std |
| |
| #endif // STD_TYPE_TRAITS_H |
| )"; |
| |
| static constexpr char AbslTypeTraitsHeader[] = R"( |
| #ifndef ABSL_TYPE_TRAITS_H |
| #define ABSL_TYPE_TRAITS_H |
| |
| #include "std_type_traits.h" |
| |
| namespace absl { |
| |
| template <typename... Ts> |
| struct conjunction : std::true_type {}; |
| |
| template <typename T, typename... Ts> |
| struct conjunction<T, Ts...> |
| : std::conditional<T::value, conjunction<Ts...>, T>::type {}; |
| |
| template <typename T> |
| struct conjunction<T> : T {}; |
| |
| template <typename... Ts> |
| struct disjunction : std::false_type {}; |
| |
| template <typename T, typename... Ts> |
| struct disjunction<T, Ts...> |
| : std::conditional<T::value, T, disjunction<Ts...>>::type {}; |
| |
| template <typename T> |
| struct disjunction<T> : T {}; |
| |
| template <typename T> |
| struct negation : std::integral_constant<bool, !T::value> {}; |
| |
| template <bool B, typename T = void> |
| using enable_if_t = typename std::enable_if<B, T>::type; |
| |
| |
| template <bool B, typename T, typename F> |
| using conditional_t = typename std::conditional<B, T, F>::type; |
| |
| template <typename T> |
| using remove_cv_t = typename std::remove_cv<T>::type; |
| |
| template <typename T> |
| using remove_reference_t = typename std::remove_reference<T>::type; |
| |
| template <typename T> |
| using decay_t = typename std::decay<T>::type; |
| |
| using std::in_place; |
| using std::in_place_t; |
| } // namespace absl |
| |
| #endif // ABSL_TYPE_TRAITS_H |
| )"; |
| |
| static constexpr char StdStringHeader[] = R"( |
| #ifndef STRING_H |
| #define STRING_H |
| |
| namespace std { |
| |
| struct string { |
| string(const char*); |
| ~string(); |
| const char *c_str() const; |
| bool empty(); |
| }; |
| |
| struct string_view { |
| string_view(const char*); |
| ~string_view(); |
| bool empty(); |
| }; |
| |
| bool operator!=(const string &LHS, const char *RHS); |
| |
| } // namespace std |
| |
| #endif // STRING_H |
| )"; |
| |
| static constexpr char StdUtilityHeader[] = R"( |
| #ifndef UTILITY_H |
| #define UTILITY_H |
| |
| #include "std_type_traits.h" |
| |
| namespace std { |
| |
| template <typename T> |
| constexpr remove_reference_t<T>&& move(T&& x); |
| |
| template <typename T> |
| void swap(T& a, T& b) noexcept; |
| |
| } // namespace std |
| |
| #endif // UTILITY_H |
| )"; |
| |
| static constexpr char StdInitializerListHeader[] = R"( |
| #ifndef INITIALIZER_LIST_H |
| #define INITIALIZER_LIST_H |
| |
| namespace std { |
| |
| template <typename T> |
| class initializer_list { |
| public: |
| const T *a, *b; |
| initializer_list() noexcept; |
| }; |
| |
| } // namespace std |
| |
| #endif // INITIALIZER_LIST_H |
| )"; |
| |
| static constexpr char StdOptionalHeader[] = R"( |
| #include "std_initializer_list.h" |
| #include "std_type_traits.h" |
| #include "std_utility.h" |
| |
| namespace std { |
| |
| struct nullopt_t { |
| constexpr explicit nullopt_t() {} |
| }; |
| constexpr nullopt_t nullopt; |
| |
| template <class _Tp> |
| struct __optional_destruct_base { |
| constexpr void reset() noexcept; |
| }; |
| |
| template <class _Tp> |
| struct __optional_storage_base : __optional_destruct_base<_Tp> { |
| constexpr bool has_value() const noexcept; |
| }; |
| |
| template <typename _Tp> |
| class optional : private __optional_storage_base<_Tp> { |
| using __base = __optional_storage_base<_Tp>; |
| |
| public: |
| using value_type = _Tp; |
| |
| private: |
| struct _CheckOptionalArgsConstructor { |
| template <class _Up> |
| static constexpr bool __enable_implicit() { |
| return is_constructible_v<_Tp, _Up&&> && is_convertible_v<_Up&&, _Tp>; |
| } |
| |
| template <class _Up> |
| static constexpr bool __enable_explicit() { |
| return is_constructible_v<_Tp, _Up&&> && !is_convertible_v<_Up&&, _Tp>; |
| } |
| }; |
| template <class _Up> |
| using _CheckOptionalArgsCtor = |
| _If<_IsNotSame<__uncvref_t<_Up>, in_place_t>::value && |
| _IsNotSame<__uncvref_t<_Up>, optional>::value, |
| _CheckOptionalArgsConstructor, __check_tuple_constructor_fail>; |
| template <class _QualUp> |
| struct _CheckOptionalLikeConstructor { |
| template <class _Up, class _Opt = optional<_Up>> |
| using __check_constructible_from_opt = |
| _Or<is_constructible<_Tp, _Opt&>, is_constructible<_Tp, _Opt const&>, |
| is_constructible<_Tp, _Opt&&>, is_constructible<_Tp, _Opt const&&>, |
| is_convertible<_Opt&, _Tp>, is_convertible<_Opt const&, _Tp>, |
| is_convertible<_Opt&&, _Tp>, is_convertible<_Opt const&&, _Tp>>; |
| template <class _Up, class _QUp = _QualUp> |
| static constexpr bool __enable_implicit() { |
| return is_convertible<_QUp, _Tp>::value && |
| !__check_constructible_from_opt<_Up>::value; |
| } |
| template <class _Up, class _QUp = _QualUp> |
| static constexpr bool __enable_explicit() { |
| return !is_convertible<_QUp, _Tp>::value && |
| !__check_constructible_from_opt<_Up>::value; |
| } |
| }; |
| |
| template <class _Up, class _QualUp> |
| using _CheckOptionalLikeCtor = |
| _If<_And<_IsNotSame<_Up, _Tp>, is_constructible<_Tp, _QualUp>>::value, |
| _CheckOptionalLikeConstructor<_QualUp>, |
| __check_tuple_constructor_fail>; |
| |
| |
| template <class _Up, class _QualUp> |
| using _CheckOptionalLikeAssign = _If< |
| _And< |
| _IsNotSame<_Up, _Tp>, |
| is_constructible<_Tp, _QualUp>, |
| is_assignable<_Tp&, _QualUp> |
| >::value, |
| _CheckOptionalLikeConstructor<_QualUp>, |
| __check_tuple_constructor_fail |
| >; |
| |
| public: |
| constexpr optional() noexcept {} |
| constexpr optional(const optional&) = default; |
| constexpr optional(optional&&) = default; |
| constexpr optional(nullopt_t) noexcept {} |
| |
| template < |
| class _InPlaceT, class... _Args, |
| class = enable_if_t<_And<_IsSame<_InPlaceT, in_place_t>, |
| is_constructible<value_type, _Args...>>::value>> |
| constexpr explicit optional(_InPlaceT, _Args&&... __args); |
| |
| template <class _Up, class... _Args, |
| class = enable_if_t<is_constructible_v< |
| value_type, initializer_list<_Up>&, _Args...>>> |
| constexpr explicit optional(in_place_t, initializer_list<_Up> __il, |
| _Args&&... __args); |
| |
| template < |
| class _Up = value_type, |
| enable_if_t<_CheckOptionalArgsCtor<_Up>::template __enable_implicit<_Up>(), |
| int> = 0> |
| constexpr optional(_Up&& __v); |
| |
| template < |
| class _Up, |
| enable_if_t<_CheckOptionalArgsCtor<_Up>::template __enable_explicit<_Up>(), |
| int> = 0> |
| constexpr explicit optional(_Up&& __v); |
| |
| template <class _Up, enable_if_t<_CheckOptionalLikeCtor<_Up, _Up const&>:: |
| template __enable_implicit<_Up>(), |
| int> = 0> |
| constexpr optional(const optional<_Up>& __v); |
| |
| template <class _Up, enable_if_t<_CheckOptionalLikeCtor<_Up, _Up const&>:: |
| template __enable_explicit<_Up>(), |
| int> = 0> |
| constexpr explicit optional(const optional<_Up>& __v); |
| |
| template <class _Up, enable_if_t<_CheckOptionalLikeCtor<_Up, _Up&&>:: |
| template __enable_implicit<_Up>(), |
| int> = 0> |
| constexpr optional(optional<_Up>&& __v); |
| |
| template <class _Up, enable_if_t<_CheckOptionalLikeCtor<_Up, _Up&&>:: |
| template __enable_explicit<_Up>(), |
| int> = 0> |
| constexpr explicit optional(optional<_Up>&& __v); |
| |
| constexpr optional& operator=(nullopt_t) noexcept; |
| |
| optional& operator=(const optional&); |
| |
| optional& operator=(optional&&); |
| |
| template <class _Up = value_type, |
| class = enable_if_t<_And<_IsNotSame<__uncvref_t<_Up>, optional>, |
| _Or<_IsNotSame<__uncvref_t<_Up>, value_type>, |
| _Not<is_scalar<value_type>>>, |
| is_constructible<value_type, _Up>, |
| is_assignable<value_type&, _Up>>::value>> |
| constexpr optional& operator=(_Up&& __v); |
| |
| template <class _Up, enable_if_t<_CheckOptionalLikeAssign<_Up, _Up const&>:: |
| template __enable_assign<_Up>(), |
| int> = 0> |
| constexpr optional& operator=(const optional<_Up>& __v); |
| |
| template <class _Up, enable_if_t<_CheckOptionalLikeCtor<_Up, _Up&&>:: |
| template __enable_assign<_Up>(), |
| int> = 0> |
| constexpr optional& operator=(optional<_Up>&& __v); |
| |
| const _Tp& operator*() const&; |
| _Tp& operator*() &; |
| const _Tp&& operator*() const&&; |
| _Tp&& operator*() &&; |
| |
| const _Tp* operator->() const; |
| _Tp* operator->(); |
| |
| const _Tp& value() const&; |
| _Tp& value() &; |
| const _Tp&& value() const&&; |
| _Tp&& value() &&; |
| |
| template <typename U> |
| constexpr _Tp value_or(U&& v) const&; |
| template <typename U> |
| _Tp value_or(U&& v) &&; |
| |
| template <typename... Args> |
| _Tp& emplace(Args&&... args); |
| |
| template <typename U, typename... Args> |
| _Tp& emplace(std::initializer_list<U> ilist, Args&&... args); |
| |
| using __base::reset; |
| |
| constexpr explicit operator bool() const noexcept; |
| using __base::has_value; |
| |
| constexpr void swap(optional& __opt) noexcept; |
| }; |
| |
| template <typename T> |
| constexpr optional<typename std::decay<T>::type> make_optional(T&& v); |
| |
| template <typename T, typename... Args> |
| constexpr optional<T> make_optional(Args&&... args); |
| |
| template <typename T, typename U, typename... Args> |
| constexpr optional<T> make_optional(std::initializer_list<U> il, |
| Args&&... args); |
| |
| template <typename T, typename U> |
| constexpr bool operator==(const optional<T> &lhs, const optional<U> &rhs); |
| template <typename T, typename U> |
| constexpr bool operator!=(const optional<T> &lhs, const optional<U> &rhs); |
| |
| template <typename T> |
| constexpr bool operator==(const optional<T> &opt, nullopt_t); |
| |
| // C++20 and later do not define the following overloads because they are |
| // provided by rewritten candidates instead. |
| #if __cplusplus < 202002L |
| template <typename T> |
| constexpr bool operator==(nullopt_t, const optional<T> &opt); |
| template <typename T> |
| constexpr bool operator!=(const optional<T> &opt, nullopt_t); |
| template <typename T> |
| constexpr bool operator!=(nullopt_t, const optional<T> &opt); |
| #endif // __cplusplus < 202002L |
| |
| template <typename T, typename U> |
| constexpr bool operator==(const optional<T> &opt, const U &value); |
| template <typename T, typename U> |
| constexpr bool operator==(const T &value, const optional<U> &opt); |
| template <typename T, typename U> |
| constexpr bool operator!=(const optional<T> &opt, const U &value); |
| template <typename T, typename U> |
| constexpr bool operator!=(const T &value, const optional<U> &opt); |
| |
| } // namespace std |
| )"; |
| |
| static constexpr char AbslOptionalHeader[] = R"( |
| #include "absl_type_traits.h" |
| #include "std_initializer_list.h" |
| #include "std_type_traits.h" |
| #include "std_utility.h" |
| |
| namespace absl { |
| |
| struct nullopt_t { |
| constexpr explicit nullopt_t() {} |
| }; |
| constexpr nullopt_t nullopt; |
| |
| template <typename T> |
| class optional; |
| |
| namespace optional_internal { |
| |
| template <typename T, typename U> |
| struct is_constructible_convertible_from_optional |
| : std::integral_constant< |
| bool, std::is_constructible<T, optional<U>&>::value || |
| std::is_constructible<T, optional<U>&&>::value || |
| std::is_constructible<T, const optional<U>&>::value || |
| std::is_constructible<T, const optional<U>&&>::value || |
| std::is_convertible<optional<U>&, T>::value || |
| std::is_convertible<optional<U>&&, T>::value || |
| std::is_convertible<const optional<U>&, T>::value || |
| std::is_convertible<const optional<U>&&, T>::value> {}; |
| |
| template <typename T, typename U> |
| struct is_constructible_convertible_assignable_from_optional |
| : std::integral_constant< |
| bool, is_constructible_convertible_from_optional<T, U>::value || |
| std::is_assignable<T&, optional<U>&>::value || |
| std::is_assignable<T&, optional<U>&&>::value || |
| std::is_assignable<T&, const optional<U>&>::value || |
| std::is_assignable<T&, const optional<U>&&>::value> {}; |
| |
| } // namespace optional_internal |
| |
| template <typename T> |
| class optional { |
| public: |
| constexpr optional() noexcept; |
| |
| constexpr optional(nullopt_t) noexcept; |
| |
| optional(const optional&) = default; |
| |
| optional(optional&&) = default; |
| |
| template <typename InPlaceT, typename... Args, |
| absl::enable_if_t<absl::conjunction< |
| std::is_same<InPlaceT, in_place_t>, |
| std::is_constructible<T, Args&&...>>::value>* = nullptr> |
| constexpr explicit optional(InPlaceT, Args&&... args); |
| |
| template <typename U, typename... Args, |
| typename = typename std::enable_if<std::is_constructible< |
| T, std::initializer_list<U>&, Args&&...>::value>::type> |
| constexpr explicit optional(in_place_t, std::initializer_list<U> il, |
| Args&&... args); |
| |
| template < |
| typename U = T, |
| typename std::enable_if< |
| absl::conjunction<absl::negation<std::is_same< |
| in_place_t, typename std::decay<U>::type>>, |
| absl::negation<std::is_same< |
| optional<T>, typename std::decay<U>::type>>, |
| std::is_convertible<U&&, T>, |
| std::is_constructible<T, U&&>>::value, |
| bool>::type = false> |
| constexpr optional(U&& v); |
| |
| template < |
| typename U = T, |
| typename std::enable_if< |
| absl::conjunction<absl::negation<std::is_same< |
| in_place_t, typename std::decay<U>::type>>, |
| absl::negation<std::is_same< |
| optional<T>, typename std::decay<U>::type>>, |
| absl::negation<std::is_convertible<U&&, T>>, |
| std::is_constructible<T, U&&>>::value, |
| bool>::type = false> |
| explicit constexpr optional(U&& v); |
| |
| template <typename U, |
| typename std::enable_if< |
| absl::conjunction< |
| absl::negation<std::is_same<T, U>>, |
| std::is_constructible<T, const U&>, |
| absl::negation< |
| optional_internal:: |
| is_constructible_convertible_from_optional<T, U>>, |
| std::is_convertible<const U&, T>>::value, |
| bool>::type = false> |
| optional(const optional<U>& rhs); |
| |
| template <typename U, |
| typename std::enable_if< |
| absl::conjunction< |
| absl::negation<std::is_same<T, U>>, |
| std::is_constructible<T, const U&>, |
| absl::negation< |
| optional_internal:: |
| is_constructible_convertible_from_optional<T, U>>, |
| absl::negation<std::is_convertible<const U&, T>>>::value, |
| bool>::type = false> |
| explicit optional(const optional<U>& rhs); |
| |
| template < |
| typename U, |
| typename std::enable_if< |
| absl::conjunction< |
| absl::negation<std::is_same<T, U>>, std::is_constructible<T, U&&>, |
| absl::negation< |
| optional_internal::is_constructible_convertible_from_optional< |
| T, U>>, |
| std::is_convertible<U&&, T>>::value, |
| bool>::type = false> |
| optional(optional<U>&& rhs); |
| |
| template < |
| typename U, |
| typename std::enable_if< |
| absl::conjunction< |
| absl::negation<std::is_same<T, U>>, std::is_constructible<T, U&&>, |
| absl::negation< |
| optional_internal::is_constructible_convertible_from_optional< |
| T, U>>, |
| absl::negation<std::is_convertible<U&&, T>>>::value, |
| bool>::type = false> |
| explicit optional(optional<U>&& rhs); |
| |
| optional& operator=(nullopt_t) noexcept; |
| |
| optional& operator=(const optional& src); |
| |
| optional& operator=(optional&& src); |
| |
| template < |
| typename U = T, |
| typename = typename std::enable_if<absl::conjunction< |
| absl::negation< |
| std::is_same<optional<T>, typename std::decay<U>::type>>, |
| absl::negation< |
| absl::conjunction<std::is_scalar<T>, |
| std::is_same<T, typename std::decay<U>::type>>>, |
| std::is_constructible<T, U>, std::is_assignable<T&, U>>::value>::type> |
| optional& operator=(U&& v); |
| |
| template < |
| typename U, |
| typename = typename std::enable_if<absl::conjunction< |
| absl::negation<std::is_same<T, U>>, |
| std::is_constructible<T, const U&>, std::is_assignable<T&, const U&>, |
| absl::negation< |
| optional_internal:: |
| is_constructible_convertible_assignable_from_optional< |
| T, U>>>::value>::type> |
| optional& operator=(const optional<U>& rhs); |
| |
| template <typename U, |
| typename = typename std::enable_if<absl::conjunction< |
| absl::negation<std::is_same<T, U>>, std::is_constructible<T, U>, |
| std::is_assignable<T&, U>, |
| absl::negation< |
| optional_internal:: |
| is_constructible_convertible_assignable_from_optional< |
| T, U>>>::value>::type> |
| optional& operator=(optional<U>&& rhs); |
| |
| const T& operator*() const&; |
| T& operator*() &; |
| const T&& operator*() const&&; |
| T&& operator*() &&; |
| |
| const T* operator->() const; |
| T* operator->(); |
| |
| const T& value() const&; |
| T& value() &; |
| const T&& value() const&&; |
| T&& value() &&; |
| |
| template <typename U> |
| constexpr T value_or(U&& v) const&; |
| template <typename U> |
| T value_or(U&& v) &&; |
| |
| template <typename... Args> |
| T& emplace(Args&&... args); |
| |
| template <typename U, typename... Args> |
| T& emplace(std::initializer_list<U> ilist, Args&&... args); |
| |
| void reset() noexcept; |
| |
| constexpr explicit operator bool() const noexcept; |
| constexpr bool has_value() const noexcept; |
| |
| void swap(optional& rhs) noexcept; |
| }; |
| |
| template <typename T> |
| constexpr optional<typename std::decay<T>::type> make_optional(T&& v); |
| |
| template <typename T, typename... Args> |
| constexpr optional<T> make_optional(Args&&... args); |
| |
| template <typename T, typename U, typename... Args> |
| constexpr optional<T> make_optional(std::initializer_list<U> il, |
| Args&&... args); |
| |
| template <typename T, typename U> |
| constexpr bool operator==(const optional<T> &lhs, const optional<U> &rhs); |
| template <typename T, typename U> |
| constexpr bool operator!=(const optional<T> &lhs, const optional<U> &rhs); |
| |
| template <typename T> |
| constexpr bool operator==(const optional<T> &opt, nullopt_t); |
| template <typename T> |
| constexpr bool operator==(nullopt_t, const optional<T> &opt); |
| template <typename T> |
| constexpr bool operator!=(const optional<T> &opt, nullopt_t); |
| template <typename T> |
| constexpr bool operator!=(nullopt_t, const optional<T> &opt); |
| |
| template <typename T, typename U> |
| constexpr bool operator==(const optional<T> &opt, const U &value); |
| template <typename T, typename U> |
| constexpr bool operator==(const T &value, const optional<U> &opt); |
| template <typename T, typename U> |
| constexpr bool operator!=(const optional<T> &opt, const U &value); |
| template <typename T, typename U> |
| constexpr bool operator!=(const T &value, const optional<U> &opt); |
| |
| } // namespace absl |
| )"; |
| |
| static constexpr char BaseOptionalHeader[] = R"( |
| #include "std_initializer_list.h" |
| #include "std_type_traits.h" |
| #include "std_utility.h" |
| |
| namespace base { |
| |
| struct in_place_t {}; |
| constexpr in_place_t in_place; |
| |
| struct nullopt_t { |
| constexpr explicit nullopt_t() {} |
| }; |
| constexpr nullopt_t nullopt; |
| |
| template <typename T> |
| class Optional; |
| |
| namespace internal { |
| |
| template <typename T> |
| using RemoveCvRefT = std::remove_cv_t<std::remove_reference_t<T>>; |
| |
| template <typename T, typename U> |
| struct IsConvertibleFromOptional |
| : std::integral_constant< |
| bool, std::is_constructible<T, Optional<U>&>::value || |
| std::is_constructible<T, const Optional<U>&>::value || |
| std::is_constructible<T, Optional<U>&&>::value || |
| std::is_constructible<T, const Optional<U>&&>::value || |
| std::is_convertible<Optional<U>&, T>::value || |
| std::is_convertible<const Optional<U>&, T>::value || |
| std::is_convertible<Optional<U>&&, T>::value || |
| std::is_convertible<const Optional<U>&&, T>::value> {}; |
| |
| template <typename T, typename U> |
| struct IsAssignableFromOptional |
| : std::integral_constant< |
| bool, IsConvertibleFromOptional<T, U>::value || |
| std::is_assignable<T&, Optional<U>&>::value || |
| std::is_assignable<T&, const Optional<U>&>::value || |
| std::is_assignable<T&, Optional<U>&&>::value || |
| std::is_assignable<T&, const Optional<U>&&>::value> {}; |
| |
| } // namespace internal |
| |
| template <typename T> |
| class Optional { |
| public: |
| using value_type = T; |
| |
| constexpr Optional() = default; |
| constexpr Optional(const Optional& other) noexcept = default; |
| constexpr Optional(Optional&& other) noexcept = default; |
| |
| constexpr Optional(nullopt_t); |
| |
| template <typename U, |
| typename std::enable_if< |
| std::is_constructible<T, const U&>::value && |
| !internal::IsConvertibleFromOptional<T, U>::value && |
| std::is_convertible<const U&, T>::value, |
| bool>::type = false> |
| Optional(const Optional<U>& other) noexcept; |
| |
| template <typename U, |
| typename std::enable_if< |
| std::is_constructible<T, const U&>::value && |
| !internal::IsConvertibleFromOptional<T, U>::value && |
| !std::is_convertible<const U&, T>::value, |
| bool>::type = false> |
| explicit Optional(const Optional<U>& other) noexcept; |
| |
| template <typename U, |
| typename std::enable_if< |
| std::is_constructible<T, U&&>::value && |
| !internal::IsConvertibleFromOptional<T, U>::value && |
| std::is_convertible<U&&, T>::value, |
| bool>::type = false> |
| Optional(Optional<U>&& other) noexcept; |
| |
| template <typename U, |
| typename std::enable_if< |
| std::is_constructible<T, U&&>::value && |
| !internal::IsConvertibleFromOptional<T, U>::value && |
| !std::is_convertible<U&&, T>::value, |
| bool>::type = false> |
| explicit Optional(Optional<U>&& other) noexcept; |
| |
| template <class... Args> |
| constexpr explicit Optional(in_place_t, Args&&... args); |
| |
| template <class U, class... Args, |
| class = typename std::enable_if<std::is_constructible< |
| value_type, std::initializer_list<U>&, Args...>::value>::type> |
| constexpr explicit Optional(in_place_t, std::initializer_list<U> il, |
| Args&&... args); |
| |
| template < |
| typename U = value_type, |
| typename std::enable_if< |
| std::is_constructible<T, U&&>::value && |
| !std::is_same<internal::RemoveCvRefT<U>, in_place_t>::value && |
| !std::is_same<internal::RemoveCvRefT<U>, Optional<T>>::value && |
| std::is_convertible<U&&, T>::value, |
| bool>::type = false> |
| constexpr Optional(U&& value); |
| |
| template < |
| typename U = value_type, |
| typename std::enable_if< |
| std::is_constructible<T, U&&>::value && |
| !std::is_same<internal::RemoveCvRefT<U>, in_place_t>::value && |
| !std::is_same<internal::RemoveCvRefT<U>, Optional<T>>::value && |
| !std::is_convertible<U&&, T>::value, |
| bool>::type = false> |
| constexpr explicit Optional(U&& value); |
| |
| Optional& operator=(const Optional& other) noexcept; |
| |
| Optional& operator=(Optional&& other) noexcept; |
| |
| Optional& operator=(nullopt_t); |
| |
| template <typename U> |
| typename std::enable_if< |
| !std::is_same<internal::RemoveCvRefT<U>, Optional<T>>::value && |
| std::is_constructible<T, U>::value && |
| std::is_assignable<T&, U>::value && |
| (!std::is_scalar<T>::value || |
| !std::is_same<typename std::decay<U>::type, T>::value), |
| Optional&>::type |
| operator=(U&& value) noexcept; |
| |
| template <typename U> |
| typename std::enable_if<!internal::IsAssignableFromOptional<T, U>::value && |
| std::is_constructible<T, const U&>::value && |
| std::is_assignable<T&, const U&>::value, |
| Optional&>::type |
| operator=(const Optional<U>& other) noexcept; |
| |
| template <typename U> |
| typename std::enable_if<!internal::IsAssignableFromOptional<T, U>::value && |
| std::is_constructible<T, U>::value && |
| std::is_assignable<T&, U>::value, |
| Optional&>::type |
| operator=(Optional<U>&& other) noexcept; |
| |
| const T& operator*() const&; |
| T& operator*() &; |
| const T&& operator*() const&&; |
| T&& operator*() &&; |
| |
| const T* operator->() const; |
| T* operator->(); |
| |
| const T& value() const&; |
| T& value() &; |
| const T&& value() const&&; |
| T&& value() &&; |
| |
| template <typename U> |
| constexpr T value_or(U&& v) const&; |
| template <typename U> |
| T value_or(U&& v) &&; |
| |
| template <typename... Args> |
| T& emplace(Args&&... args); |
| |
| template <typename U, typename... Args> |
| T& emplace(std::initializer_list<U> ilist, Args&&... args); |
| |
| void reset() noexcept; |
| |
| constexpr explicit operator bool() const noexcept; |
| constexpr bool has_value() const noexcept; |
| |
| void swap(Optional& other); |
| }; |
| |
| template <typename T> |
| constexpr Optional<typename std::decay<T>::type> make_optional(T&& v); |
| |
| template <typename T, typename... Args> |
| constexpr Optional<T> make_optional(Args&&... args); |
| |
| template <typename T, typename U, typename... Args> |
| constexpr Optional<T> make_optional(std::initializer_list<U> il, |
| Args&&... args); |
| |
| template <typename T, typename U> |
| constexpr bool operator==(const Optional<T> &lhs, const Optional<U> &rhs); |
| template <typename T, typename U> |
| constexpr bool operator!=(const Optional<T> &lhs, const Optional<U> &rhs); |
| |
| template <typename T> |
| constexpr bool operator==(const Optional<T> &opt, nullopt_t); |
| template <typename T> |
| constexpr bool operator==(nullopt_t, const Optional<T> &opt); |
| template <typename T> |
| constexpr bool operator!=(const Optional<T> &opt, nullopt_t); |
| template <typename T> |
| constexpr bool operator!=(nullopt_t, const Optional<T> &opt); |
| |
| template <typename T, typename U> |
| constexpr bool operator==(const Optional<T> &opt, const U &value); |
| template <typename T, typename U> |
| constexpr bool operator==(const T &value, const Optional<U> &opt); |
| template <typename T, typename U> |
| constexpr bool operator!=(const Optional<T> &opt, const U &value); |
| template <typename T, typename U> |
| constexpr bool operator!=(const T &value, const Optional<U> &opt); |
| |
| } // namespace base |
| )"; |
| |
| constexpr const char StatusDefsHeader[] = |
| R"cc( |
| #ifndef STATUS_H_ |
| #define STATUS_H_ |
| |
| #include "absl_type_traits.h" |
| #include "std_initializer_list.h" |
| #include "std_string.h" |
| #include "std_type_traits.h" |
| #include "std_utility.h" |
| |
| namespace absl { |
| struct SourceLocation { |
| static constexpr SourceLocation current(); |
| static constexpr SourceLocation |
| DoNotInvokeDirectlyNoSeriouslyDont(int line, const char *file_name); |
| }; |
| } // namespace absl |
| namespace absl { |
| enum class StatusCode : int { |
| kOk, |
| kCancelled, |
| kUnknown, |
| kInvalidArgument, |
| kDeadlineExceeded, |
| kNotFound, |
| kAlreadyExists, |
| kPermissionDenied, |
| kResourceExhausted, |
| kFailedPrecondition, |
| kAborted, |
| kOutOfRange, |
| kUnimplemented, |
| kInternal, |
| kUnavailable, |
| kDataLoss, |
| kUnauthenticated, |
| }; |
| } // namespace absl |
| |
| namespace absl { |
| enum class StatusToStringMode : int { |
| kWithNoExtraData = 0, |
| kWithPayload = 1 << 0, |
| kWithSourceLocation = 1 << 1, |
| kWithEverything = ~kWithNoExtraData, |
| kDefault = kWithPayload, |
| }; |
| class Status { |
| public: |
| Status(); |
| template <typename Enum> Status(Enum code, std::string_view msg); |
| Status(absl::StatusCode code, std::string_view msg, |
| absl::SourceLocation loc = SourceLocation::current()); |
| Status(const Status &base_status, absl::SourceLocation loc); |
| Status(Status &&base_status, absl::SourceLocation loc); |
| ~Status() {} |
| |
| Status(const Status &); |
| Status &operator=(const Status &x); |
| |
| Status(Status &&) noexcept; |
| Status &operator=(Status &&); |
| |
| friend bool operator==(const Status &, const Status &); |
| friend bool operator!=(const Status &, const Status &); |
| |
| bool ok() const { return true; } |
| void CheckSuccess() const; |
| void IgnoreError() const; |
| int error_code() const; |
| absl::Status ToCanonical() const; |
| std::string |
| ToString(StatusToStringMode m = StatusToStringMode::kDefault) const; |
| void Update(const Status &new_status); |
| void Update(Status &&new_status); |
| }; |
| |
| bool operator==(const Status &lhs, const Status &rhs); |
| bool operator!=(const Status &lhs, const Status &rhs); |
| |
| Status OkStatus(); |
| Status InvalidArgumentError(const char *); |
| |
| #endif // STATUS_H |
| )cc"; |
| |
| constexpr const char StatusOrDefsHeader[] = R"cc( |
| #ifndef STATUSOR_H_ |
| #define STATUSOR_H_ |
| #include "absl_type_traits.h" |
| #include "status_defs.h" |
| #include "std_initializer_list.h" |
| #include "std_type_traits.h" |
| #include "std_utility.h" |
| |
| template <typename T> struct StatusOr; |
| |
| namespace internal_statusor { |
| |
| template <typename T, typename U, typename = void> |
| struct HasConversionOperatorToStatusOr : std::false_type {}; |
| |
| template <typename T, typename U> |
| void test(char (*)[sizeof(std::declval<U>().operator absl::StatusOr<T>())]); |
| |
| template <typename T, typename U> |
| struct HasConversionOperatorToStatusOr<T, U, decltype(test<T, U>(0))> |
| : std::true_type {}; |
| |
| template <typename T, typename U> |
| using IsConstructibleOrConvertibleFromStatusOr = |
| absl::disjunction<std::is_constructible<T, StatusOr<U> &>, |
| std::is_constructible<T, const StatusOr<U> &>, |
| std::is_constructible<T, StatusOr<U> &&>, |
| std::is_constructible<T, const StatusOr<U> &&>, |
| std::is_convertible<StatusOr<U> &, T>, |
| std::is_convertible<const StatusOr<U> &, T>, |
| std::is_convertible<StatusOr<U> &&, T>, |
| std::is_convertible<const StatusOr<U> &&, T>>; |
| |
| template <typename T, typename U> |
| using IsConstructibleOrConvertibleOrAssignableFromStatusOr = |
| absl::disjunction<IsConstructibleOrConvertibleFromStatusOr<T, U>, |
| std::is_assignable<T &, StatusOr<U> &>, |
| std::is_assignable<T &, const StatusOr<U> &>, |
| std::is_assignable<T &, StatusOr<U> &&>, |
| std::is_assignable<T &, const StatusOr<U> &&>>; |
| |
| template <typename T, typename U> |
| struct IsDirectInitializationAmbiguous |
| : public absl::conditional_t< |
| std::is_same<absl::remove_cv_t<absl::remove_reference_t<U>>, |
| U>::value, |
| std::false_type, |
| IsDirectInitializationAmbiguous< |
| T, absl::remove_cv_t<absl::remove_reference_t<U>>>> {}; |
| |
| template <typename T, typename V> |
| struct IsDirectInitializationAmbiguous<T, absl::StatusOr<V>> |
| : public IsConstructibleOrConvertibleFromStatusOr<T, V> {}; |
| |
| template <typename T, typename U> |
| using IsDirectInitializationValid = absl::disjunction< |
| // Short circuits if T is basically U. |
| std::is_same<T, absl::remove_cv_t<absl::remove_reference_t<U>>>, |
| absl::negation<absl::disjunction< |
| std::is_same<absl::StatusOr<T>, |
| absl::remove_cv_t<absl::remove_reference_t<U>>>, |
| std::is_same<absl::Status, |
| absl::remove_cv_t<absl::remove_reference_t<U>>>, |
| std::is_same<absl::in_place_t, |
| absl::remove_cv_t<absl::remove_reference_t<U>>>, |
| IsDirectInitializationAmbiguous<T, U>>>>; |
| |
| template <typename T, typename U> |
| struct IsForwardingAssignmentAmbiguous |
| : public absl::conditional_t< |
| std::is_same<absl::remove_cv_t<absl::remove_reference_t<U>>, |
| U>::value, |
| std::false_type, |
| IsForwardingAssignmentAmbiguous< |
| T, absl::remove_cv_t<absl::remove_reference_t<U>>>> {}; |
| |
| template <typename T, typename U> |
| struct IsForwardingAssignmentAmbiguous<T, absl::StatusOr<U>> |
| : public IsConstructibleOrConvertibleOrAssignableFromStatusOr<T, U> {}; |
| |
| template <typename T, typename U> |
| using IsForwardingAssignmentValid = absl::disjunction< |
| // Short circuits if T is basically U. |
| std::is_same<T, absl::remove_cv_t<absl::remove_reference_t<U>>>, |
| absl::negation<absl::disjunction< |
| std::is_same<absl::StatusOr<T>, |
| absl::remove_cv_t<absl::remove_reference_t<U>>>, |
| std::is_same<absl::Status, |
| absl::remove_cv_t<absl::remove_reference_t<U>>>, |
| std::is_same<absl::in_place_t, |
| absl::remove_cv_t<absl::remove_reference_t<U>>>, |
| IsForwardingAssignmentAmbiguous<T, U>>>>; |
| |
| template <typename T, typename U> |
| using IsForwardingAssignmentValid = absl::disjunction< |
| // Short circuits if T is basically U. |
| std::is_same<T, absl::remove_cv_t<absl::remove_reference_t<U>>>, |
| absl::negation<absl::disjunction< |
| std::is_same<absl::StatusOr<T>, |
| absl::remove_cv_t<absl::remove_reference_t<U>>>, |
| std::is_same<absl::Status, |
| absl::remove_cv_t<absl::remove_reference_t<U>>>, |
| std::is_same<absl::in_place_t, |
| absl::remove_cv_t<absl::remove_reference_t<U>>>, |
| IsForwardingAssignmentAmbiguous<T, U>>>>; |
| |
| template <typename T> struct OperatorBase { |
| const T &value() const &; |
| T &value() &; |
| const T &&value() const &&; |
| T &&value() &&; |
| |
| const T &operator*() const &; |
| T &operator*() &; |
| const T &&operator*() const &&; |
| T &&operator*() &&; |
| |
| // To test that analyses are okay if there is a use of operator* |
| // within this base class. |
| const T *operator->() const { return __builtin_addressof(**this); } |
| T *operator->() { return __builtin_addressof(**this); } |
| }; |
| |
| } // namespace internal_statusor |
| |
| template <typename T> |
| struct StatusOr : private internal_statusor::OperatorBase<T> { |
| explicit StatusOr(); |
| |
| StatusOr(const StatusOr &) = default; |
| StatusOr &operator=(const StatusOr &) = default; |
| |
| StatusOr(StatusOr &&) = default; |
| StatusOr &operator=(StatusOr &&) = default; |
| |
| template < |
| typename U, |
| absl::enable_if_t< |
| absl::conjunction< |
| absl::negation<std::is_same<T, U>>, |
| std::is_constructible<T, const U &>, |
| std::is_convertible<const U &, T>, |
| absl::negation< |
| internal_statusor::IsConstructibleOrConvertibleFromStatusOr< |
| T, U>>>::value, |
| int> = 0> |
| StatusOr(const StatusOr<U> &); |
| |
| template < |
| typename U, |
| absl::enable_if_t< |
| absl::conjunction< |
| absl::negation<std::is_same<T, U>>, |
| std::is_constructible<T, const U &>, |
| absl::negation<std::is_convertible<const U &, T>>, |
| absl::negation< |
| internal_statusor::IsConstructibleOrConvertibleFromStatusOr< |
| T, U>>>::value, |
| int> = 0> |
| explicit StatusOr(const StatusOr<U> &); |
| |
| template < |
| typename U, |
| absl::enable_if_t< |
| absl::conjunction< |
| absl::negation<std::is_same<T, U>>, |
| std::is_constructible<T, U &&>, std::is_convertible<U &&, T>, |
| absl::negation< |
| internal_statusor::IsConstructibleOrConvertibleFromStatusOr< |
| T, U>>>::value, |
| int> = 0> |
| StatusOr(StatusOr<U> &&); |
| |
| template < |
| typename U, |
| absl::enable_if_t< |
| absl::conjunction< |
| absl::negation<std::is_same<T, U>>, |
| std::is_constructible<T, U &&>, |
| absl::negation<std::is_convertible<U &&, T>>, |
| absl::negation< |
| internal_statusor::IsConstructibleOrConvertibleFromStatusOr< |
| T, U>>>::value, |
| int> = 0> |
| explicit StatusOr(StatusOr<U> &&); |
| |
| template < |
| typename U, |
| absl::enable_if_t< |
| absl::conjunction< |
| absl::negation<std::is_same<T, U>>, |
| std::is_constructible<T, const U &>, |
| std::is_assignable<T, const U &>, |
| absl::negation< |
| internal_statusor:: |
| IsConstructibleOrConvertibleOrAssignableFromStatusOr< |
| T, U>>>::value, |
| int> = 0> |
| StatusOr &operator=(const StatusOr<U> &); |
| |
| template < |
| typename U, |
| absl::enable_if_t< |
| absl::conjunction< |
| absl::negation<std::is_same<T, U>>, |
| std::is_constructible<T, U &&>, std::is_assignable<T, U &&>, |
| absl::negation< |
| internal_statusor:: |
| IsConstructibleOrConvertibleOrAssignableFromStatusOr< |
| T, U>>>::value, |
| int> = 0> |
| StatusOr &operator=(StatusOr<U> &&); |
| |
| template < |
| typename U = absl::Status, |
| absl::enable_if_t< |
| absl::conjunction< |
| std::is_convertible<U &&, absl::Status>, |
| std::is_constructible<absl::Status, U &&>, |
| absl::negation<std::is_same<absl::decay_t<U>, absl::StatusOr<T>>>, |
| absl::negation<std::is_same<absl::decay_t<U>, T>>, |
| absl::negation<std::is_same<absl::decay_t<U>, absl::in_place_t>>, |
| absl::negation<internal_statusor::HasConversionOperatorToStatusOr< |
| T, U &&>>>::value, |
| int> = 0> |
| StatusOr(U &&); |
| |
| template < |
| typename U = absl::Status, |
| absl::enable_if_t< |
| absl::conjunction< |
| absl::negation<std::is_convertible<U &&, absl::Status>>, |
| std::is_constructible<absl::Status, U &&>, |
| absl::negation<std::is_same<absl::decay_t<U>, absl::StatusOr<T>>>, |
| absl::negation<std::is_same<absl::decay_t<U>, T>>, |
| absl::negation<std::is_same<absl::decay_t<U>, absl::in_place_t>>, |
| absl::negation<internal_statusor::HasConversionOperatorToStatusOr< |
| T, U &&>>>::value, |
| int> = 0> |
| explicit StatusOr(U &&); |
| |
| template < |
| typename U = absl::Status, |
| absl::enable_if_t< |
| absl::conjunction< |
| std::is_convertible<U &&, absl::Status>, |
| std::is_constructible<absl::Status, U &&>, |
| absl::negation<std::is_same<absl::decay_t<U>, absl::StatusOr<T>>>, |
| absl::negation<std::is_same<absl::decay_t<U>, T>>, |
| absl::negation<std::is_same<absl::decay_t<U>, absl::in_place_t>>, |
| absl::negation<internal_statusor::HasConversionOperatorToStatusOr< |
| T, U &&>>>::value, |
| int> = 0> |
| StatusOr &operator=(U &&); |
| |
| template < |
| typename U = T, |
| typename = typename std::enable_if<absl::conjunction< |
| std::is_constructible<T, U &&>, std::is_assignable<T &, U &&>, |
| absl::disjunction< |
| std::is_same<absl::remove_cv_t<absl::remove_reference_t<U>>, T>, |
| absl::conjunction< |
| absl::negation<std::is_convertible<U &&, absl::Status>>, |
| absl::negation< |
| internal_statusor::HasConversionOperatorToStatusOr< |
| T, U &&>>>>, |
| internal_statusor::IsForwardingAssignmentValid<T, U &&>>::value>:: |
| type> |
| StatusOr &operator=(U &&); |
| |
| template <typename... Args> explicit StatusOr(absl::in_place_t, Args &&...); |
| |
| template <typename U, typename... Args> |
| explicit StatusOr(absl::in_place_t, std::initializer_list<U>, Args &&...); |
| |
| template < |
| typename U = T, |
| absl::enable_if_t< |
| absl::conjunction< |
| internal_statusor::IsDirectInitializationValid<T, U &&>, |
| std::is_constructible<T, U &&>, std::is_convertible<U &&, T>, |
| absl::disjunction< |
| std::is_same<absl::remove_cv_t<absl::remove_reference_t<U>>, |
| T>, |
| absl::conjunction< |
| absl::negation<std::is_convertible<U &&, absl::Status>>, |
| absl::negation< |
| internal_statusor::HasConversionOperatorToStatusOr< |
| T, U &&>>>>>::value, |
| int> = 0> |
| StatusOr(U &&); |
| |
| template < |
| typename U = T, |
| absl::enable_if_t< |
| absl::conjunction< |
| internal_statusor::IsDirectInitializationValid<T, U &&>, |
| absl::disjunction< |
| std::is_same<absl::remove_cv_t<absl::remove_reference_t<U>>, |
| T>, |
| absl::conjunction< |
| absl::negation<std::is_constructible<absl::Status, U &&>>, |
| absl::negation< |
| internal_statusor::HasConversionOperatorToStatusOr< |
| T, U &&>>>>, |
| std::is_constructible<T, U &&>, |
| absl::negation<std::is_convertible<U &&, T>>>::value, |
| int> = 0> |
| explicit StatusOr(U &&); |
| |
| bool ok() const; |
| |
| const Status &status() const & { return status_; } |
| Status status() &&; |
| |
| using StatusOr::OperatorBase::value; |
| |
| const T &ValueOrDie() const &; |
| T &ValueOrDie() &; |
| const T &&ValueOrDie() const &&; |
| T &&ValueOrDie() &&; |
| |
| using StatusOr::OperatorBase::operator*; |
| using StatusOr::OperatorBase::operator->; |
| |
| template <typename U> T value_or(U &&default_value) const &; |
| template <typename U> T value_or(U &&default_value) &&; |
| |
| template <typename... Args> T &emplace(Args &&...args); |
| |
| template < |
| typename U, typename... Args, |
| 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); |
| |
| private: |
| absl::Status status_; |
| }; |
| |
| template <typename T> |
| bool operator==(const StatusOr<T> &lhs, const StatusOr<T> &rhs); |
| |
| template <typename T> |
| bool operator!=(const StatusOr<T> &lhs, const StatusOr<T> &rhs); |
| |
| } // namespace absl |
| |
| #endif // STATUSOR_H_ |
| )cc"; |
| |
| static constexpr char StdVectorHeader[] = R"cc( |
| #ifndef STD_VECTOR_H |
| #define STD_VECTOR_H |
| namespace std { |
| template <class T> struct allocator { |
| typedef size_t size_type; |
| typedef ptrdiff_t difference_type; |
| typedef T *pointer; |
| typedef const T *const_pointer; |
| typedef T value_type; |
| |
| T *allocate(size_t n); |
| }; |
| |
| template <class Alloc> struct allocator_traits { |
| typedef Alloc allocator_type; |
| typedef typename allocator_type::value_type value_type; |
| typedef typename allocator_type::pointer pointer; |
| typedef typename allocator_type::const_pointer const_pointer; |
| typedef typename allocator_type::difference_type difference_type; |
| typedef typename allocator_type::size_type size_type; |
| }; |
| |
| template <typename T, class Allocator = allocator<T>> class vector { |
| public: |
| using value_type = T; |
| using size_type = typename allocator_traits<Allocator>::size_type; |
| |
| // Constructors. |
| vector() {} |
| vector(size_type, const Allocator & = Allocator()) {} |
| vector(initializer_list<T> initializer_list, |
| const Allocator & = Allocator()) {} |
| vector(const vector &vector) {} |
| ~vector(); |
| |
| // Modifiers. |
| void push_back(const T &value); |
| void push_back(T &&value); |
| template <typename... Args> T &emplace_back(Args &&...args); |
| |
| // Iterators |
| class InputIterator { |
| public: |
| InputIterator(const InputIterator &); |
| ~InputIterator(); |
| InputIterator &operator=(const InputIterator &); |
| InputIterator &operator++(); |
| T &operator*() const; |
| bool operator!=(const InputIterator &) const; |
| bool operator==(const InputIterator &) const; |
| }; |
| typedef InputIterator iterator; |
| typedef const InputIterator const_iterator; |
| iterator begin() noexcept; |
| const_iterator begin() const noexcept; |
| const_iterator cbegin() const noexcept; |
| iterator end() noexcept; |
| const_iterator end() const noexcept; |
| const_iterator cend() const noexcept; |
| T *data() noexcept; |
| const T *data() const noexcept; |
| T &operator[](int n); |
| const T &operator[](int n) const; |
| T &at(int n); |
| const T &at(int n) const; |
| size_t size() const; |
| }; |
| } // namespace std |
| #endif // STD_VECTOR_H |
| )cc"; |
| |
| static constexpr char StdPairHeader[] = R"cc( |
| #ifndef STD_PAIR_H |
| #define STD_PAIR_H |
| namespace std { |
| template <class T1, class T2> struct pair { |
| T1 first; |
| T2 second; |
| |
| typedef T1 first_type; |
| typedef T2 second_type; |
| |
| constexpr pair(); |
| |
| template <class U1, class U2> pair(pair<U1, U2> &&p); |
| |
| template <class U1, class U2> pair(U1 &&x, U2 &&y); |
| }; |
| |
| template <class T1, class T2> pair<T1, T2> make_pair(T1 &&t1, T2 &&t2); |
| } // namespace std |
| #endif // STD_PAIR_H |
| )cc"; |
| |
| constexpr const char AbslLogHeader[] = R"cc( |
| #ifndef ABSL_LOG_H |
| #define ABSL_LOG_H |
| |
| #include "std_pair.h" |
| |
| namespace absl { |
| |
| #define ABSL_PREDICT_FALSE(x) (__builtin_expect(false || (x), false)) |
| #define ABSL_PREDICT_TRUE(x) (__builtin_expect(false || (x), true)) |
| |
| namespace log_internal { |
| class LogMessage { |
| public: |
| LogMessage(); |
| LogMessage &stream(); |
| LogMessage &InternalStream(); |
| LogMessage &WithVerbosity(int verboselevel); |
| template <typename T> LogMessage &operator<<(const T &); |
| }; |
| class LogMessageFatal : public LogMessage { |
| public: |
| LogMessageFatal(); |
| ~LogMessageFatal() __attribute__((noreturn)); |
| }; |
| class LogMessageQuietlyFatal : public LogMessage { |
| public: |
| LogMessageQuietlyFatal(); |
| ~LogMessageQuietlyFatal() __attribute__((noreturn)); |
| }; |
| class Voidify final { |
| public: |
| // This has to be an operator with a precedence lower than << but higher |
| // than |
| // ?: |
| template <typename T> void operator&&(const T &) const && {} |
| }; |
| } // namespace log_internal |
| } // namespace absl |
| |
| #ifndef NULL |
| #define NULL __null |
| #endif |
| extern "C" void abort() {} |
| #define ABSL_LOG_INTERNAL_LOG_INFO ::absl::log_internal::LogMessage() |
| #define ABSL_LOG_INTERNAL_LOG_WARNING ::absl::log_internal::LogMessage() |
| #define ABSL_LOG_INTERNAL_LOG_ERROR ::absl::log_internal::LogMessage() |
| #define ABSL_LOG_INTERNAL_LOG_FATAL ::absl::log_internal::LogMessageFatal() |
| #define ABSL_LOG_INTERNAL_LOG_QFATAL \ |
| ::absl::log_internal::LogMessageQuietlyFatal() |
| #define LOG(severity) ABSL_LOG_INTERNAL_LOG_##severity.InternalStream() |
| |
| #define PREDICT_FALSE(x) (__builtin_expect(x, 0)) |
| #define ABSL_LOG_INTERNAL_STRIP_STRING_LITERAL(lit) lit |
| |
| #define ABSL_LOG_INTERNAL_STATELESS_CONDITION(condition) \ |
| switch (0) \ |
| case 0: \ |
| default: \ |
| !(condition) ? (void)0 : ::absl::log_internal::Voidify() && |
| |
| #define ABSL_LOG_INTERNAL_CONDITION_INFO(type, condition) \ |
| ABSL_LOG_INTERNAL_##type##_CONDITION(condition) |
| |
| #define ABSL_LOG_INTERNAL_CONDITION_FATAL(type, condition) \ |
| ABSL_LOG_INTERNAL_##type##_CONDITION(condition) |
| |
| #define ABSL_LOG_INTERNAL_CONDITION_QFATAL(type, condition) \ |
| ABSL_LOG_INTERNAL_##type##_CONDITION(condition) |
| |
| #define ABSL_CHECK_IMPL(condition, condition_text) \ |
| ABSL_LOG_INTERNAL_CONDITION_FATAL(STATELESS, \ |
| ABSL_PREDICT_FALSE(!(condition))) \ |
| ABSL_LOG_INTERNAL_CHECK(condition_text).InternalStream() |
| |
| #define ABSL_QCHECK_IMPL(condition, condition_text) \ |
| ABSL_LOG_INTERNAL_CONDITION_QFATAL(STATELESS, \ |
| ABSL_PREDICT_FALSE(!(condition))) \ |
| ABSL_LOG_INTERNAL_QCHECK(condition_text).InternalStream() |
| |
| #define CHECK(condition) ABSL_CHECK_IMPL((condition), #condition) |
| #define DCHECK(condition) CHECK(condition) |
| #define QCHECK(condition) ABSL_QCHECK_IMPL((condition), #condition) |
| |
| #define ABSL_LOG_INTERNAL_MAX_LOG_VERBOSITY_CHECK(x) |
| |
| namespace absl { |
| |
| template <typename T> class StatusOr; |
| class Status; |
| |
| namespace status_internal { |
| std::string *MakeCheckFailString(const absl::Status *status, |
| const char *prefix); |
| } // namespace status_internal |
| |
| namespace log_internal { |
| template <class T> const T &GetReferenceableValue(const T &t); |
| char GetReferenceableValue(char t); |
| unsigned char GetReferenceableValue(unsigned char t); |
| signed char GetReferenceableValue(signed char t); |
| short GetReferenceableValue(short t); |
| unsigned short GetReferenceableValue(unsigned short t); |
| int GetReferenceableValue(int t); |
| unsigned int GetReferenceableValue(unsigned int t); |
| long GetReferenceableValue(long t); |
| unsigned long GetReferenceableValue(unsigned long t); |
| long long GetReferenceableValue(long long t); |
| unsigned long long GetReferenceableValue(unsigned long long t); |
| const absl::Status *AsStatus(const absl::Status &s); |
| template <typename T> const absl::Status *AsStatus(const absl::StatusOr<T> &s); |
| } // namespace log_internal |
| } // namespace absl |
| // TODO(tkd): this still doesn't allow operator<<, unlike the real CHECK_ |
| // macros. |
| #define ABSL_LOG_INTERNAL_CHECK_OP(name, op, val1, val2) \ |
| while (char *_result = ::absl::log_internal::name##Impl( \ |
| ::absl::log_internal::GetReferenceableValue(val1), \ |
| ::absl::log_internal::GetReferenceableValue(val2), \ |
| #val1 " " #op " " #val2)) \ |
| (void)0 |
| #define ABSL_LOG_INTERNAL_QCHECK_OP(name, op, val1, val2) \ |
| while (char *_result = ::absl::log_internal::name##Impl( \ |
| ::absl::log_internal::GetReferenceableValue(val1), \ |
| ::absl::log_internal::GetReferenceableValue(val2), \ |
| #val1 " " #op " " #val2)) \ |
| (void)0 |
| namespace absl { |
| namespace log_internal { |
| template <class T1, class T2> |
| char *Check_NEImpl(const T1 &v1, const T2 &v2, const char *names); |
| template <class T1, class T2> |
| char *Check_EQImpl(const T1 &v1, const T2 &v2, const char *names); |
| template <class T1, class T2> |
| char *Check_LTImpl(const T1 &v1, const T2 &v2, const char *names); |
| |
| #define CHECK_EQ(a, b) ABSL_LOG_INTERNAL_CHECK_OP(Check_EQ, ==, a, b) |
| #define CHECK_NE(a, b) ABSL_LOG_INTERNAL_CHECK_OP(Check_NE, !=, a, b) |
| #define CHECK_LT(a, b) ABSL_LOG_INTERNAL_CHECK_OP(Check_EQ, <, a, b) |
| |
| #define QCHECK_EQ(a, b) ABSL_LOG_INTERNAL_QCHECK_OP(Check_EQ, ==, a, b) |
| #define QCHECK_NE(a, b) ABSL_LOG_INTERNAL_QCHECK_OP(Check_NE, !=, a, b) |
| } // namespace log_internal |
| } // namespace absl |
| |
| #define CHECK_NOTNULL(x) CHECK((x) != nullptr) |
| |
| #define ABSL_LOG_INTERNAL_CHECK(failure_message) \ |
| ::absl::log_internal::LogMessageFatal() |
| #define ABSL_LOG_INTERNAL_QCHECK(failure_message) \ |
| ::absl::log_internal::LogMessageQuietlyFatal() |
| #define ABSL_LOG_INTERNAL_CHECK_OK(val) \ |
| for (::std::pair<const ::absl::Status *, ::std::string *> \ |
| absl_log_internal_check_ok_goo; \ |
| absl_log_internal_check_ok_goo.first = \ |
| ::absl::log_internal::AsStatus(val), \ |
| absl_log_internal_check_ok_goo.second = \ |
| ABSL_PREDICT_TRUE(absl_log_internal_check_ok_goo.first->ok()) \ |
| ? nullptr \ |
| : ::absl::status_internal::MakeCheckFailString( \ |
| absl_log_internal_check_ok_goo.first, \ |
| ABSL_LOG_INTERNAL_STRIP_STRING_LITERAL(#val " is OK")), \ |
| !ABSL_PREDICT_TRUE(absl_log_internal_check_ok_goo.first->ok());) \ |
| ABSL_LOG_INTERNAL_CHECK(*absl_log_internal_check_ok_goo.second) \ |
| .InternalStream() |
| #define ABSL_LOG_INTERNAL_QCHECK_OK(val) \ |
| for (::std::pair<const ::absl::Status *, ::std::string *> \ |
| absl_log_internal_check_ok_goo; \ |
| absl_log_internal_check_ok_goo.first = \ |
| ::absl::log_internal::AsStatus(val), \ |
| absl_log_internal_check_ok_goo.second = \ |
| ABSL_PREDICT_TRUE(absl_log_internal_check_ok_goo.first->ok()) \ |
| ? nullptr \ |
| : ::absl::status_internal::MakeCheckFailString( \ |
| absl_log_internal_check_ok_goo.first, \ |
| ABSL_LOG_INTERNAL_STRIP_STRING_LITERAL(#val " is OK")), \ |
| !ABSL_PREDICT_TRUE(absl_log_internal_check_ok_goo.first->ok());) \ |
| ABSL_LOG_INTERNAL_QCHECK(*absl_log_internal_check_ok_goo.second) \ |
| .InternalStream() |
| |
| #define CHECK_OK(val) ABSL_LOG_INTERNAL_CHECK_OK(val) |
| #define DCHECK_OK(val) ABSL_LOG_INTERNAL_CHECK_OK(val) |
| #define QCHECK_OK(val) ABSL_LOG_INTERNAL_QCHECK_OK(val) |
| |
| #endif // ABSL_LOG_H |
| )cc"; |
| |
| constexpr const char TestingDefsHeader[] = R"cc( |
| #pragma clang system_header |
| |
| #ifndef TESTING_DEFS_H |
| #define TESTING_DEFS_H |
| |
| #include "absl_type_traits.h" |
| #include "std_initializer_list.h" |
| #include "std_string.h" |
| #include "std_type_traits.h" |
| #include "std_utility.h" |
| |
| namespace testing { |
| struct AssertionResult { |
| template <typename T> |
| explicit AssertionResult(const T &res, bool enable_if = true) {} |
| ~AssertionResult(); |
| operator bool() const; |
| template <typename T> AssertionResult &operator<<(const T &value); |
| const char *failure_message() const; |
| }; |
| |
| class TestPartResult { |
| public: |
| enum Type { kSuccess, kNonFatalFailure, kFatalFailure, kSkip }; |
| }; |
| |
| class Test { |
| public: |
| virtual ~Test() = default; |
| |
| protected: |
| virtual void SetUp() {} |
| }; |
| |
| class Message { |
| public: |
| template <typename T> Message &operator<<(const T &val); |
| }; |
| |
| namespace internal { |
| class AssertHelper { |
| public: |
| AssertHelper(TestPartResult::Type type, const char *file, int line, |
| const char *message); |
| void operator=(const Message &message) const; |
| }; |
| |
| class EqHelper { |
| public: |
| template <typename T1, typename T2> |
| static AssertionResult Compare(const char *lhx, const char *rhx, |
| const T1 &lhs, const T2 &rhs); |
| }; |
| |
| #define GTEST_IMPL_CMP_HELPER_(op_name) \ |
| template <typename T1, typename T2> \ |
| AssertionResult CmpHelper##op_name(const char *expr1, const char *expr2, \ |
| const T1 &val1, const T2 &val2); |
| |
| GTEST_IMPL_CMP_HELPER_(NE) |
| GTEST_IMPL_CMP_HELPER_(LE) |
| GTEST_IMPL_CMP_HELPER_(LT) |
| GTEST_IMPL_CMP_HELPER_(GE) |
| GTEST_IMPL_CMP_HELPER_(GT) |
| |
| #undef GTEST_IMPL_CMP_HELPER_ |
| |
| std::string GetBoolAssertionFailureMessage( |
| const AssertionResult &assertion_result, const char *expression_text, |
| const char *actual_predicate_value, const char *expected_predicate_value); |
| |
| template <typename M> class PredicateFormatterFromMatcher { |
| public: |
| template <typename T> |
| AssertionResult operator()(const char *value_text, const T &x) const; |
| }; |
| |
| template <typename M> |
| inline PredicateFormatterFromMatcher<M> |
| MakePredicateFormatterFromMatcher(M matcher) { |
| return PredicateFormatterFromMatcher<M>(); |
| } |
| } // namespace internal |
| |
| namespace status { |
| namespace internal_status { |
| class IsOkMatcher {}; |
| |
| class StatusIsMatcher {}; |
| |
| class CanonicalStatusIsMatcher {}; |
| |
| template <typename M> class IsOkAndHoldsMatcher {}; |
| |
| } // namespace internal_status |
| |
| internal_status::IsOkMatcher IsOk(); |
| |
| template <typename StatusCodeMatcher> |
| internal_status::StatusIsMatcher StatusIs(StatusCodeMatcher &&code_matcher); |
| |
| template <typename StatusCodeMatcher> |
| internal_status::CanonicalStatusIsMatcher |
| CanonicalStatusIs(StatusCodeMatcher &&code_matcher); |
| |
| template <typename InnerMatcher> |
| internal_status::IsOkAndHoldsMatcher<InnerMatcher> IsOkAndHolds(InnerMatcher m); |
| } // namespace status |
| |
| class IsTrueMatcher {}; |
| IsTrueMatcher IsTrue(); |
| |
| class IsFalseMatcher {}; |
| IsFalseMatcher IsFalse(); |
| |
| } // namespace testing |
| |
| namespace absl_testing { |
| namespace status_internal { |
| class IsOkMatcher {}; |
| template <typename M> class IsOkAndHoldsMatcher {}; |
| class StatusIsMatcher {}; |
| class CanonicalStatusIsMatcher {}; |
| } // namespace status_internal |
| status_internal::IsOkMatcher IsOk(); |
| template <typename InnerMatcher> |
| status_internal::IsOkAndHoldsMatcher<InnerMatcher> IsOkAndHolds(InnerMatcher m); |
| template <typename StatusCodeMatcher> |
| status_internal::StatusIsMatcher StatusIs(StatusCodeMatcher &&code_matcher); |
| |
| template <typename StatusCodeMatcher> |
| status_internal::CanonicalStatusIsMatcher |
| CanonicalStatusIs(StatusCodeMatcher &&code_matcher); |
| } // namespace absl_testing |
| |
| using testing::AssertionResult; |
| #define EXPECT_TRUE(x) \ |
| switch (0) \ |
| case 0: \ |
| default: \ |
| if (const AssertionResult gtest_ar_ = AssertionResult(x)) { \ |
| } else /* NOLINT */ \ |
| ::testing::Message() |
| #define EXPECT_FALSE(x) EXPECT_TRUE(!(x)) |
| |
| #define GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ |
| switch (0) \ |
| case 0: \ |
| default: |
| |
| #define GTEST_ASSERT_(expression, on_failure) \ |
| GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ |
| if (const ::testing::AssertionResult gtest_ar = (expression)) \ |
| ; \ |
| else \ |
| on_failure(gtest_ar.failure_message()) |
| #define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure) \ |
| GTEST_ASSERT_(pred_format(#v1, v1), on_failure) |
| #define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure) \ |
| GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), on_failure) |
| #define GTEST_MESSAGE_AT_(file, line, message, result_type) \ |
| ::testing::internal::AssertHelper(result_type, file, line, message) = \ |
| ::testing::Message() |
| #define GTEST_MESSAGE_(message, result_type) \ |
| GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type) |
| #define GTEST_FATAL_FAILURE_(message) \ |
| return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure) |
| #define GTEST_NONFATAL_FAILURE_(message) \ |
| GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure) |
| |
| #define ASSERT_PRED_FORMAT1(pred_format, v1) \ |
| GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_) |
| #define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \ |
| GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_) |
| |
| #define ASSERT_THAT(value, matcher) \ |
| ASSERT_PRED_FORMAT1( \ |
| ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value) |
| #define ASSERT_OK(x) ASSERT_THAT(x, ::testing::status::IsOk()) |
| |
| #define EXPECT_PRED_FORMAT1(pred_format, v1) \ |
| GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_) |
| #define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \ |
| GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_) |
| #define EXPECT_THAT(value, matcher) \ |
| EXPECT_PRED_FORMAT1( \ |
| ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value) |
| #define EXPECT_OK(expression) EXPECT_THAT(expression, ::testing::status::IsOk()) |
| |
| #define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \ |
| GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ |
| if (const ::testing::AssertionResult gtest_ar_ = \ |
| ::testing::AssertionResult(expression)) \ |
| ; \ |
| else \ |
| fail(::testing::internal::GetBoolAssertionFailureMessage( \ |
| gtest_ar_, text, #actual, #expected) \ |
| .c_str()) |
| #define GTEST_ASSERT_TRUE(condition) \ |
| GTEST_TEST_BOOLEAN_(condition, #condition, false, true, GTEST_FATAL_FAILURE_) |
| #define GTEST_ASSERT_FALSE(condition) \ |
| GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ |
| GTEST_FATAL_FAILURE_) |
| #define ASSERT_TRUE(condition) GTEST_ASSERT_TRUE(condition) |
| #define ASSERT_FALSE(condition) GTEST_ASSERT_FALSE(condition) |
| |
| #define EXPECT_EQ(x, y) \ |
| EXPECT_PRED_FORMAT2(::testing::internal::EqHelper::Compare, x, y) |
| #define EXPECT_NE(x, y) \ |
| EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, x, y) |
| #define EXPECT_LT(x, y) \ |
| EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, x, y) |
| #define EXPECT_GT(x, y) \ |
| EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, x, y) |
| #define EXPECT_LE(x, y) \ |
| EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, x, y) |
| #define EXPECT_GE(x, y) \ |
| EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, x, y) |
| |
| #define ASSERT_EQ(x, y) \ |
| ASSERT_PRED_FORMAT2(testing::internal::EqHelper::Compare, x, y) |
| #define ASSERT_NE(x, y) \ |
| ASSERT_PRED_FORMAT2(testing::internal::CmpHelperNE, x, y) |
| #define ASSERT_LT(x, y) \ |
| ASSERT_PRED_FORMAT2(testing::internal::CmpHelperLT, x, y) |
| #define ASSERT_GT(x, y) \ |
| ASSERT_PRED_FORMAT2(testing::internal::CmpHelperGT, x, y) |
| #define ASSERT_LE(x, y) \ |
| ASSERT_PRED_FORMAT2(testing::internal::CmpHelperLE, x, y) |
| #define ASSERT_GE(x, y) \ |
| ASSERT_PRED_FORMAT2(testing::internal::CmpHelperGE, x, y) |
| |
| #endif // TESTING_DEFS_H |
| )cc"; |
| |
| std::vector<std::pair<std::string, std::string>> getMockHeaders() { |
| std::vector<std::pair<std::string, std::string>> Headers; |
| Headers.emplace_back("cstddef.h", CStdDefHeader); |
| Headers.emplace_back("std_initializer_list.h", StdInitializerListHeader); |
| Headers.emplace_back("std_string.h", StdStringHeader); |
| Headers.emplace_back("std_type_traits.h", StdTypeTraitsHeader); |
| Headers.emplace_back("std_utility.h", StdUtilityHeader); |
| Headers.emplace_back("std_optional.h", StdOptionalHeader); |
| Headers.emplace_back("absl_type_traits.h", AbslTypeTraitsHeader); |
| Headers.emplace_back("absl_optional.h", AbslOptionalHeader); |
| Headers.emplace_back("base_optional.h", BaseOptionalHeader); |
| Headers.emplace_back("std_vector.h", StdVectorHeader); |
| Headers.emplace_back("std_pair.h", StdPairHeader); |
| Headers.emplace_back("status_defs.h", StatusDefsHeader); |
| Headers.emplace_back("statusor_defs.h", StatusOrDefsHeader); |
| Headers.emplace_back("absl_log.h", AbslLogHeader); |
| Headers.emplace_back("testing_defs.h", TestingDefsHeader); |
| return Headers; |
| } |
| |
| } // namespace test |
| } // namespace dataflow |
| } // namespace clang |