111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===// 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The LLVM Compiler Infrastructure 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details. 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===// 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <functional> 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// reference_wrapper 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// has weak result type 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <functional> 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <type_traits> 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass functor1 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : public std::unary_function<int, char> 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass functor2 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : public std::binary_function<char, int, double> 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass functor3 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : public std::unary_function<char, int>, 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public std::binary_function<char, int, double> 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic: 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef float result_type; 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass functor4 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : public std::unary_function<char, int>, 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert public std::binary_function<char, int, double> 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic: 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertclass C {}; 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class T> 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct has_result_type 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertprivate: 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct two {char _; char __;}; 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template <class U> static two test(...); 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert template <class U> static char test(typename U::result_type* = 0); 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertpublic: 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static const bool value = sizeof(test<T>(0)) == 1; 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main() 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert((std::is_same<std::reference_wrapper<functor1>::result_type, 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert char>::value), ""); 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert((std::is_same<std::reference_wrapper<functor2>::result_type, 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert double>::value), ""); 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert((std::is_same<std::reference_wrapper<functor3>::result_type, 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert float>::value), ""); 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert((std::is_same<std::reference_wrapper<void()>::result_type, 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void>::value), ""); 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert((std::is_same<std::reference_wrapper<int*(double*)>::result_type, 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int*>::value), ""); 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert((std::is_same<std::reference_wrapper<void(*)()>::result_type, 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void>::value), ""); 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert((std::is_same<std::reference_wrapper<int*(*)(double*)>::result_type, 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int*>::value), ""); 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert((std::is_same<std::reference_wrapper<int*(C::*)(double*)>::result_type, 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int*>::value), ""); 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert((std::is_same<std::reference_wrapper<int (C::*)(double*) const volatile>::result_type, 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int>::value), ""); 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert((std::is_same<std::reference_wrapper<C()>::result_type, 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert C>::value), ""); 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert(has_result_type<std::reference_wrapper<functor3> >::value, ""); 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert(!has_result_type<std::reference_wrapper<functor4> >::value, ""); 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert static_assert(!has_result_type<std::reference_wrapper<C> >::value, ""); 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 83