1// 2005-01-15 Douglas Gregor <dgregor@cs.indiana.edu> 2// 3// Copyright (C) 2005-2015 Free Software Foundation, Inc. 4// 5// This file is part of the GNU ISO C++ Library. This library is free 6// software; you can redistribute it and/or modify it under the 7// terms of the GNU General Public License as published by the 8// Free Software Foundation; either version 3, or (at your option) 9// any later version. 10// 11// This library is distributed in the hope that it will be useful, 12// but WITHOUT ANY WARRANTY; without even the implied warranty of 13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14// GNU General Public License for more details. 15// 16// You should have received a copy of the GNU General Public License along 17// with this library; see the file COPYING3. If not see 18// <http://www.gnu.org/licenses/>. 19 20// 3.7.2 polymorphic function object wrapper 21#include <tr1/functional> 22#include <testsuite_hooks.h> 23#include <testsuite_tr1.h> 24 25using namespace __gnu_test; 26 27bool test __attribute__((unused)) = true; 28 29// Put function pointers into function<> wrappers 30void test02() 31{ 32 using std::tr1::function; 33 34 function<int(float)> f1(truncate_float); 35 VERIFY( f1 ); 36 VERIFY( !!f1 ); 37 VERIFY( !(f1 == 0) ); 38 VERIFY( !(0 == f1) ); 39 VERIFY( f1 != 0 ); 40 VERIFY( 0 != f1 ); 41 42 // Copy-construction 43 function<int(float)> f2(f1); 44 VERIFY( f2 ); 45 46 // Invocation 47 VERIFY( f1(3.1f) == 3 ); 48 VERIFY( f2(3.1f) == 3 ); 49 50 // Assignment to zero 51 f1 = 0; 52 VERIFY( !f1 ); 53 54 // Swap 55 f1.swap(f2); 56 VERIFY( f1 ); 57 VERIFY( !f2 ); 58 VERIFY( f1(3.1f) == 3 ); 59 60 // Assignment from a function pointer 61 f2 = truncate_float; 62 VERIFY( f2(3.1f) == 3 ); 63 64 // target_type and target() functions 65 const function<int(float)>& f1c = f1; 66 VERIFY( typeid(int(*)(float)) == f1.target_type() ); 67 VERIFY( f2.target<int(*)(float)>() != 0 ); 68 VERIFY( *f2.target<int(*)(float)>() == &truncate_float ); 69 VERIFY( f1c.target<int(*)(float)>() != 0 ); 70 VERIFY( *f1c.target<int(*)(float)>() == &truncate_float ); 71} 72 73int main() 74{ 75 test02(); 76 return 0; 77} 78