Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-17 09:54:40

0001 // Copyright (C) 2019 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_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     /** An enumeration used to indicate whether the underlying data have a
0022         contiguous or discontiguous layout when instantiating `view_interface`
0023         and `sequence_container_interface`. */
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