/*******************************************************************************
 *
 * File:     config.h
 *
 * Contents: Configuration nformation on the build of the library.
 *
 * Copyright 2017
 *
 * Author: David Juhasz (david.juhasz@tuwien.ac.at)
 *
 ******************************************************************************/

#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"
#define __FILENAME__ (__FILE__ + project_relative_path_index(__FILE__))

// Convenience macros.
#define ROSA_VOID_STMT static_cast<void>(0)

#define ROSA_IGNORE_UNUSED(x) static_cast<void>(x)

#define ROSA_CRITICAL(error)                                                   \
  do {                                                                         \
    std::cerr << "[FATAL] " << __func__ << "@" << __FILENAME__ << ":"          \
              << __LINE__ << ": critical error: '" << (error) << "'"           \
              << std::endl;                                                    \
    ::abort();                                                                 \
  } while (false)

#define ROSA_RAISE_ERROR(msg) throw std::runtime_error(msg)

#endif // ROSA_CONFIG_CONFIG_H

