in_out_result.hpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. // Copyright (C) 2020 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_TEXT_IN_OUT_RESULT_HPP
  7. #define BOOST_PARSER_DETAIL_TEXT_IN_OUT_RESULT_HPP
  8. #include <boost/parser/detail/text/config.hpp>
  9. namespace boost::parser::detail { namespace text {
  10. /** A replacement for C++20's `std::ranges::in_out_result` for use in
  11. pre-C++20 build modes. */
  12. template<typename I, typename O>
  13. struct in_out_result
  14. {
  15. [[no_unique_address]] I in;
  16. [[no_unique_address]] O out;
  17. };
  18. }}
  19. #if BOOST_PARSER_DETAIL_TEXT_USE_CONCEPTS
  20. #include <ranges>
  21. namespace boost::parser::detail { namespace text { BOOST_PARSER_DETAIL_TEXT_NAMESPACE_V2 {
  22. namespace dtl {
  23. template<typename R>
  24. std::ranges::borrowed_iterator_t<R> result_iterator(R &&);
  25. template<typename Ptr>
  26. requires std::is_pointer_v<std::remove_reference_t<Ptr>>
  27. Ptr result_iterator(Ptr &&);
  28. template<typename T>
  29. using uc_result_iterator =
  30. decltype(dtl::result_iterator(std::declval<T>()));
  31. }
  32. }}}
  33. #endif
  34. #endif