Program Listing for File common.hpp

Return to documentation for file (rcppsw/common/common.hpp)

#pragma once

/*******************************************************************************
 * Includes
 ******************************************************************************/
#include <string>
#include <cxxabi.h>

#include "rcsw/common/common.h"

#include "rcppsw/common/macros.hpp"
#include "rcppsw/mpl/mpl.hpp"

/*******************************************************************************
 * Namespaces/Decls
 ******************************************************************************/
namespace rcppsw {

/*******************************************************************************
 * String Conversion Templates
 ******************************************************************************/
namespace detail {

template <class T>
using to_str_type = decltype(std::declval<T>().to_str());

} /* namespace detail */

template <typename T,
          RCPPSW_SFINAE_DECLDEF(!mpl::is_detected<detail::to_str_type, T>::value)>
std::string to_string(const T& obj) {
  return std::to_string(obj);
}

template <class T,
          RCPPSW_SFINAE_DECLDEF(mpl::is_detected<detail::to_str_type, T>::value)>
std::string to_string(const T& obj) {
  return obj.to_str();
}

/*******************************************************************************
 * Misc. Templates
 ******************************************************************************/
template <typename TEnum>
constexpr typename std::underlying_type<TEnum>::type
as_underlying(const TEnum& e) noexcept {
  return static_cast<typename std::underlying_type<TEnum>::type>(e);
}

} /* namespace rcppsw */