io.hpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // Copyright (c) 2016-2025 Antony Polukhin
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #ifndef BOOST_PFR_DETAIL_IO_HPP
  6. #define BOOST_PFR_DETAIL_IO_HPP
  7. #pragma once
  8. #include <boost/pfr/detail/config.hpp>
  9. #include <boost/pfr/detail/sequence_tuple.hpp>
  10. #if !defined(BOOST_PFR_INTERFACE_UNIT)
  11. #include <iosfwd> // stream operators
  12. #include <iomanip>
  13. #if defined(__has_include)
  14. # if __has_include(<string_view>) && BOOST_PFR_USE_CPP17
  15. # include <string_view>
  16. # endif
  17. #endif
  18. #endif
  19. namespace boost { namespace pfr { namespace detail {
  20. inline auto quoted_helper(const std::string& s) noexcept {
  21. return std::quoted(s);
  22. }
  23. #if defined(__has_include)
  24. # if __has_include(<string_view>) && BOOST_PFR_USE_CPP17
  25. template <class CharT, class Traits>
  26. inline auto quoted_helper(std::basic_string_view<CharT, Traits> s) noexcept {
  27. return std::quoted(s);
  28. }
  29. # endif
  30. #endif
  31. inline auto quoted_helper(std::string& s) noexcept {
  32. return std::quoted(s);
  33. }
  34. template <class T>
  35. inline decltype(auto) quoted_helper(T&& v) noexcept {
  36. return std::forward<T>(v);
  37. }
  38. template <std::size_t I, std::size_t N>
  39. struct print_impl {
  40. template <class Stream, class T>
  41. static void print (Stream& out, const T& value) {
  42. if (!!I) out << ", ";
  43. out << detail::quoted_helper(boost::pfr::detail::sequence_tuple::get<I>(value));
  44. print_impl<I + 1, N>::print(out, value);
  45. }
  46. };
  47. template <std::size_t I>
  48. struct print_impl<I, I> {
  49. template <class Stream, class T> static void print (Stream&, const T&) noexcept {}
  50. };
  51. template <std::size_t I, std::size_t N>
  52. struct read_impl {
  53. template <class Stream, class T>
  54. static void read (Stream& in, const T& value) {
  55. char ignore = {};
  56. if (!!I) {
  57. in >> ignore;
  58. if (ignore != ',') in.setstate(Stream::failbit);
  59. in >> ignore;
  60. if (ignore != ' ') in.setstate(Stream::failbit);
  61. }
  62. in >> detail::quoted_helper( boost::pfr::detail::sequence_tuple::get<I>(value) );
  63. read_impl<I + 1, N>::read(in, value);
  64. }
  65. };
  66. template <std::size_t I>
  67. struct read_impl<I, I> {
  68. template <class Stream, class T> static void read (Stream&, const T&) {}
  69. };
  70. }}} // namespace boost::pfr::detail
  71. #endif // BOOST_PFR_DETAIL_IO_HPP