trait.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // Copyright The OpenTelemetry Authors
  2. // SPDX-License-Identifier: Apache-2.0
  3. #pragma once
  4. #include <type_traits>
  5. #include "opentelemetry/nostd/type_traits.h"
  6. #include "opentelemetry/version.h"
  7. OPENTELEMETRY_BEGIN_NAMESPACE
  8. namespace nostd
  9. {
  10. namespace detail
  11. {
  12. enum class Trait
  13. {
  14. TriviallyAvailable,
  15. Available,
  16. Unavailable
  17. };
  18. template <typename T,
  19. template <typename>
  20. class IsTriviallyAvailable,
  21. template <typename>
  22. class IsAvailable>
  23. inline constexpr Trait trait()
  24. {
  25. return IsTriviallyAvailable<T>::value ? Trait::TriviallyAvailable
  26. : IsAvailable<T>::value ? Trait::Available
  27. : Trait::Unavailable;
  28. }
  29. inline constexpr Trait common_trait_impl(Trait result)
  30. {
  31. return result;
  32. }
  33. template <typename... Traits>
  34. inline constexpr Trait common_trait_impl(Trait result, Trait t, Traits... ts)
  35. {
  36. return static_cast<int>(t) > static_cast<int>(result) ? common_trait_impl(t, ts...)
  37. : common_trait_impl(result, ts...);
  38. }
  39. template <typename... Traits>
  40. inline constexpr Trait common_trait(Traits... ts)
  41. {
  42. return common_trait_impl(Trait::TriviallyAvailable, ts...);
  43. }
  44. template <typename... Ts>
  45. struct traits
  46. {
  47. static constexpr Trait copy_constructible_trait =
  48. common_trait(trait<Ts, is_trivially_copy_constructible, std::is_copy_constructible>()...);
  49. static constexpr Trait move_constructible_trait =
  50. common_trait(trait<Ts, is_trivially_move_constructible, std::is_move_constructible>()...);
  51. static constexpr Trait copy_assignable_trait =
  52. common_trait(copy_constructible_trait,
  53. trait<Ts, is_trivially_copy_assignable, std::is_copy_assignable>()...);
  54. static constexpr Trait move_assignable_trait =
  55. common_trait(move_constructible_trait,
  56. trait<Ts, is_trivially_move_assignable, std::is_move_assignable>()...);
  57. static constexpr Trait destructible_trait =
  58. common_trait(trait<Ts, std::is_trivially_destructible, std::is_destructible>()...);
  59. };
  60. } // namespace detail
  61. } // namespace nostd
  62. OPENTELEMETRY_END_NAMESPACE