/*******************************************************************************
 *
 * File:     type_helper.hpp
 *
 * Contents: Helper facilities for type-related stuff.
 *
 * Copyright 2017
 *
 * Author: David Juhasz (david.juhasz@tuwien.ac.at)
 *
 ******************************************************************************/

#ifndef ROSA_SUPPORT_TYPE_HELPER_HPP
#define ROSA_SUPPORT_TYPE_HELPER_HPP

#include <cstdint>

namespace rosa {

/* ************************************************************************** *
 *                                 Printable                                  *
 * ************************************************************************** */

// A value of type [u]int8_t is treated as a character when being put to an
// output stream, which can result in invisible characters being printed. To
// avoid that, such a value needs to be casted to a wider type. It can be done
// by using the following template to find a target type to cast our value to.
// NOTE: There is a preprocessor macro below which can be used instead of the
// tedious typename stuff.
template <typename T>
struct PrintableType {
  using Type = T;
};

template <>
struct PrintableType<uint8_t> {
  using Type = unsigned int;
};

template <>
struct PrintableType<int8_t> {
  using Type = int;
};

#define PRINTABLE(T) typename PrintableType<T>::Type

} // End namespace rosa

#endif // ROSA_SUPPORT_TYPE_HELPER_HPP

