#include <cstdio>
#include <cstdarg>
#include <iostream>
class Logger
{
public:
Logger(){}
~Logger(){}
void info(const char* messageFormat, ...)
{
va_list args;
va_start(args, messageFormat);
std::string infoFormat = this->format<512>("[INFO] %s", messageFormat).c_str();
vlog(infoFormat.c_str(), args);
va_end(args);
}
void vlog(const char* format, va_list args)
{
std::string logMessage = vFormat<512>(format, args);
std::cout<<logMessage<<std::endl;
}
template <size_t BufferSize>
std::string format(const char* format, ...)
{
va_list args;
va_start(args, format);
std::string message = vFormat<BufferSize>(format, args).c_str();
va_end(args);
return message;
}
template <size_t BufferSize>
std::string vFormat(const char* format, va_list args)
{
char buffer[BufferSize];
vsprintf(buffer, format, args);
return std::string(buffer);
}
};
int main()
{
Logger log;
log.info("This is a test with no args!");
log.info("This is a %s with args!", "test");
int n = 3;
double dVal = 22.0/7.0;
log.info("This is a test with %d args (double: %f, string: '%s')", n, dVal, "testString");
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGNzdGRhcmc+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCmNsYXNzIExvZ2dlcgp7CnB1YmxpYzoKICAgIExvZ2dlcigpe30KICAgIH5Mb2dnZXIoKXt9CiAgICAKICAgIHZvaWQgaW5mbyhjb25zdCBjaGFyKiBtZXNzYWdlRm9ybWF0LCAuLi4pCiAgICB7CiAgICAgICAgdmFfbGlzdCBhcmdzOwogICAgICAgIHZhX3N0YXJ0KGFyZ3MsIG1lc3NhZ2VGb3JtYXQpOwogICAgICAgIHN0ZDo6c3RyaW5nIGluZm9Gb3JtYXQgPSB0aGlzLT5mb3JtYXQ8NTEyPigiW0lORk9dICVzIiwgbWVzc2FnZUZvcm1hdCkuY19zdHIoKTsKICAgICAgICB2bG9nKGluZm9Gb3JtYXQuY19zdHIoKSwgYXJncyk7CiAgICAgICAgdmFfZW5kKGFyZ3MpOwogICAgfQogICAgCiAgICB2b2lkIHZsb2coY29uc3QgY2hhciogZm9ybWF0LCB2YV9saXN0IGFyZ3MpCiAgICB7CiAgICAgICAgc3RkOjpzdHJpbmcgbG9nTWVzc2FnZSA9IHZGb3JtYXQ8NTEyPihmb3JtYXQsIGFyZ3MpOwogICAgICAgIHN0ZDo6Y291dDw8bG9nTWVzc2FnZTw8c3RkOjplbmRsOwogICAgfQogICAgCiAgICB0ZW1wbGF0ZSA8c2l6ZV90IEJ1ZmZlclNpemU+CiAgICBzdGQ6OnN0cmluZyBmb3JtYXQoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pCiAgICB7CiAgICAgICAgdmFfbGlzdCBhcmdzOwogICAgICAgIHZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CiAgICAgICAgc3RkOjpzdHJpbmcgbWVzc2FnZSA9IHZGb3JtYXQ8QnVmZmVyU2l6ZT4oZm9ybWF0LCBhcmdzKS5jX3N0cigpOwogICAgICAgIHZhX2VuZChhcmdzKTsKICAgICAgICByZXR1cm4gbWVzc2FnZTsKICAgIH0KICAgIAogICAgdGVtcGxhdGUgPHNpemVfdCBCdWZmZXJTaXplPgogICAgc3RkOjpzdHJpbmcgdkZvcm1hdChjb25zdCBjaGFyKiBmb3JtYXQsIHZhX2xpc3QgYXJncykKICAgIHsKICAgICAgICBjaGFyIGJ1ZmZlcltCdWZmZXJTaXplXTsKICAgICAgICB2c3ByaW50ZihidWZmZXIsIGZvcm1hdCwgYXJncyk7CiAgICAgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKGJ1ZmZlcik7CiAgICB9Cn07CgppbnQgbWFpbigpCnsKICAgIExvZ2dlciBsb2c7CiAgICBsb2cuaW5mbygiVGhpcyBpcyBhIHRlc3Qgd2l0aCBubyBhcmdzISIpOwogICAgbG9nLmluZm8oIlRoaXMgaXMgYSAlcyB3aXRoIGFyZ3MhIiwgInRlc3QiKTsKICAgIGludCBuID0gMzsKICAgIGRvdWJsZSBkVmFsID0gMjIuMC83LjA7CiAgICBsb2cuaW5mbygiVGhpcyBpcyBhIHRlc3Qgd2l0aCAlZCBhcmdzIChkb3VibGU6ICVmLCBzdHJpbmc6ICclcycpIiwgbiwgZFZhbCwgInRlc3RTdHJpbmciKTsKICAgIHJldHVybiAwOwp9