xref: /aosp_15_r20/external/pdfium/third_party/base/template_util.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker 
5*3ac0a46fSAndroid Build Coastguard Worker #ifndef THIRD_PARTY_BASE_TEMPLATE_UTIL_H_
6*3ac0a46fSAndroid Build Coastguard Worker #define THIRD_PARTY_BASE_TEMPLATE_UTIL_H_
7*3ac0a46fSAndroid Build Coastguard Worker 
8*3ac0a46fSAndroid Build Coastguard Worker #include <stddef.h>
9*3ac0a46fSAndroid Build Coastguard Worker #include <iosfwd>
10*3ac0a46fSAndroid Build Coastguard Worker #include <iterator>
11*3ac0a46fSAndroid Build Coastguard Worker #include <type_traits>
12*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
13*3ac0a46fSAndroid Build Coastguard Worker 
14*3ac0a46fSAndroid Build Coastguard Worker #include "build/build_config.h"
15*3ac0a46fSAndroid Build Coastguard Worker 
16*3ac0a46fSAndroid Build Coastguard Worker namespace pdfium {
17*3ac0a46fSAndroid Build Coastguard Worker 
18*3ac0a46fSAndroid Build Coastguard Worker template <class T> struct is_non_const_reference : std::false_type {};
19*3ac0a46fSAndroid Build Coastguard Worker template <class T> struct is_non_const_reference<T&> : std::true_type {};
20*3ac0a46fSAndroid Build Coastguard Worker template <class T> struct is_non_const_reference<const T&> : std::false_type {};
21*3ac0a46fSAndroid Build Coastguard Worker 
22*3ac0a46fSAndroid Build Coastguard Worker namespace internal {
23*3ac0a46fSAndroid Build Coastguard Worker 
24*3ac0a46fSAndroid Build Coastguard Worker // Uses expression SFINAE to detect whether using operator<< would work.
25*3ac0a46fSAndroid Build Coastguard Worker template <typename T, typename = void>
26*3ac0a46fSAndroid Build Coastguard Worker struct SupportsOstreamOperator : std::false_type {};
27*3ac0a46fSAndroid Build Coastguard Worker template <typename T>
28*3ac0a46fSAndroid Build Coastguard Worker struct SupportsOstreamOperator<T,
29*3ac0a46fSAndroid Build Coastguard Worker                                decltype(void(std::declval<std::ostream&>()
30*3ac0a46fSAndroid Build Coastguard Worker                                              << std::declval<T>()))>
31*3ac0a46fSAndroid Build Coastguard Worker     : std::true_type {};
32*3ac0a46fSAndroid Build Coastguard Worker 
33*3ac0a46fSAndroid Build Coastguard Worker // Used to detech whether the given type is an iterator.  This is normally used
34*3ac0a46fSAndroid Build Coastguard Worker // with std::enable_if to provide disambiguation for functions that take
35*3ac0a46fSAndroid Build Coastguard Worker // templatzed iterators as input.
36*3ac0a46fSAndroid Build Coastguard Worker template <typename T, typename = void>
37*3ac0a46fSAndroid Build Coastguard Worker struct is_iterator : std::false_type {};
38*3ac0a46fSAndroid Build Coastguard Worker 
39*3ac0a46fSAndroid Build Coastguard Worker template <typename T>
40*3ac0a46fSAndroid Build Coastguard Worker struct is_iterator<
41*3ac0a46fSAndroid Build Coastguard Worker     T,
42*3ac0a46fSAndroid Build Coastguard Worker     std::void_t<typename std::iterator_traits<T>::iterator_category>>
43*3ac0a46fSAndroid Build Coastguard Worker     : std::true_type {};
44*3ac0a46fSAndroid Build Coastguard Worker 
45*3ac0a46fSAndroid Build Coastguard Worker }  // namespace internal
46*3ac0a46fSAndroid Build Coastguard Worker 
47*3ac0a46fSAndroid Build Coastguard Worker }  // namespace pdfium
48*3ac0a46fSAndroid Build Coastguard Worker 
49*3ac0a46fSAndroid Build Coastguard Worker #endif  // THIRD_PARTY_BASE_TEMPLATE_UTIL_H_
50