86 lines
2.3 KiB
C++
86 lines
2.3 KiB
C++
|
// Copyright (c) 2016-2022 Antony Polukhin
|
||
|
//
|
||
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||
|
|
||
|
#ifndef BOOST_PFR_DETAIL_IO_HPP
|
||
|
#define BOOST_PFR_DETAIL_IO_HPP
|
||
|
#pragma once
|
||
|
|
||
|
#include <boost/pfr/detail/config.hpp>
|
||
|
|
||
|
#include <boost/pfr/detail/sequence_tuple.hpp>
|
||
|
#include <iosfwd> // stream operators
|
||
|
#include <iomanip>
|
||
|
|
||
|
#if defined(__has_include)
|
||
|
# if __has_include(<string_view>) && BOOST_PFR_USE_CPP17
|
||
|
# include <string_view>
|
||
|
# endif
|
||
|
#endif
|
||
|
|
||
|
namespace boost { namespace pfr { namespace detail {
|
||
|
|
||
|
inline auto quoted_helper(const std::string& s) noexcept {
|
||
|
return std::quoted(s);
|
||
|
}
|
||
|
|
||
|
#if defined(__has_include)
|
||
|
# if __has_include(<string_view>) && BOOST_PFR_USE_CPP17
|
||
|
template <class CharT, class Traits>
|
||
|
inline auto quoted_helper(std::basic_string_view<CharT, Traits> s) noexcept {
|
||
|
return std::quoted(s);
|
||
|
}
|
||
|
# endif
|
||
|
#endif
|
||
|
|
||
|
inline auto quoted_helper(std::string& s) noexcept {
|
||
|
return std::quoted(s);
|
||
|
}
|
||
|
|
||
|
template <class T>
|
||
|
inline decltype(auto) quoted_helper(T&& v) noexcept {
|
||
|
return std::forward<T>(v);
|
||
|
}
|
||
|
|
||
|
template <std::size_t I, std::size_t N>
|
||
|
struct print_impl {
|
||
|
template <class Stream, class T>
|
||
|
static void print (Stream& out, const T& value) {
|
||
|
if (!!I) out << ", ";
|
||
|
out << detail::quoted_helper(boost::pfr::detail::sequence_tuple::get<I>(value));
|
||
|
print_impl<I + 1, N>::print(out, value);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
template <std::size_t I>
|
||
|
struct print_impl<I, I> {
|
||
|
template <class Stream, class T> static void print (Stream&, const T&) noexcept {}
|
||
|
};
|
||
|
|
||
|
|
||
|
template <std::size_t I, std::size_t N>
|
||
|
struct read_impl {
|
||
|
template <class Stream, class T>
|
||
|
static void read (Stream& in, const T& value) {
|
||
|
char ignore = {};
|
||
|
if (!!I) {
|
||
|
in >> ignore;
|
||
|
if (ignore != ',') in.setstate(Stream::failbit);
|
||
|
in >> ignore;
|
||
|
if (ignore != ' ') in.setstate(Stream::failbit);
|
||
|
}
|
||
|
in >> detail::quoted_helper( boost::pfr::detail::sequence_tuple::get<I>(value) );
|
||
|
read_impl<I + 1, N>::read(in, value);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
template <std::size_t I>
|
||
|
struct read_impl<I, I> {
|
||
|
template <class Stream, class T> static void read (Stream&, const T&) {}
|
||
|
};
|
||
|
|
||
|
}}} // namespace boost::pfr::detail
|
||
|
|
||
|
#endif // BOOST_PFR_DETAIL_IO_HPP
|