detection.hpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright (C) 2020 T. Zachary Laine
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See
  4. // accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. #ifndef BOOST_PARSER_DETAIL_DETECTION_HPP
  7. #define BOOST_PARSER_DETAIL_DETECTION_HPP
  8. #include <type_traits>
  9. namespace boost::parser::detail {
  10. template<typename...>
  11. struct void_
  12. {
  13. using type = void;
  14. static constexpr bool value = true;
  15. };
  16. template<typename... T>
  17. using void_t = typename void_<T...>::type;
  18. template<typename T>
  19. struct fixup_ptr
  20. {
  21. using type = T;
  22. };
  23. template<typename T>
  24. using remove_v_t = typename std::remove_volatile<T>::type;
  25. template<typename T>
  26. struct fixup_ptr<T *>
  27. {
  28. using type = remove_v_t<T> const *;
  29. };
  30. template<typename T>
  31. using fixup_ptr_t = typename fixup_ptr<T>::type;
  32. template<typename T>
  33. using remove_cv_ref_t =
  34. typename std::remove_cv<typename std::remove_reference<T>::type>::type;
  35. struct nonesuch
  36. {};
  37. template<
  38. typename Default,
  39. typename AlwaysVoid,
  40. template<typename...> class Template,
  41. typename... Args>
  42. struct detector
  43. {
  44. using value_t = std::false_type;
  45. using type = Default;
  46. };
  47. template<
  48. typename Default,
  49. template<typename...> class Template,
  50. typename... Args>
  51. struct detector<Default, void_t<Template<Args...>>, Template, Args...>
  52. {
  53. using value_t = std::true_type;
  54. using type = Template<Args...>;
  55. };
  56. template<template<typename...> class Template, typename... Args>
  57. using is_detected =
  58. typename detector<nonesuch, void, Template, Args...>::value_t;
  59. template<template<typename...> class Template, typename... Args>
  60. constexpr bool is_detected_v = is_detected<Template, Args...>::value;
  61. template<template<typename...> class Template, typename... Args>
  62. using detected_t =
  63. typename detector<nonesuch, void, Template, Args...>::type;
  64. template<
  65. typename Default,
  66. template<typename...> class Template,
  67. typename... Args>
  68. using detected_or_t =
  69. typename detector<Default, void, Template, Args...>::type;
  70. }
  71. #endif