// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#pragma once

#include <inttypes.h>
#include <stdio.h>

// TODO(johngro) : replace this with a system which...
//
// 1) Uses low overhead logging service infrastructure instead of printf.
// 2) Uses C/C++ functions (either template parameter packs, or c-style
//    var-args) instead of preprocessor macros.

#define VERBOSE_LOGGING 0
#define DEBUG_LOGGING (VERBOSE_LOGGING || 0)

#define LOG_EX(obj, ...) do { \
    (obj).PrintDebugPrefix(); \
    printf(__VA_ARGS__);      \
} while (false)

#define LOG(...) LOG_EX(*this, __VA_ARGS__)

#define DEBUG_LOG_EX(obj, ...) do {     \
    if (DEBUG_LOGGING) {                \
        (obj).PrintDebugPrefix();       \
        printf(__VA_ARGS__);            \
    }                                   \
} while (false)

#define DEBUG_LOG(...) DEBUG_LOG_EX(*this, __VA_ARGS__)

#define VERBOSE_LOG_EX(obj, ...) do {   \
    if (VERBOSE_LOGGING) {              \
        (obj).PrintDebugPrefix();       \
        printf(__VA_ARGS__);            \
    }                                   \
} while (false)

#define VERBOSE_LOG(...) VERBOSE_LOG_EX(*this, __VA_ARGS__)
