File indexing completed on 2025-09-17 08:40:31
0001
0002
0003
0004
0005
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
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
0034
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
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