// Copyright (C) 2020 T. Zachary Laine // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_PARSER_DETAIL_DETECTION_HPP #define BOOST_PARSER_DETAIL_DETECTION_HPP #include namespace boost::parser::detail { template struct void_ { using type = void; static constexpr bool value = true; }; template using void_t = typename void_::type; template struct fixup_ptr { using type = T; }; template using remove_v_t = typename std::remove_volatile::type; template struct fixup_ptr { using type = remove_v_t const *; }; template using fixup_ptr_t = typename fixup_ptr::type; template using remove_cv_ref_t = typename std::remove_cv::type>::type; struct nonesuch {}; template< typename Default, typename AlwaysVoid, template class Template, typename... Args> struct detector { using value_t = std::false_type; using type = Default; }; template< typename Default, template class Template, typename... Args> struct detector>, Template, Args...> { using value_t = std::true_type; using type = Template; }; template class Template, typename... Args> using is_detected = typename detector::value_t; template class Template, typename... Args> constexpr bool is_detected_v = is_detected::value; template class Template, typename... Args> using detected_t = typename detector::type; template< typename Default, template class Template, typename... Args> using detected_or_t = typename detector::type; } #endif