1#ifndef ANDROID_PDX_RPC_COPY_CV_REFERENCE_H_
2#define ANDROID_PDX_RPC_COPY_CV_REFERENCE_H_
3
4#include <type_traits>
5
6namespace android {
7namespace pdx {
8namespace 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.
13template <typename T, typename U>
14class 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
36template <typename T, typename U>
37using 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