soi-header/include/bits/soi-io.hpp

83 lines
2.4 KiB
C++
Raw Normal View History

2019-10-10 14:19:14 +02:00
#include <iostream>
#include <cassert>
#include <vector>
#include <string>
template <typename T>
T read() {
T x;
std::cin >> x;
return x;
}
int read_int() { return read<int>(); }
char read_char() { return read<char>(); }
double read_double() { return read<double>(); }
std::string read_string() { return read<std::string>(); }
template <typename T>
std::vector<T> read_vector(int n) {
assert(n >= 0);
std::vector<T> v;
v.reserve(n);
std::generate_n(std::back_inserter(v), n, read<T>);
return v;
}
namespace soi {
namespace io {
template <typename T, typename TChar, typename TCharTraits>
inline typename std::enable_if<!::soi::prettyprint::is_container<T>::value,
std::basic_ostream<TChar, TCharTraits> &>::type
print(std::basic_ostream<TChar, TCharTraits> &stream, const T &x) {
return stream << x;
}
template <typename TChar, typename TCharTraits>
inline std::basic_ostream<TChar, TCharTraits>&
print(std::basic_ostream<TChar, TCharTraits> &stream, std::string const& x) {
return stream << x;
}
template <typename TChar, typename TCharTraits>
std::basic_ostream<TChar, TCharTraits> &
print(std::basic_ostream<TChar, TCharTraits> &stream, const bool &x) {
return stream << (x ? "true" : "false");
}
struct space_separated_delims {
static const ::soi::prettyprint::delimiters_values<char> values;
};
const ::soi::prettyprint::delimiters_values<char> space_separated_delims::values = { "", " ", "" };
template <typename T, typename TChar, typename TCharTraits>
inline typename std::enable_if<::soi::prettyprint::is_container<T>::value,
std::basic_ostream<TChar, TCharTraits> &>::type
print(std::basic_ostream<TChar, TCharTraits> &stream, const T &x) {
return ::soi::prettyprint::pretty_print(stream,
soi::prettyprint::custom_delims<space_separated_delims>(x));
}
template <typename T, typename TChar, typename TCharTraits>
void print_with_space(std::basic_ostream<TChar, TCharTraits> &stream, T&& x) {
stream << ' ';
::soi::io::print(stream, std::forward<T>(x));
}
}
}
template <typename Arg, typename... Args>
void print(Arg&& arg, Args&&... args) {
soi::io::print(std::cout, arg);
using expander = bool[];
(void)expander{0, (soi::io::print_with_space(std::cout, std::forward<Args>(args)), false)...};
std::cout << '\n';
}
void print() {
std::cout << '\n';
}