enum trace_channels_e
{
D_COMMON = 0,
D_ME,
NUM_TRACE_CHANNELS
};
class simple_tracer
{
private:
vector<ostream*> _out {vector<ostream*>(NUM_TRACE_CHANNELS, &cout)};
vector<bool> _ch_enables{vector<bool>(NUM_TRACE_CHANNELS, true)};
char _buf[256];
simple_tracer(){}
simple_tracer(const simple_tracer& ) = delete;
static simple_tracer& get() { static simple_tracer inst; return inst; }
public:
static void trace(trace_channels_e channel, const char* format, ...)
{
if(get()._out[channel] && get()._ch_enables[channel])
{
va_list args;
va_start(args, format);
vsnprintf(get()._buf, 255, format, args);
va_end(args);
*(get()._out) << get()._buf;
}
}
static void disable_channel(trace_channels_e channel) { get()._ch_enables[channel] = false; }
static void enable_channel(trace_channels_e channel) { get()._ch_enables[channel] = true; }
static void set_ostream(trace_channels_e channel, ostream& os) { get()._out[channel] = &os; }
};
#if ENABLE_TRACING
#define DTRACE(channel, ...) simple_tracer::trace(channel, __VA_ARGS__)
#else
#define DTRACE(...)
#endif
내가 직접 이렇게 만들어서 쓰려니 은근히 불편하네
댓글 0