1#ifndef ANDROID_PDX_RPC_FIND_REPLACE_H_
2#define ANDROID_PDX_RPC_FIND_REPLACE_H_
3
4#include <type_traits>
5
6#include <pdx/rpc/copy_cv_reference.h>
7
8namespace android {
9namespace pdx {
10namespace rpc {
11
12// Utility class to capture types to find and replace.
13template <typename Find, typename Replace>
14struct FindReplace;
15
16template <typename T, typename U>
17using IsSameBaseType = typename std::is_same<typename std::decay<T>::type,
18                                             typename std::decay<U>::type>;
19
20// Replaces the type Subject with type Replace if type Subject is the same type
21// as type Find, excluding cv-reference qualifiers in the match.
22template <typename Find, typename Replace, typename Subject>
23using ReplaceType =
24    typename std::conditional<IsSameBaseType<Find, Subject>::value,
25                              CopyCVReferenceType<Subject, Replace>,
26                              Subject>::type;
27
28// Determines whether the type Find (excluding cv-reference qualifiers) is in
29// the given parameter pack.
30template <typename Find, typename... Types>
31struct ContainsType : std::true_type {};
32
33template <typename Find, typename First, typename... Rest>
34struct ContainsType<Find, First, Rest...>
35    : std::conditional<IsSameBaseType<Find, First>::value, std::true_type,
36                       ContainsType<Find, Rest...>>::type {};
37
38template <typename Find>
39struct ContainsType<Find> : std::false_type {};
40
41}  // namespace rpc
42}  // namespace pdx
43}  // namespace android
44
45#endif  //  ANDROID_PDX_RPC_FIND_REPLACE_H_
46