//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// <functional>
// reference_wrapper
// template <class... ArgTypes>
// requires Callable<T, ArgTypes&&...>
// Callable<T, ArgTypes&&...>::result_type
// 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::reference_wrapper<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::reference_wrapper<void(*)(int)>r1(fp);inti=3;r1(i);assert(count==save_count+3);save_count=count;}// functor
{A_void_1a0;std::reference_wrapper<A_void_1>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::reference_wrapper<void(A_void_1::*)()>r1(fp);A_void_1a;r1(a);assert(count==save_count+1);save_count=count;A_void_1*ap=&a;r1(ap);assert(count==save_count+1);save_count=count;}// const member function pointer
{void(A_void_1::*fp)()const=&A_void_1::mem2;std::reference_wrapper<void(A_void_1::*)()const>r1(fp);A_void_1a;r1(a);assert(count==save_count+1);save_count=count;A_void_1*ap=&a;r1(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::reference_wrapper<int(int)>r1(f_int_1);inti=2;assert(r1(i)==3);}// function pointer
{int(*fp)(int)=f_int_1;std::reference_wrapper<int(*)(int)>r1(fp);inti=3;assert(r1(i)==4);}// functor
{A_int_1a0;std::reference_wrapper<A_int_1>r1(a0);inti=4;assert(r1(i)==3);}// member function pointer
{int(A_int_1::*fp)()=&A_int_1::mem1;std::reference_wrapper<int(A_int_1::*)()>r1(fp);A_int_1a;assert(r1(a)==3);A_int_1*ap=&a;assert(r1(ap)==3);}// const member function pointer
{int(A_int_1::*fp)()const=&A_int_1::mem2;std::reference_wrapper<int(A_int_1::*)()const>r1(fp);A_int_1a;assert(r1(a)==4);A_int_1*ap=&a;assert(r1(ap)==4);}// member data pointer
{intA_int_1::*fp=&A_int_1::data_;std::reference_wrapper<intA_int_1::*>r1(fp);A_int_1a;assert(r1(a)==5);r1(a)=6;assert(r1(a)==6);A_int_1*ap=&a;assert(r1(ap)==6);r1(ap)=7;assert(r1(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::reference_wrapper<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::reference_wrapper<void(*)