1 #ifndef ANDROID_PDX_RPC_COPY_CV_REFERENCE_H_ 2 #define ANDROID_PDX_RPC_COPY_CV_REFERENCE_H_ 3 4 #include <type_traits> 5 6 namespace android { 7 namespace pdx { 8 namespace rpc { 9 10 // Copies const, void, and reference qualifiers from type T to type U, such that 11 // the new type U' carries the same cv-reference qualifiers as T, with the same 12 // underlying type as U. 13 template <typename T, typename U> 14 class CopyCVReference { 15 private: 16 using R = typename std::remove_reference<T>::type; 17 using U1 = 18 typename std::conditional<std::is_const<R>::value, 19 typename std::add_const<U>::type, U>::type; 20 using U2 = 21 typename std::conditional<std::is_volatile<R>::value, 22 typename std::add_volatile<U1>::type, U1>::type; 23 using U3 = 24 typename std::conditional<std::is_lvalue_reference<T>::value, 25 typename std::add_lvalue_reference<U2>::type, 26 U2>::type; 27 using U4 = 28 typename std::conditional<std::is_rvalue_reference<T>::value, 29 typename std::add_rvalue_reference<U3>::type, 30 U3>::type; 31 32 public: 33 using Type = U4; 34 }; 35 36 template <typename T, typename U> 37 using CopyCVReferenceType = typename CopyCVReference<T, U>::Type; 38 39 } // namespace rpc 40 } // namespace pdx 41 } // namespace android 42 43 #endif // ANDROID_PDX_RPC_COPY_CV_REFERENCE_H_ 44