diff options
author | Ben Longbons <b.r.longbons@gmail.com> | 2014-03-15 19:34:59 -0700 |
---|---|---|
committer | Ben Longbons <b.r.longbons@gmail.com> | 2014-03-16 18:58:48 -0700 |
commit | c812c92d1a1835f0bda783e709481188c8d92225 (patch) | |
tree | b401ede48a088ad1aaed88fe3b997cd26ff7ae08 /src/compat/cast.hpp | |
parent | de9ee1b9754af9d954487121947352f32d7ebb7e (diff) | |
download | tmwa-c812c92d1a1835f0bda783e709481188c8d92225.tar.gz tmwa-c812c92d1a1835f0bda783e709481188c8d92225.tar.bz2 tmwa-c812c92d1a1835f0bda783e709481188c8d92225.tar.xz tmwa-c812c92d1a1835f0bda783e709481188c8d92225.zip |
Clean up header organization
Diffstat (limited to 'src/compat/cast.hpp')
-rw-r--r-- | src/compat/cast.hpp | 54 |
1 files changed, 54 insertions, 0 deletions
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 <utility> +# include <type_traits> + + +template<class T> +const T& const_(T& t) +{ + return t; +} + +template<class T, class U> +T no_cast(U&& u) +{ + typedef typename std::remove_reference<T>::type Ti; + typedef typename std::remove_reference<U>::type Ui; + typedef typename std::remove_cv<Ti>::type Tb; + typedef typename std::remove_cv<Ui>::type Ub; + static_assert(std::is_same<Tb, Ub>::value, "not no cast"); + return std::forward<U>(u); +} + +template<class T, class U> +T base_cast(U&& u) +{ + static_assert(std::is_reference<T>::value, "must base cast with references"); + typedef typename std::remove_reference<T>::type Ti; + typedef typename std::remove_reference<U>::type Ui; + typedef typename std::remove_cv<Ti>::type Tb; + typedef typename std::remove_cv<Ui>::type Ub; + static_assert(std::is_base_of<Tb, Ub>::value, "not base cast"); + return std::forward<U>(u); +} + +// use this when e.g. U is an int of unknown size +template<class T, class U> +T maybe_cast(U u) +{ + return u; +} + +template<class T, class U> +typename std::remove_pointer<T>::type *sign_cast(U *u) +{ + typedef typename std::remove_pointer<T>::type T_; + static_assert(sizeof(T_) == sizeof(U), "sign cast must be same size"); + return reinterpret_cast<T_ *>(u); +} + +#endif // TMWA_COMPAT_CAST_HPP |