33 namespace format2impl {
35 template <
typename... All >
38 template <
typename Head,
typename... Tail >
39 struct Tuple< Head, Tail... >
42 Tuple< Tail... > tail;
44 Tuple< Head, Tail...>(
const Head& head_,
const Tail&... tail_)
45 : head(head_), tail(tail_...)
53 template <
typename... Args >
54 string tupleformat(Tuple<>, Args... args)
56 char formattedBuffer[4096];
58 auto bytesWritten = snprintf(formattedBuffer,
sizeof(formattedBuffer), args...);
60 if ((
size_t)bytesWritten <
sizeof(formattedBuffer))
62 return string(formattedBuffer);
67 auto size = bytesWritten+1;
68 char* dynamicBuffer =
new char[size];
69 snprintf(dynamicBuffer, size, args...);
70 string result(dynamicBuffer);
71 delete [] dynamicBuffer;
76 template<
typename TupleT,
typename... Args >
77 string tupleformat(TupleT&& tuple, Args... args)
79 return tupleformat(tuple.tail, args..., tuple.head);
82 template <
typename... TupleTailT,
typename... Args >
83 string tupleformat(Tuple< string, TupleTailT... > tuple, Args... args)
85 return tupleformat(tuple.tail, args..., tuple.head.c_str());
93 template <
typename... Args >
94 string format2(
const char* format,
const Args&... args)
96 return internal::format2impl::tupleformat(
97 internal::format2impl::Tuple< const char*, Args... >(format, args...));
100 template <
typename... Args >
101 string format2(
const string& format,
const Args&... args)
103 return format2(format.c_str(), args...);
106 template <
typename... Args >
107 string format2e(
const char* format,
const Args&... args)
109 char errorBuffer[255] =
"?";
111 auto errorString = strerror_r(errno, errorBuffer,
sizeof(errorBuffer));
113 return format2(format, args...) +
": " + errorString;
116 template <
typename... Args >
117 string format2e(
const string& format,
const Args&... args)
119 return format2e(format.c_str(), args...);
122 CUPT_API
void __mwrite_line(
const char*,
const string&);
124 template <
typename... Args >
125 [[noreturn]]
void fatal2(
const string& format,
const Args&... args)
127 auto errorString = format2(format, args...);
128 __mwrite_line(
"E: ", errorString);
129 throw Exception(errorString);
132 template <
typename... Args >
133 [[noreturn]]
void fatal2i(
const char* format,
const Args&... args)
135 fatal2((
string(
"internal error: ") + format), args...);
138 template <
typename... Args >
139 [[noreturn]]
void fatal2e(
const string& format,
const Args&... args)
141 auto errorString = format2e(format, args...);
142 __mwrite_line(
"E: ", errorString);
143 throw Exception(errorString);
146 template <
typename... Args >
147 void warn2(
const string& format,
const Args&... args)
149 __mwrite_line(
"W: ", format2(format, args...));
152 template <
typename... Args >
153 void warn2e(
const string& format,
const Args&... args)
155 __mwrite_line(
"W: ", format2e(format, args...));
158 template <
typename... Args >
159 void debug2(
const char* format,
const Args&... args)
161 __mwrite_line(
"D: ", format2(format, args...));
164 template <
typename... Args >
165 void simulate2(
const char* format,
const Args&... args)
167 __mwrite_line(
"S: ", format2(format, args...));