From c812c92d1a1835f0bda783e709481188c8d92225 Mon Sep 17 00:00:00 2001 From: Ben Longbons Date: Sat, 15 Mar 2014 19:34:59 -0700 Subject: Clean up header organization --- src/compat/cast.hpp | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/compat/cast.hpp (limited to 'src/compat/cast.hpp') diff --git a/src/compat/cast.hpp b/src/compat/cast.hpp new file mode 100644 index 0000000..c1b9bab --- /dev/null +++ b/src/compat/cast.hpp @@ -0,0 +1,54 @@ +#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 -- cgit v1.2.3-70-g09d2