| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 | // Copyright The OpenTelemetry Authors// SPDX-License-Identifier: Apache-2.0#pragma once#include <type_traits>#include <utility>#include "opentelemetry/nostd/detail/decay.h"#include "opentelemetry/nostd/detail/void.h"#include "opentelemetry/version.h"#define OPENTELEMETRY_RETURN(...)                        \  noexcept(noexcept(__VA_ARGS__))->decltype(__VA_ARGS__) \  {                                                      \    return __VA_ARGS__;                                  \  }OPENTELEMETRY_BEGIN_NAMESPACEnamespace nostd{namespace detail{template <typename T>struct is_reference_wrapper : std::false_type{};template <typename T>struct is_reference_wrapper<std::reference_wrapper<T>> : std::true_type{};template <bool, int>struct Invoke;template <>struct Invoke<true /* pmf */, 0 /* is_base_of */>{  template <typename R, typename T, typename Arg, typename... Args>  inline static constexpr auto invoke(R T::*pmf, Arg &&arg, Args &&...args)      OPENTELEMETRY_RETURN((std::forward<Arg>(arg).*pmf)(std::forward<Args>(args)...))};template <>struct Invoke<true /* pmf */, 1 /* is_reference_wrapper */>{  template <typename R, typename T, typename Arg, typename... Args>  inline static constexpr auto invoke(R T::*pmf, Arg &&arg, Args &&...args)      OPENTELEMETRY_RETURN((std::forward<Arg>(arg).get().*pmf)(std::forward<Args>(args)...))};template <>struct Invoke<true /* pmf */, 2 /* otherwise */>{  template <typename R, typename T, typename Arg, typename... Args>  inline static constexpr auto invoke(R T::*pmf, Arg &&arg, Args &&...args)      OPENTELEMETRY_RETURN(((*std::forward<Arg>(arg)).*pmf)(std::forward<Args>(args)...))};template <>struct Invoke<false /* pmo */, 0 /* is_base_of */>{  template <typename R, typename T, typename Arg>  inline static constexpr auto invoke(R T::*pmo, Arg &&arg)      OPENTELEMETRY_RETURN(std::forward<Arg>(arg).*pmo)};template <>struct Invoke<false /* pmo */, 1 /* is_reference_wrapper */>{  template <typename R, typename T, typename Arg>  inline static constexpr auto invoke(R T::*pmo, Arg &&arg)      OPENTELEMETRY_RETURN(std::forward<Arg>(arg).get().*pmo)};template <>struct Invoke<false /* pmo */, 2 /* otherwise */>{  template <typename R, typename T, typename Arg>  inline static constexpr auto invoke(R T::*pmo, Arg &&arg)      OPENTELEMETRY_RETURN((*std::forward<Arg>(arg)).*pmo)};template <typename R, typename T, typename Arg, typename... Args>inline constexpr auto invoke_impl(R T::*f, Arg &&arg, Args &&...args) OPENTELEMETRY_RETURN(    Invoke<std::is_function<R>::value,           (std::is_base_of<T, decay_t<Arg>>::value     ? 0            : is_reference_wrapper<decay_t<Arg>>::value ? 1                                                        : 2)>::invoke(f,                                                                      std::forward<Arg>(arg),                                                                      std::forward<Args>(args)...))#ifdef _MSC_VER#  pragma warning(push)#  pragma warning(disable : 4100)#endif    template <typename F, typename... Args>    inline constexpr auto invoke_impl(F &&f, Args &&...args)        OPENTELEMETRY_RETURN(std::forward<F>(f)(std::forward<Args>(args)...))#ifdef _MSC_VER#  pragma warning(pop)#endif}  // namespace detail/* clang-format off */template <typename F, typename... Args>inline constexpr auto invoke(F &&f, Args &&... args)    OPENTELEMETRY_RETURN(detail::invoke_impl(std::forward<F>(f), std::forward<Args>(args)...))namespace detail/* clang-format on */{  template <typename Void, typename, typename...>  struct invoke_result  {};  template <typename F, typename... Args>  struct invoke_result<void_t<decltype(nostd::invoke(std::declval<F>(), std::declval<Args>()...))>,                       F, Args...>  {    using type = decltype(nostd::invoke(std::declval<F>(), std::declval<Args>()...));  };}  // namespace detailtemplate <typename F, typename... Args>using invoke_result = detail::invoke_result<void, F, Args...>;template <typename F, typename... Args>using invoke_result_t = typename invoke_result<F, Args...>::type;namespace detail{template <typename Void, typename, typename...>struct is_invocable : std::false_type{};template <typename F, typename... Args>struct is_invocable<void_t<invoke_result_t<F, Args...>>, F, Args...> : std::true_type{};template <typename Void, typename, typename, typename...>struct is_invocable_r : std::false_type{};template <typename R, typename F, typename... Args>struct is_invocable_r<void_t<invoke_result_t<F, Args...>>, R, F, Args...>    : std::is_convertible<invoke_result_t<F, Args...>, R>{};}  // namespace detailtemplate <typename F, typename... Args>using is_invocable = detail::is_invocable<void, F, Args...>;template <typename R, typename F, typename... Args>using is_invocable_r = detail::is_invocable_r<void, R, F, Args...>;}  // namespace nostdOPENTELEMETRY_END_NAMESPACE#undef OPENTELEMETRY_RETURN
 |