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