//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <functional>
// class function<R(ArgTypes...)>
// R operator()(ArgTypes... args) const
#include<functional>#include<cassert>intcount=0;// 1 arg, return void
voidf_void_1(inti){count+=i;}structA_void_1{voidoperator()(inti){count+=i;}voidmem1(){++count;}voidmem2()const{++count;}};voidtest_void_1(){intsave_count=count;// function
{std::function<void(int)>r1(f_void_1);inti=2;r1(i);assert(count==save_count+2);save_count=count;}// function pointer
{void(*fp)(int)=f_void_1;std::function<void(int)>r1(fp);inti=3;r1(i);assert(count==save_count+3);save_count=count;}// functor
{A_void_1a0;std::function<void(int)>r1(a0);inti=4;r1(i);assert(count==save_count+4);save_count=count;}// member function pointer
{void(A_void_1::*fp)()=&A_void_1::mem1;std::function<void(A_void_1)>r1(fp);A_void_1a;r1(a);assert(count==save_count+1);save_count=count;A_void_1*ap=&a;std::function<void(A_void_1*)>r2=fp;r2(ap);assert(count==save_count+1);save_count=count;}// const member function pointer
{void(A_void_1::*fp)()const=&A_void_1::mem2;std::function<void(A_void_1)>r1(fp);A_void_1a;r1(a);assert(count==save_count+1);save_count=count;std::function<void(A_void_1*)>r2(fp);A_void_1*ap=&a;r2(ap);assert(count==save_count+1);save_count=count;}}// 1 arg, return int
intf_int_1(inti){returni+1;}structA_int_1{A_int_1():data_(5){}intoperator()(inti){returni-1;}intmem1(){return3;}intmem2()const{return4;}intdata_;};voidtest_int_1(){// function
{std::function<int(int)>r1(f_int_1);inti=2;assert(r1(i)==3);}// function pointer
{int(*fp)(int)=f_int_1;std::function<int(int)>r1(fp);inti=3;assert(r1(i)==4);}// functor
{A_int_1a0;std::function<int(int)>r1(a0);inti=4;assert(r1(i)==3);}// member function pointer
{int(A_int_1::*fp)()=&A_int_1::mem1;std::function<int(A_int_1)>r1(fp);A_int_1a;assert(r1(a)==3);std::function<int(A_int_1*)>r2(fp);A_int_1*ap=&a;assert(r2(ap)==3);}// const member function pointer
{int(A_int_1::*fp)()const=&A_int_1::mem2;std::function<int(A_int_1)>r1(fp);A_int_1a;assert(r1(a)==4);std::function<int(A_int_1*)>r2(fp);A_int_1*ap=&a;assert(r2(ap)==4);}// member data pointer
{intA_int_1::*fp=&A_int_1::data_;std::function<int&(A_int_1&)>r1(fp);A_int_1a;assert(r1(a)==5);r1(a)=6;assert(r1(a)==6);std::function<int&(A_int_1*)>r2(fp);A_int_1*ap=&a;assert(r2(ap)==6);r2(ap)=7;assert(r2(ap)==7);}}// 2 arg, return void
voidf_void_2(inti,intj){count+=i+j;}structA_void_2{voidoperator()(inti,intj){count+=i+j;}voidmem1(inti){count+=i;}voidmem2(inti)const{count+=i;}};voidtest_void_2(){intsave_count=count;// function
{std::function<void(int,int)>r1(f_void_2);inti=2;intj=3;r1(i,j);assert(count==save_count+5);save_count=count;}// function pointer
{void(*fp)(int,int)=f_void_2;std::function<void(int,int)>r1(fp);inti=3;intj=4