fwd.hpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // Copyright (C) 2019 T. Zachary Laine
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See
  4. // accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. #ifndef BOOST_PARSER_DETAIL_STL_INTERFACES_FWD_HPP
  7. #define BOOST_PARSER_DETAIL_STL_INTERFACES_FWD_HPP
  8. #include <boost/parser/detail/stl_interfaces/config.hpp>
  9. #if BOOST_PARSER_DETAIL_STL_INTERFACES_USE_CONCEPTS
  10. #include <ranges>
  11. #endif
  12. #if defined(__cpp_lib_three_way_comparison)
  13. #include <compare>
  14. #endif
  15. namespace boost::parser::detail { namespace stl_interfaces {
  16. /** An enumeration used to indicate whether the underlying data have a
  17. contiguous or discontiguous layout when instantiating `view_interface`
  18. and `sequence_container_interface`. */
  19. enum class element_layout : bool {
  20. discontiguous = false,
  21. contiguous = true
  22. };
  23. BOOST_PARSER_DETAIL_STL_INTERFACES_NAMESPACE_V1 {
  24. namespace v1_dtl {
  25. template<typename... T>
  26. using void_t = void;
  27. template<typename Iter>
  28. using iter_difference_t =
  29. typename std::iterator_traits<Iter>::difference_type;
  30. template<typename Range, typename = void>
  31. struct iterator;
  32. template<typename Range>
  33. struct iterator<
  34. Range,
  35. void_t<decltype(std::declval<Range &>().begin())>>
  36. {
  37. using type = decltype(std::declval<Range &>().begin());
  38. };
  39. template<typename Range>
  40. using iterator_t = typename iterator<Range>::type;
  41. template<typename Range, typename = void>
  42. struct sentinel;
  43. template<typename Range>
  44. struct sentinel<
  45. Range,
  46. void_t<decltype(std::declval<Range &>().end())>>
  47. {
  48. using type = decltype(std::declval<Range &>().end());
  49. };
  50. template<typename Range>
  51. using sentinel_t = typename sentinel<Range>::type;
  52. template<typename Range>
  53. using range_difference_t = iter_difference_t<iterator_t<Range>>;
  54. template<typename Range>
  55. using common_range =
  56. std::is_same<iterator_t<Range>, sentinel_t<Range>>;
  57. template<typename Range, typename = void>
  58. struct decrementable_sentinel : std::false_type
  59. {
  60. };
  61. template<typename Range>
  62. struct decrementable_sentinel<
  63. Range,
  64. void_t<decltype(--std::declval<sentinel_t<Range> &>())>>
  65. : std::true_type
  66. {
  67. };
  68. }
  69. }
  70. }}
  71. #endif