• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===----------------------------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #ifndef SUPPORT_TEST_CONVERTIBLE_HPP
11 #define SUPPORT_TEST_CONVERTIBLE_HPP
12 
13 // "test_convertible<Tp, Args...>()" is a metafunction used to check if 'Tp'
14 // is implicitly convertible from 'Args...' for any number of arguments,
15 // Unlike 'std::is_convertible' which only allows checking for single argument
16 // conversions.
17 
18 #include <type_traits>
19 
20 #include "test_macros.h"
21 
22 #if TEST_STD_VER < 11
23 #error test_convertible.hpp requires C++11 or newer
24 #endif
25 
26 namespace detail {
27     template <class Tp> void eat_type(Tp);
28 
29     template <class Tp, class ...Args>
test_convertible_imp(int)30     constexpr auto test_convertible_imp(int)
31         -> decltype(eat_type<Tp>({std::declval<Args>()...}), true)
32     { return true; }
33 
34     template <class Tp, class ...Args>
test_convertible_imp(long)35     constexpr auto test_convertible_imp(long) -> bool { return false; }
36 }
37 
38 template <class Tp, class ...Args>
test_convertible()39 constexpr bool test_convertible()
40 { return detail::test_convertible_imp<Tp, Args...>(0); }
41 
42 #endif // SUPPORT_TEST_CONVERTIBLE_HPP
43