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