//===----------------------------------------------------------------------===//
//
// 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
{std::bind(f_void_1,_1)(2);assert(count==save_count+2);save_count=count;}{std::bind(f_void_1,2)();assert(count==save_count+2);save_count=count;}// function pointer
{void(*fp)(int)=f_void_1;std::bind(fp,_1)(3);assert(count==save_count+3);save_count=count;}{void(*fp)(int)=f_void_1;std::bind(fp,3)();assert(count==save_count+3);save_count=count;}// functor
{A_void_1a0;std::bind(a0,_1)(4);assert(count==save_count+4);save_count=count;}{A_void_1a0;std::bind(a0,4)();assert(count==save_count+4);save_count=count;}// member function pointer
{void(A_void_1::*fp)()=&A_void_1::mem1;std::bind(fp,_1)(A_void_1());assert(count==save_count+1);save_count=count;A_void_1a;std::bind(fp,_1)(&a);assert(count==save_count+1);save_count=count;}{void(A_void_1::*fp)()=&A_void_1::mem1;std::bind(fp,A_void_1())();assert(count==save_count+1);save_count=count;A_void_1a;std::bind(fp,&a)();assert(count==save_count+1);save_count=count;}// const member function pointer
{void(A_void_1::*fp)()const=&A_void_1::mem2;std::bind(fp,_1)(A_void_1());assert(count==save_count+2);save_count=count;A_void_1a;std::bind(fp,_1)(&a);assert(count==save_count+2);save_count=count;}{void(A_void_1::*fp)()const=&A_void_1::mem2;std::bind(fp,A_void_1())();assert(count==save_count+2);save_count=count;A_void_1a;std::bind(fp,&a)();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
{assert(std::bind(f_int_1,_1)(2)==3);assert(std::bind(f_int_1,2)()==3);}// function pointer
{int(*fp)(int)=f_int_1;assert(std::bind(fp,_1)(3)==4);assert(std::bind(fp,3)()==4);}// functor
{assert(std::bind(A_int_1(),_1)(4)==3);assert(std::bind(A_int_1(),4)()==3);}// member function pointer
{assert(std::bind(&A_int_1::mem1,_1)(A_int_1())==3);assert(std::bind(&A_int_1::mem1,A_int_1())()==3);A_int_1a;assert(std::bind(&A_int_1::mem1,_1)(&a)==3);assert(std::bind(&A_int_1::mem1,&a)()==3);}// const member function pointer
{assert(std::bind(&A_int_1::mem2,_1)(A_int_1())==4);assert(std::bind(&A_int_1::mem2,A_int_1())()==4);A_int_1a;assert(std::bind(&A_int_1::mem2,_1)(&a)==4);assert(std::bind(&A_int_1::mem2,&a)()==4);}// member data pointer
{assert(std::bind(&A_int_1::data