1 #pragma once 2 3 #include <type_traits> 4 5 namespace pymol 6 { 7 8 template <bool B, typename T = void> 9 using enable_if_t = typename std::enable_if<B, T>::type; 10 11 template <typename T> 12 using remove_reference_t = typename std::remove_reference<T>::type; 13 14 template <typename T> 15 using remove_cv_t = typename std::remove_cv<T>::type; 16 17 template <typename T> 18 using remove_cvref_t = remove_cv_t<remove_reference_t<T>>; 19 20 template <typename T> 21 using remove_extent_t = typename std::remove_extent<T>::type; 22 23 template <typename T, typename U> 24 using common_type_t = typename std::common_type<T, U>::type; 25 26 // Non-STL 27 template <typename T, typename U> 28 using forward_check_t = pymol::enable_if_t<std::is_same<pymol::remove_reference_t<T>, U>::value>; 29 30 //! Casts a pointer of type T to a pointer of type T[N] reshape(T * flat)31template <size_t N, typename T> remove_reference_t<T (*)[N]> reshape(T* flat) 32 { 33 return reinterpret_cast<T(*)[N]>(flat); 34 } 35 36 //! Casts a pointer of type T[N] to a pointer of type T flatten(T * shaped)37template <typename T> remove_extent_t<T>* flatten(T* shaped) 38 { 39 return reinterpret_cast<remove_extent_t<T>*>(shaped); 40 } 41 } 42