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)31 template <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)37 template <typename T> remove_extent_t<T>* flatten(T* shaped)
38 {
39   return reinterpret_cast<remove_extent_t<T>*>(shaped);
40 }
41 }
42