#include "footer.h"
namespace {
template <typename T, typename = void>
struct has_insertion_operator : std::false_type {};
template <typename T>
struct has_insertion_operator<T, std::void_t<decltype(std::declval<std::ostream &>() << std::declval<T>())>> : std::true_type {};
template <typename T>
typename std::enable_if<has_insertion_operator<T>::value, std::ostream &>::type
operator<<(std::ostream &os, const std::optional<T> &value) {
if (value) {
return os << *value;
} else {
return os << "nullopt";
}
}
template <typename T>
typename std::enable_if<has_insertion_operator<T>::value, std::ostream &>::type
operator<<(std::ostream &os, const std::vector<T> &value) {
os << "[ ";
for (auto value_it = value.cbegin(); value_it != value.cend(); ++value_it) {
if (value_it != value.cbegin()) {
os << ", ";
}
os << *value_it;
}
return os << " ]";
}
}
namespace termite {
}