//===-- rosa/config/config.h ------------------------------------*- C++ -*-===//
//
//                                 The RoSA Framework
//
// Distributed under the terms and conditions of the Boost Software License 1.0.
// See accompanying file LICENSE.
//
// If you did not receive a copy of the license file, see
// http://www.boost.org/LICENSE_1_0.txt.
//
//===----------------------------------------------------------------------===//
///
/// \file rosa/config/config.h
///
/// \author David Juhasz (david.juhasz@tuwien.ac.at)
///
/// \date 2017-2019
///
/// \brief Configuration information on the build of the library.
///
//===----------------------------------------------------------------------===//

#ifndef ROSA_CONFIG_CONFIG_H
#define ROSA_CONFIG_CONFIG_H

#include "rosa/config/rosa_config.h"

#include <iostream>

// This OS-specific block defines one of the following:
// - ROSA_LINUX
// - ROSA_WINDOWS
// It also defines ROSA_POSIX for POSIX-compatible systems.
#if defined(__linux__)
#define ROSA_LINUX
#elif defined(WIN32) || defined(_WIN32)
#define ROSA_WINDOWS
#else
#error Platform and/or compiler not supported
#endif
#if defined(ROSA_LINUX)
#define ROSA_POSIX
#endif

// Defining filenames in a project-relative way based on absolute paths.
#include "rosa/config/project_path.hpp"
/// The project-relative path of the current source file.
#define __FILENAME__ (__FILE__ + project_relative_path_index(__FILE__))

// Convenience macros.

/// No-op.
#define ROSA_VOID_STMT static_cast<void>(0)

/// Ignors an expression.
///
/// \param x expression
#define ROSA_IGNORE_UNUSED_EXPR(x) static_cast<void>(x)

/// Ignors a statement (not an expression).
///
/// \param s statement
#define ROSA_IGNORE_UNUSED_STMT(s)                                             \
  while (false) {                                                              \
    s;                                                                         \
  }                                                                            \

/// Prints an error message and aborts execution.
///
/// \param error the error message to print
#define ROSA_CRITICAL(error)                                                   \
  do {                                                                         \
    std::cerr << "[FATAL] " << __func__ << "@" << __FILENAME__ << ":"          \
              << __LINE__ << ": critical error: '" << (error) << "'"           \
              << std::endl;                                                    \
    ::abort();                                                                 \
  } while (false)

/// Raises a runtime error in the program.
///
/// \param msg message describing the error
///
/// \throws std::runtime_error
#define ROSA_RAISE_ERROR(msg) throw std::runtime_error(msg)

#endif // ROSA_CONFIG_CONFIG_H
