//===-- rosa/config/config.h ------------------------------------*- C++ -*-===//
//
//                                 The RoSA Framework
//
//===----------------------------------------------------------------------===//
///
/// \file rosa/config/config.h
///
/// \author David Juhasz (david.juhasz@tuwien.ac.at)
///
/// \date 2017
///
/// \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 anything.
///
/// \param x anything
#define ROSA_IGNORE_UNUSED(x) static_cast<void>(x)

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