32 namespace format2impl {
34 template <
typename... All >
37 template <
typename Head,
typename... Tail >
38 struct Tuple< Head, Tail... >
41 Tuple< Tail... > tail;
43 Tuple< Head, Tail...>(
const Head& head_,
const Tail&... tail_)
44 : head(head_), tail(tail_...)
52 template <
typename... Args >
53 string tupleformat(Tuple<>, Args... args)
55 char formattedBuffer[4096];
57 auto bytesWritten = snprintf(formattedBuffer,
sizeof(formattedBuffer), args...);
59 if ((
size_t)bytesWritten <
sizeof(formattedBuffer))
61 return string(formattedBuffer);
66 auto size = bytesWritten+1;
67 char* dynamicBuffer =
new char[size];
68 snprintf(dynamicBuffer, size, args...);
69 string result(dynamicBuffer);
70 delete [] dynamicBuffer;
75 template<
typename TupleT,
typename... Args >
76 string tupleformat(TupleT&& tuple, Args... args)
78 return tupleformat(tuple.tail, args..., tuple.head);
81 template <
typename... TupleTailT,
typename... Args >
82 string tupleformat(Tuple< string, TupleTailT... > tuple, Args... args)
84 return tupleformat(tuple.tail, args..., tuple.head.c_str());
92 template <
typename... Args >
93 string format2(
const char* format,
const Args&... args)
95 return internal::format2impl::tupleformat(
96 internal::format2impl::Tuple< const char*, Args... >(format, args...));
99 template <
typename... Args >
100 string format2(
const string& format,
const Args&... args)
102 return format2(format.c_str(), args...);
105 template <
typename... Args >
106 string format2e(
const char* format,
const Args&... args)
108 char errorBuffer[255] =
"?";
110 auto errorString = strerror_r(errno, errorBuffer,
sizeof(errorBuffer));
112 return format2(format, args...) +
": " + errorString;
115 template <
typename... Args >
116 string format2e(
const string& format,
const Args&... args)
118 return format2e(format.c_str(), args...);
121 CUPT_API
void __mwrite_line(
const char*,
const string&);
123 template <
typename... Args >
124 __attribute ((noreturn)) void fatal2(const
string& format, const Args&... args)
126 auto errorString = format2(format, args...);
127 __mwrite_line(
"E: ", errorString);
128 throw Exception(errorString);
131 template <
typename... Args >
132 void fatal2i(
const char* format,
const Args&... args)
134 fatal2((
string(
"internal error: ") + format), args...);
137 template <
typename... Args >
138 void fatal2e(
const string& format,
const Args&... args)
140 auto errorString = format2e(format, args...);
141 __mwrite_line(
"E: ", errorString);
142 throw Exception(errorString);
145 template <
typename... Args >
146 void warn2(
const string& format,
const Args&... args)
148 __mwrite_line(
"W: ", format2(format, args...));
151 template <
typename... Args >
152 void warn2e(
const string& format,
const Args&... args)
154 __mwrite_line(
"W: ", format2e(format, args...));
157 template <
typename... Args >
158 void debug2(
const char* format,
const Args&... args)
160 __mwrite_line(
"D: ", format2(format, args...));
163 template <
typename... Args >
164 void simulate2(
const char* format,
const Args&... args)
166 __mwrite_line(
"S: ", format2(format, args...));