utility.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #if defined(OPENTELEMETRY_STL_VERSION)
  5. # if OPENTELEMETRY_STL_VERSION >= 2014
  6. # include "opentelemetry/std/utility.h"
  7. # define OPENTELEMETRY_HAVE_STD_UTILITY
  8. # endif
  9. #endif
  10. #if !defined(OPENTELEMETRY_HAVE_STD_UTILITY)
  11. # include <cstddef>
  12. # include <initializer_list>
  13. # include <type_traits>
  14. # include "opentelemetry/nostd/detail/decay.h" // IWYU pragma: export
  15. # include "opentelemetry/nostd/detail/invoke.h" // IWYU pragma: export
  16. # include "opentelemetry/version.h"
  17. OPENTELEMETRY_BEGIN_NAMESPACE
  18. namespace nostd
  19. {
  20. /**
  21. * Back port of std::data
  22. *
  23. * See https://en.cppreference.com/w/cpp/iterator/data
  24. */
  25. template <class C>
  26. auto data(C &c) noexcept(noexcept(c.data())) -> decltype(c.data())
  27. {
  28. return c.data();
  29. }
  30. template <class C>
  31. auto data(const C &c) noexcept(noexcept(c.data())) -> decltype(c.data())
  32. {
  33. return c.data();
  34. }
  35. template <class T, size_t N>
  36. T *data(T (&array)[N]) noexcept
  37. {
  38. return array;
  39. }
  40. template <class E>
  41. const E *data(std::initializer_list<E> list) noexcept
  42. {
  43. return list.begin();
  44. }
  45. /**
  46. * Back port of std::size
  47. *
  48. * See https://en.cppreference.com/w/cpp/iterator/size
  49. */
  50. template <class C>
  51. auto size(const C &c) noexcept(noexcept(c.size())) -> decltype(c.size())
  52. {
  53. return c.size();
  54. }
  55. template <class T, size_t N>
  56. size_t size(T (& /* array */)[N]) noexcept
  57. {
  58. return N;
  59. }
  60. /**
  61. * Back port of std::bool_constant
  62. */
  63. template <bool B>
  64. using bool_constant = std::integral_constant<bool, B>;
  65. /**
  66. * Back port of std::integer_sequence
  67. */
  68. template <typename T, T... Is>
  69. struct integer_sequence
  70. {
  71. using value_type = T;
  72. static constexpr std::size_t size() noexcept { return sizeof...(Is); }
  73. };
  74. /**
  75. * Back port of std::index_sequence
  76. */
  77. template <std::size_t... Is>
  78. using index_sequence = integer_sequence<std::size_t, Is...>;
  79. /**
  80. * Back port of std::make_index_sequence
  81. */
  82. namespace detail
  83. {
  84. template <class, size_t>
  85. struct index_sequence_push_back
  86. {};
  87. template <size_t... Indexes, size_t I>
  88. struct index_sequence_push_back<index_sequence<Indexes...>, I>
  89. {
  90. using type = index_sequence<Indexes..., I>;
  91. };
  92. template <class T, size_t I>
  93. using index_sequence_push_back_t = typename index_sequence_push_back<T, I>::type;
  94. template <size_t N>
  95. struct make_index_sequence_impl
  96. {
  97. using type = index_sequence_push_back_t<typename make_index_sequence_impl<N - 1>::type, N - 1>;
  98. };
  99. template <>
  100. struct make_index_sequence_impl<0>
  101. {
  102. using type = index_sequence<>;
  103. };
  104. } // namespace detail
  105. template <size_t N>
  106. using make_index_sequence = typename detail::make_index_sequence_impl<N>::type;
  107. /**
  108. * Back port of std::index_sequence_for
  109. */
  110. template <class... Ts>
  111. using index_sequence_for = make_index_sequence<sizeof...(Ts)>;
  112. /**
  113. * Back port of std::in_place_t
  114. */
  115. struct in_place_t
  116. {
  117. explicit in_place_t() = default;
  118. };
  119. /**
  120. * Back port of std::in_place_index_t
  121. */
  122. template <std::size_t I>
  123. struct in_place_index_t
  124. {
  125. explicit in_place_index_t() = default;
  126. };
  127. /**
  128. * Back port of std::in_place_type_t
  129. */
  130. template <typename T>
  131. struct in_place_type_t
  132. {
  133. explicit in_place_type_t() = default;
  134. };
  135. } // namespace nostd
  136. OPENTELEMETRY_END_NAMESPACE
  137. #endif /* OPENTELEMETRY_HAVE_STD_UTILITY */