#include <boost/config.hpp>
#if defined(BOOST_MSVC)
#pragma warning(disable: 4786) // identifier truncated in debug info
#pragma warning(disable: 4710) // function not inlined
#pragma warning(disable: 4711) // function selected for automatic inline expansion
#pragma warning(disable: 4514) // unreferenced inline removed
#endif
//
// bind_visitor.cpp - tests bind.hpp with a visitor
//
// Copyright (c) 2001 Peter Dimov and Multi Media Ltd.
//
// Distributed under the Boost Software License, Version 1.0. (See
// accompanying file LICENSE_1_0.txt or copy at
// http://w...content-available-to-author-only...t.org/LICENSE_1_0.txt)
//
#include <boost/bind.hpp>
#include <boost/ref.hpp>
#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
#pragma warning(push, 3)
#endif
#include <iostream>
#include <typeinfo>
#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
#pragma warning(pop)
#endif
//
struct visitor
{
template < class T> void operator( ) ( boost:: reference_wrapper < T> const & r ) const
{
std:: cout << "Reference to " << typeid ( T) .name ( ) << " @ " << & r.get ( ) << " (with value " << r.get ( ) << ")\n " ;
}
template < class T> void operator( ) ( T const & t ) const
{
std:: cout << "Value of type " << typeid ( T) .name ( ) << " (with value " << t << ")\n " ;
}
} ;
int f( int & i, int & j, int )
{
++ i;
-- j;
return i + j;
}
int x = 2 ;
int y = 7 ;
int main( )
{
using namespace boost;
visitor v;
visit_each( v, bind< int > ( bind( f, ref( x) , _1, 42 ) , ref( y) ) , 0 ) ;
}
I2luY2x1ZGUgPGJvb3N0L2NvbmZpZy5ocHA+CgojaWYgZGVmaW5lZChCT09TVF9NU1ZDKQojcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDc4NikgIC8vIGlkZW50aWZpZXIgdHJ1bmNhdGVkIGluIGRlYnVnIGluZm8KI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQ3MTApICAvLyBmdW5jdGlvbiBub3QgaW5saW5lZAojcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDcxMSkgIC8vIGZ1bmN0aW9uIHNlbGVjdGVkIGZvciBhdXRvbWF0aWMgaW5saW5lIGV4cGFuc2lvbgojcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDUxNCkgIC8vIHVucmVmZXJlbmNlZCBpbmxpbmUgcmVtb3ZlZAojZW5kaWYKCi8vCi8vICBiaW5kX3Zpc2l0b3IuY3BwIC0gdGVzdHMgYmluZC5ocHAgd2l0aCBhIHZpc2l0b3IKLy8KLy8gIENvcHlyaWdodCAoYykgMjAwMSBQZXRlciBEaW1vdiBhbmQgTXVsdGkgTWVkaWEgTHRkLgovLwovLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUKLy8gYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQKLy8gaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnQub3JnL0xJQ0VOU0VfMV8wLnR4dCkKLy8KCiNpbmNsdWRlIDxib29zdC9iaW5kLmhwcD4KI2luY2x1ZGUgPGJvb3N0L3JlZi5ocHA+CgojaWYgZGVmaW5lZChCT09TVF9NU1ZDKSAmJiAoQk9PU1RfTVNWQyA8IDEzMDApCiNwcmFnbWEgd2FybmluZyhwdXNoLCAzKQojZW5kaWYKCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHR5cGVpbmZvPgoKI2lmIGRlZmluZWQoQk9PU1RfTVNWQykgJiYgKEJPT1NUX01TVkMgPCAxMzAwKQojcHJhZ21hIHdhcm5pbmcocG9wKQojZW5kaWYKCi8vCgpzdHJ1Y3QgdmlzaXRvcgp7CiAgICB0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIG9wZXJhdG9yKCkoIGJvb3N0OjpyZWZlcmVuY2Vfd3JhcHBlcjxUPiBjb25zdCAmIHIgKSBjb25zdAogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiUmVmZXJlbmNlIHRvICIgPDwgdHlwZWlkKFQpLm5hbWUoKSA8PCAiIEAgIiA8PCAmci5nZXQoKSA8PCAiICh3aXRoIHZhbHVlICIgPDwgci5nZXQoKSA8PCAiKVxuIjsKICAgIH0KCiAgICB0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIG9wZXJhdG9yKCkoIFQgY29uc3QgJiB0ICkgY29uc3QKICAgIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIlZhbHVlIG9mIHR5cGUgIiA8PCB0eXBlaWQoVCkubmFtZSgpIDw8ICIgKHdpdGggdmFsdWUgIiA8PCB0IDw8ICIpXG4iOwogICAgfQp9OwoKaW50IGYoaW50ICYgaSwgaW50ICYgaiwgaW50KQp7CiAgICArK2k7CiAgICAtLWo7CiAgICByZXR1cm4gaSArIGo7Cn0KCmludCB4ID0gMjsKaW50IHkgPSA3OwoKaW50IG1haW4oKQp7CiAgICB1c2luZyBuYW1lc3BhY2UgYm9vc3Q7CgogICAgdmlzaXRvciB2OwogICAgdmlzaXRfZWFjaCh2LCBiaW5kPGludD4oYmluZChmLCByZWYoeCksIF8xLCA0MiksIHJlZih5KSksIDApOwp9