File indexing completed on 2025-12-17 09:54:40
0001
0002
0003
0004
0005
0006 #ifndef BOOST_PARSER_DETAIL_STL_INTERFACES_FWD_HPP
0007 #define BOOST_PARSER_DETAIL_STL_INTERFACES_FWD_HPP
0008
0009 #include <boost/parser/detail/stl_interfaces/config.hpp>
0010
0011 #if BOOST_PARSER_DETAIL_STL_INTERFACES_USE_CONCEPTS
0012 #include <ranges>
0013 #endif
0014 #if defined(__cpp_lib_three_way_comparison)
0015 #include <compare>
0016 #endif
0017
0018
0019 namespace boost::parser::detail { namespace stl_interfaces {
0020
0021
0022
0023
0024 enum class element_layout : bool {
0025 discontiguous = false,
0026 contiguous = true
0027 };
0028
0029 BOOST_PARSER_DETAIL_STL_INTERFACES_NAMESPACE_V1 {
0030
0031 namespace v1_dtl {
0032 template<typename... T>
0033 using void_t = void;
0034
0035 template<typename Iter>
0036 using iter_difference_t =
0037 typename std::iterator_traits<Iter>::difference_type;
0038
0039 template<typename Range, typename = void>
0040 struct iterator;
0041 template<typename Range>
0042 struct iterator<
0043 Range,
0044 void_t<decltype(std::declval<Range &>().begin())>>
0045 {
0046 using type = decltype(std::declval<Range &>().begin());
0047 };
0048 template<typename Range>
0049 using iterator_t = typename iterator<Range>::type;
0050
0051 template<typename Range, typename = void>
0052 struct sentinel;
0053 template<typename Range>
0054 struct sentinel<
0055 Range,
0056 void_t<decltype(std::declval<Range &>().end())>>
0057 {
0058 using type = decltype(std::declval<Range &>().end());
0059 };
0060 template<typename Range>
0061 using sentinel_t = typename sentinel<Range>::type;
0062
0063 template<typename Range>
0064 using range_difference_t = iter_difference_t<iterator_t<Range>>;
0065
0066 template<typename Range>
0067 using common_range =
0068 std::is_same<iterator_t<Range>, sentinel_t<Range>>;
0069
0070 template<typename Range, typename = void>
0071 struct decrementable_sentinel : std::false_type
0072 {
0073 };
0074 template<typename Range>
0075 struct decrementable_sentinel<
0076 Range,
0077 void_t<decltype(--std::declval<sentinel_t<Range> &>())>>
0078 : std::true_type
0079 {
0080 };
0081 }
0082
0083 }
0084 }}
0085
0086 #endif