1 #ifndef NTA_FORMATTER_H_INCLUDED
2 #define NTA_FORMATTER_H_INCLUDED
8 #include "nta/MyEngine.h"
9 #include "nta/type_traits.h"
18 template<
typename... Args>
19 std::string
format(
const std::string& fmt, Args&&... args);
22 template<
typename T,
typename Enable =
void>
26 struct Formatter<T, typename std::enable_if_t<can_cout<T>>> {
27 std::string operator()(
const T& arg) {
28 std::ostringstream os;
36 std::string operator()(
const bool& arg) {
37 return arg ?
"true" :
"false";
42 std::string operator()(
const glm::vec2& arg) {
43 return format(
"({}, {})", arg.x, arg.y);
48 std::string operator()(
const glm::vec3& arg) {
49 return format(
"({}, {}, {})", arg.x, arg.y, arg.z);
54 std::string operator()(
const glm::vec4& arg) {
55 return format(
"({}, {}, {}, {})", arg.x, arg.y, arg.z, arg.w);
60 std::string operator()(
const glm::ivec2& arg) {
61 return format(
"({}, {})", arg.x, arg.y);
66 std::string operator()(
const glm::ivec3& arg) {
67 return format(
"({}, {}, {})", arg.x, arg.y, arg.z);
72 std::string operator()(
const glm::ivec4& arg) {
73 return format(
"({}, {}, {}, {})", arg.x, arg.y, arg.z, arg.w);
77 extern std::string format_helper(std::string& sofar,
const std::string& fmt);
78 template<
typename T,
typename... Args>
79 std::string format_helper(std::string& sofar,
const std::string& fmt,
80 const T& arg0, Args&&... args) {
81 auto end = fmt.find(
"{}", 0);
82 auto arg = end == std::string::npos ?
"" :
Formatter<T>()(arg0);
83 auto rest = end == std::string::npos ?
"" : fmt.substr(end+2);
84 sofar += fmt.substr(0, end) + arg;
85 return format_helper(sofar, rest, std::forward<Args>(args)...);
87 template<
typename... Args>
88 std::string
format(
const std::string& fmt, Args&&... args) {
90 return format_helper(ret, fmt, std::forward<Args>(args)...);
92 template<
typename... Args>
93 std::ostream& print(
const std::string& fmt, Args&&... args) {
94 return std::cout<<format(fmt, std::forward<Args>(args)...);
96 template<
typename... Args>
97 std::ostream& println(
const std::string& fmt, Args&&... args) {
98 return std::cout<<format(fmt, std::forward<Args>(args)...)<<std::endl;
103 #endif // NTA_FORMATTER_H_INCLUDED