1//===-- sanitizer_type_traits.h ---------------------------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// Implements a subset of C++ type traits. This is so we can avoid depending 10// on system C++ headers. 11// 12//===----------------------------------------------------------------------===// 13#ifndef SANITIZER_TYPE_TRAITS_H 14#define SANITIZER_TYPE_TRAITS_H 15 16namespace __sanitizer { 17 18struct true_type { 19 static const bool value = true; 20}; 21 22struct false_type { 23 static const bool value = false; 24}; 25 26// is_same<T, U> 27// 28// Type trait to compare if types are the same. 29// E.g. 30// 31// ``` 32// is_same<int,int>::value - True 33// is_same<int,char>::value - False 34// ``` 35template <typename T, typename U> 36struct is_same : public false_type {}; 37 38template <typename T> 39struct is_same<T, T> : public true_type {}; 40 41// conditional<B, T, F> 42// 43// Defines type as T if B is true or as F otherwise. 44// E.g. the following is true 45// 46// ``` 47// is_same<int, conditional<true, int, double>::type>::value 48// is_same<double, conditional<false, int, double>::type>::value 49// ``` 50template <bool B, class T, class F> 51struct conditional { 52 using type = T; 53}; 54 55template <class T, class F> 56struct conditional<false, T, F> { 57 using type = F; 58}; 59 60} // namespace __sanitizer 61 62#endif 63