| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 | // Copyright The OpenTelemetry Authors// SPDX-License-Identifier: Apache-2.0#pragma once// IWYU pragma: private, include "opentelemetry/nostd/span.h"#include "opentelemetry/version.h"// Standard library implementation requires at least C++17 compiler.// Older C++14 compilers may provide support for __has_include as a// conforming extension.#if defined __has_include#  if __has_include(<version>)  // Check for __cpp_{feature}#    include <version>#    if defined(__cpp_lib_span) && __cplusplus > 201703L#      define OPENTELEMETRY_HAVE_SPAN#    endif#  endif#  if !defined(OPENTELEMETRY_HAVE_SPAN)#    // Check for Visual Studio span#    if defined(_MSVC_LANG) && _HAS_CXX20#      define OPENTELEMETRY_HAVE_SPAN#    endif#    // Check for other compiler span implementation#    if !defined(_MSVC_LANG) && __has_include(<span>) && __cplusplus > 201703L// This works as long as compiler standard is set to C++20#      define OPENTELEMETRY_HAVE_SPAN#    endif#  endif#  if !__has_include(<gsl/gsl>)#    undef HAVE_GSL#  endif#endif#if !defined(OPENTELEMETRY_HAVE_SPAN)#  if defined(HAVE_GSL)#    include <type_traits>// Guidelines Support Library provides an implementation of std::span#    include <gsl/gsl>OPENTELEMETRY_BEGIN_NAMESPACEnamespace nostd{using gsl::dynamic_extent;template <class ElementType, std::size_t Extent = gsl::dynamic_extent>using span = gsl::span<ElementType, Extent>;}  // namespace nostdOPENTELEMETRY_END_NAMESPACE#    define OPENTELEMETRY_HAVE_SPAN#  else// No `gsl::span`, no `std::span`, fallback to `nostd::span`#  endif#else  // OPENTELEMETRY_HAVE_SPAN// Using std::span (https://wg21.link/P0122R7) from Standard Library available in C++20 :// - GCC libstdc++ 10+// - Clang libc++ 7// - MSVC Standard Library 19.26*// - Apple Clang 10.0.0*#  include <limits>#  include <span>OPENTELEMETRY_BEGIN_NAMESPACEnamespace nostd{constexpr std::size_t dynamic_extent = (std::numeric_limits<std::size_t>::max)();template <class ElementType, std::size_t Extent = nostd::dynamic_extent>using span = std::span<ElementType, Extent>;}  // namespace nostdOPENTELEMETRY_END_NAMESPACE#endif  // if OPENTELEMETRY_HAVE_SPAN
 |