//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <functional>
// template<CopyConstructible Fn, CopyConstructible... Types>
// unspecified bind(Fn, Types...);
// template<Returnable R, CopyConstructible Fn, CopyConstructible... Types>
// unspecified bind(Fn, Types...);
#include<stdio.h>#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+=2;}};voidtest_void_1(){usingnamespacestd::placeholders;intsave_count=count;// function
{inti=2;std::bind(f_void_1,_1)(i);assert(count==save_count+2);save_count=count;}{inti=2;std::bind(f_void_1,i)();assert(count==save_count+2);save_count=count;}// function pointer
{void(*fp)(int)=f_void_1;inti=3;std::bind(fp,_1)(i);assert(count==save_count+3);save_count=count;}{void(*fp)(int)=f_void_1;inti=3;std::bind(fp,i)();assert(count==save_count+3);save_count=count;}// functor
{A_void_1a0;inti=4;std::bind(a0,_1)(i);assert(count==save_count+4);save_count=count;}{A_void_1a0;inti=4;std::bind(a0,i)();assert(count==save_count+4);save_count=count;}// member function pointer
{void(A_void_1::*fp)()=&A_void_1::mem1;A_void_1a;std::bind(fp,_1)(a);assert(count==save_count+1);save_count=count;A_void_1*ap=&a;std::bind(fp,_1)(ap);assert(count==save_count+1);save_count=count;}{void(A_void_1::*fp)()=&A_void_1::mem1;A_void_1a;std::bind(fp,a)();assert(count==save_count+1);save_count=count;A_void_1*ap=&a;std::bind(fp,ap)();assert(count==save_count+1);save_count=count;}// const member function pointer
{void(A_void_1::*fp)()const=&A_void_1::mem2;A_void_1a;std::bind(fp,_1)(a);assert(count==save_count+2);save_count=count;A_void_1*ap=&a;std::bind(fp,_1)(ap);assert(count==save_count+2);save_count=count;}{void(A_void_1::*fp)()const=&A_void_1::mem2;A_void_1a;std::bind(fp,a)();assert(count==save_count+2);save_count=count;A_void_1*ap=&a;std::bind(fp,ap)();assert(count==save_count+2);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(){usingnamespacestd::placeholders;// function
{inti=2;assert(std::bind(f_int_1,_1)(i)==3);assert(std::bind(f_int_1,i)()==3);}// function pointer
{int(*fp)(int)=f_int_1;inti=3;assert(std::bind(fp,_1)(i)==4);assert(std::bind(fp,i)()==4);}// functor
{inti=4;assert(std::bind(A_int_1(),_1)(i)==3);assert(std::bind(A_int_1(),i)()==3);}// member function pointer
{A_int_1a;assert(std::bind(&A_int_1::mem1,_1)(a)==3);assert(std::bind(&A_int_1::mem1,a)()==3);A_int_1*ap=&a;assert(std::bind(&A_int_1::mem1,_1)(ap)==3);assert(std::bind(&A_int_1::mem1,ap)()==3);}// const member function pointer
{A_int_1a;assert(std::bind(&A_int_1::mem2,_1)(A_int_1())==4);assert(std::bind(&A_int_1::mem2,