// 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__)
