File indexing completed on 2025-09-17 08:40:27
0001
0002
0003
0004
0005
0006 #ifndef BOOST_PARSER_DETAIL_DETECTION_HPP
0007 #define BOOST_PARSER_DETAIL_DETECTION_HPP
0008
0009 #include <type_traits>
0010
0011
0012 namespace boost::parser::detail {
0013
0014 template<typename...>
0015 struct void_
0016 {
0017 using type = void;
0018 static constexpr bool value = true;
0019 };
0020
0021 template<typename... T>
0022 using void_t = typename void_<T...>::type;
0023
0024 template<typename T>
0025 struct fixup_ptr
0026 {
0027 using type = T;
0028 };
0029
0030 template<typename T>
0031 using remove_v_t = typename std::remove_volatile<T>::type;
0032
0033 template<typename T>
0034 struct fixup_ptr<T *>
0035 {
0036 using type = remove_v_t<T> const *;
0037 };
0038
0039 template<typename T>
0040 using fixup_ptr_t = typename fixup_ptr<T>::type;
0041
0042 template<typename T>
0043 using remove_cv_ref_t =
0044 typename std::remove_cv<typename std::remove_reference<T>::type>::type;
0045
0046 struct nonesuch
0047 {};
0048
0049 template<
0050 typename Default,
0051 typename AlwaysVoid,
0052 template<typename...> class Template,
0053 typename... Args>
0054 struct detector
0055 {
0056 using value_t = std::false_type;
0057 using type = Default;
0058 };
0059
0060 template<
0061 typename Default,
0062 template<typename...> class Template,
0063 typename... Args>
0064 struct detector<Default, void_t<Template<Args...>>, Template, Args...>
0065 {
0066 using value_t = std::true_type;
0067 using type = Template<Args...>;
0068 };
0069
0070 template<template<typename...> class Template, typename... Args>
0071 using is_detected =
0072 typename detector<nonesuch, void, Template, Args...>::value_t;
0073
0074 template<template<typename...> class Template, typename... Args>
0075 constexpr bool is_detected_v = is_detected<Template, Args...>::value;
0076
0077 template<template<typename...> class Template, typename... Args>
0078 using detected_t =
0079 typename detector<nonesuch, void, Template, Args...>::type;
0080
0081 template<
0082 typename Default,
0083 template<typename...> class Template,
0084 typename... Args>
0085 using detected_or_t =
0086 typename detector<Default, void, Template, Args...>::type;
0087
0088 }
0089
0090 #endif