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