Back to home page

EIC code displayed by LXR

 
 

    


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

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_CONCEPTS_HPP
0007 #define BOOST_PARSER_CONCEPTS_HPP
0008 
0009 #include <boost/parser/config.hpp>
0010 #include <boost/parser/parser_fwd.hpp>
0011 #include <boost/parser/detail/text/transcode_view.hpp>
0012 
0013 #if defined(BOOST_PARSER_DOXYGEN) || BOOST_PARSER_USE_CONCEPTS
0014 
0015 #include <ranges>
0016 
0017 
0018 namespace boost { namespace parser {
0019 
0020     //[ all_concepts
0021     template<typename T>
0022     concept code_unit =
0023         std::same_as<std::remove_cv_t<T>, char> ||
0024         std::same_as<std::remove_cv_t<T>, wchar_t> ||
0025         std::same_as<std::remove_cv_t<T>, char8_t> ||
0026         std::same_as<std::remove_cv_t<T>, char16_t>||
0027         std::same_as<std::remove_cv_t<T>, char32_t>;
0028 
0029     template<typename T>
0030     concept parsable_iter =
0031         std::forward_iterator<T> && code_unit<std::iter_value_t<T>>;
0032 
0033     //[ parsable_range_like_concept
0034     //[ parsable_range_concept
0035     template<typename T>
0036     concept parsable_range = std::ranges::forward_range<T> &&
0037         code_unit<std::ranges::range_value_t<T>>;
0038     //]
0039 
0040     template<typename T>
0041     concept parsable_pointer = std::is_pointer_v<std::remove_cvref_t<T>> &&
0042         code_unit<std::remove_pointer_t<std::remove_cvref_t<T>>>;
0043 
0044     template<typename T>
0045     concept parsable_range_like = parsable_range<T> || parsable_pointer<T>;
0046     //]
0047 
0048     template<typename T>
0049     concept range_like = std::ranges::range<T> || parsable_pointer<T>;
0050 
0051     template<
0052         typename I,
0053         typename S,
0054         typename ErrorHandler,
0055         typename GlobalState>
0056     using minimal_parse_context = decltype(detail::make_context<false, false>(
0057         std::declval<I>(),
0058         std::declval<S>(),
0059         std::declval<bool &>(),
0060         std::declval<int &>(),
0061         std::declval<ErrorHandler const &>(),
0062         std::declval<detail::nope &>(),
0063         std::declval<detail::symbol_table_tries_t &>(),
0064         std::declval<detail::pending_symbol_table_operations_t &>()));
0065 
0066     template<typename T, typename I, typename S, typename GlobalState>
0067     concept error_handler =
0068         requires (
0069             T const & t,
0070             I first,
0071             S last,
0072             parse_error<I> const & e,
0073             diagnostic_kind kind,
0074             std::string_view message,
0075             minimal_parse_context<
0076                 I, S, T, GlobalState> const & context) {
0077             { t(first, last, e) } -> std::same_as<error_handler_result>;
0078             t.diagnose(kind, message, context, first);
0079             t.diagnose(kind, message, context);
0080         };
0081 
0082     //[ container_concept
0083     template<typename T>
0084     concept container = std::ranges::common_range<T> && requires(T t) {
0085         { t.insert(t.begin(), *t.begin()) }
0086             -> std::same_as<std::ranges::iterator_t<T>>;
0087     };
0088     //]
0089 
0090     //]
0091 
0092     namespace detail {
0093 
0094         template<typename T, typename U>
0095         concept container_and_value_type = container<T> &&
0096             (std::is_same_v<std::ranges::range_value_t<T>, U> ||
0097              (std::is_same_v<T, std::string> && std::is_same_v<U, char32_t>));
0098 
0099     }
0100 
0101 }}
0102 
0103 #endif
0104 
0105 #endif