Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-09-17 08:40:27

0001 // Copyright (C) 2020 T. Zachary Laine
0002 //
0003 // Distributed under the Boost Software License, Version 1.0. (See
0004 // accompanying file LICENSE_1_0.txt or copy at
0005 // http://www.boost.org/LICENSE_1_0.txt)
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