// 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_CONCEPTS_HPP #define BOOST_PARSER_CONCEPTS_HPP #include #include #include #if defined(BOOST_PARSER_DOXYGEN) || BOOST_PARSER_USE_CONCEPTS #include namespace boost { namespace parser { //[ all_concepts template concept code_unit = std::same_as, char> || std::same_as, wchar_t> || std::same_as, char8_t> || std::same_as, char16_t>|| std::same_as, char32_t>; template concept parsable_iter = std::forward_iterator && code_unit>; //[ parsable_range_like_concept //[ parsable_range_concept template concept parsable_range = std::ranges::forward_range && code_unit>; //] template concept parsable_pointer = std::is_pointer_v> && code_unit>>; template concept parsable_range_like = parsable_range || parsable_pointer; //] template concept range_like = std::ranges::range || parsable_pointer; template< typename I, typename S, typename ErrorHandler, typename GlobalState> using minimal_parse_context = decltype(detail::make_context( std::declval(), std::declval(), std::declval(), std::declval(), std::declval(), std::declval(), std::declval(), std::declval())); template concept error_handler = requires ( T const & t, I first, S last, parse_error const & e, diagnostic_kind kind, std::string_view message, minimal_parse_context< I, S, T, GlobalState> const & context) { { t(first, last, e) } -> std::same_as; t.diagnose(kind, message, context, first); t.diagnose(kind, message, context); }; //[ container_concept template concept container = std::ranges::common_range && requires(T t) { { t.insert(t.begin(), *t.begin()) } -> std::same_as>; }; //] //] namespace detail { template concept container_and_value_type = container && (std::is_same_v, U> || (std::is_same_v && std::is_same_v)); } }} #endif #endif