// Copyright 2020 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef INCLUDE_CPPGC_INTERNAL_LOGGING_H_
#define INCLUDE_CPPGC_INTERNAL_LOGGING_H_

#include "cppgc/source-location.h"
#include "v8config.h"  // NOLINT(build/include_directory)

namespace cppgc {
namespace internal {

void V8_EXPORT DCheckImpl(const char*,
                          const SourceLocation& = SourceLocation::Current());
[[noreturn]] void V8_EXPORT
FatalImpl(const char*, const SourceLocation& = SourceLocation::Current());

// Used to ignore -Wunused-variable.
template <typename>
struct EatParams {};

#if DEBUG
#define CPPGC_DCHECK_MSG(condition, message)  \
  do {                                        \
    if (V8_UNLIKELY(!(condition))) {          \
      ::cppgc::internal::DCheckImpl(message); \
    }                                         \
  } while (false)
#else
#define CPPGC_DCHECK_MSG(condition, message)                \
  (static_cast<void>(::cppgc::internal::EatParams<decltype( \
                         static_cast<void>(condition), message)>{}))
#endif

#define CPPGC_DCHECK(condition) CPPGC_DCHECK_MSG(condition, #condition)

#define CPPGC_CHECK_MSG(condition, message)  \
  do {                                       \
    if (V8_UNLIKELY(!(condition))) {         \
      ::cppgc::internal::FatalImpl(message); \
    }                                        \
  } while (false)

#define CPPGC_CHECK(condition) CPPGC_CHECK_MSG(condition, #condition)

}  // namespace internal
}  // namespace cppgc

#endif  // INCLUDE_CPPGC_INTERNAL_LOGGING_H_
