33namespace format2impl {
35template <
typename... All >
38template <
typename Head,
typename... Tail >
39struct Tuple< Head, Tail... >
42 Tuple< Tail... > tail;
44 Tuple< Head, Tail...>(
const Head& head_,
const Tail&... tail_)
45 : head(head_), tail(tail_...)
53template <
typename... Args >
54string 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;
76template<
typename TupleT,
typename... Args >
77string tupleformat(TupleT&& tuple, Args... args)
79 return tupleformat(tuple.tail, args..., tuple.head);
82template <
typename... TupleTailT,
typename... Args >
83string tupleformat(Tuple< string, TupleTailT... > tuple, Args... args)
85 return tupleformat(tuple.tail, args..., tuple.head.c_str());
93template <
typename... Args >
94string format2(
const char* format,
const Args&... args)
96 return internal::format2impl::tupleformat(
97 internal::format2impl::Tuple< const char*, Args... >(format, args...));
100template <
typename... Args >
101string format2(
const string& format,
const Args&... args)
103 return format2(format.c_str(), args...);
106template <
typename... Args >
107string 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;
116template <
typename... Args >
117string format2e(
const string& format,
const Args&... args)
119 return format2e(format.c_str(), args...);
122CUPT_API
void __mwrite_line(
const char*,
const string&);
124template <
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);
132template <
typename... Args >
133[[noreturn]]
void fatal2i(
const char* format,
const Args&... args)
135 fatal2((
string(
"internal error: ") + format), args...);
138template <
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);
146template <
typename... Args >
147void warn2(
const string& format,
const Args&... args)
149 __mwrite_line(
"W: ", format2(format, args...));
152template <
typename... Args >
153void warn2e(
const string& format,
const Args&... args)
155 __mwrite_line(
"W: ", format2e(format, args...));
158template <
typename... Args >
159void debug2(
const char* format,
const Args&... args)
161 __mwrite_line(
"D: ", format2(format, args...));
164template <
typename... Args >
165void simulate2(
const char* format,
const Args&... args)
167 __mwrite_line(
"S: ", format2(format, args...));