#ifndef TMWA_COMPAT_CAST_HPP #define TMWA_COMPAT_CAST_HPP # include "../sanity.hpp" # include # include template const T& const_(T& t) { return t; } template T no_cast(U&& u) { typedef typename std::remove_reference::type Ti; typedef typename std::remove_reference::type Ui; typedef typename std::remove_cv::type Tb; typedef typename std::remove_cv::type Ub; static_assert(std::is_same::value, "not no cast"); return std::forward(u); } template T base_cast(U&& u) { static_assert(std::is_reference::value, "must base cast with references"); typedef typename std::remove_reference::type Ti; typedef typename std::remove_reference::type Ui; typedef typename std::remove_cv::type Tb; typedef typename std::remove_cv::type Ub; static_assert(std::is_base_of::value, "not base cast"); return std::forward(u); } // use this when e.g. U is an int of unknown size template T maybe_cast(U u) { return u; } template typename std::remove_pointer::type *sign_cast(U *u) { typedef typename std::remove_pointer::type T_; static_assert(sizeof(T_) == sizeof(U), "sign cast must be same size"); return reinterpret_cast(u); } #endif // TMWA_COMPAT_CAST_HPP