Program Listing for File print_utils.hpp¶
↰ Return to documentation for file (include/uitsl/utility/print_utils.hpp)
#pragma once
#ifndef UITSL_UTILITY_PRINT_UTILS_HPP_INCLUDE
#define UITSL_UTILITY_PRINT_UTILS_HPP_INCLUDE
#include <mutex>
#include <regex>
#include <sstream>
#include <string>
#include <vector>
#include "../../uit_emp/tools/string_utils.hpp"
// TODO be clever and use fewer overloads
namespace uitsl {
inline std::mutex error_message_mutex;
inline std::string apply_indent(std::string in) {
return std::regex_replace(
in,
std::regex{"(^|\n)"},
std::string{"$1"} + std::string(3, ' ')
);
}
template<typename T>
inline std::string format_member(
const std::string & name,
const T& member
) {
std::stringstream ss;
ss << name << ":" << '\n';
ss << uitsl::apply_indent(member.ToString());
return ss.str();
}
template<>
inline std::string format_member<std::string>(
const std::string & name,
const std::string& member
) {
std::stringstream ss;
ss << name << ":" << '\n';
ss << apply_indent(member);
return ss.str();
}
template<>
inline std::string format_member<char>(
const std::string & name,
const char& member
) {
std::stringstream ss;
ss << name << ":" << '\n';
ss << apply_indent(
[member](){ std::stringstream ss; ss << member; return ss.str(); }()
);
return ss.str();
}
template<>
inline std::string format_member<size_t>(
const std::string & name,
const size_t& member
) {
std::stringstream ss;
ss << name << ":" << '\n';
ss << apply_indent(
std::to_string(member)
);
return ss.str();
}
template<>
inline std::string format_member<int>(
const std::string & name,
const int& member
) {
std::stringstream ss;
ss << name << ":" << '\n';
ss << apply_indent(
std::to_string(member)
);
return ss.str();
}
template<>
inline std::string format_member<bool>(
const std::string & name,
const bool& member
) {
std::stringstream ss;
ss << name << ":" << '\n';
ss << apply_indent(
std::to_string(member)
);
return ss.str();
}
template<>
inline std::string format_member<const void *>(
const std::string & name,
const void* const& member
) {
std::stringstream ss;
ss << name << ":" << '\n';
ss << apply_indent(
[member](){ std::stringstream ss; ss << member; return ss.str(); }()
);
return ss.str();
}
template<typename T>
std::string to_string(const T & container) {
std::vector<std::string> res;
std::transform(
std::begin(container),
std::end(container),
std::back_inserter(res),
[](const auto & x){ return uit_emp::to_string(x); }
);
return uit_emp::join_on(res, ", ");
}
} // namespace uitsl
#endif // #ifndef UITSL_UTILITY_PRINT_UTILS_HPP_INCLUDE