738 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			738 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								// Boost Lambda Library -- member_ptr.hpp ---------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Copyright (C) 1999, 2000 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi)
							 | 
						||
| 
								 | 
							
								// Copyright (C) 2000 Gary Powell (gary.powell@sierra.com)
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Distributed under the Boost Software License, Version 1.0. (See
							 | 
						||
| 
								 | 
							
								// accompanying file LICENSE_1_0.txt or copy at
							 | 
						||
| 
								 | 
							
								// http://www.boost.org/LICENSE_1_0.txt)
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// For more information, see www.boost.org
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// --------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if !defined(BOOST_LAMBDA_MEMBER_PTR_HPP)
							 | 
						||
| 
								 | 
							
								#define BOOST_LAMBDA_MEMBER_PTR_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost { 
							 | 
						||
| 
								 | 
							
								namespace lambda {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class member_pointer_action {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace detail {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// the boost type_traits member_pointer traits are not enough, 
							 | 
						||
| 
								 | 
							
								// need to know more details.
							 | 
						||
| 
								 | 
							
								template<class T>
							 | 
						||
| 
								 | 
							
								struct member_pointer {
							 | 
						||
| 
								 | 
							
								  typedef typename boost::add_reference<T>::type type;
							 | 
						||
| 
								 | 
							
								  typedef detail::unspecified class_type;
							 | 
						||
| 
								 | 
							
								  typedef detail::unspecified qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = false);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<class T, class U>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T U::*> {
							 | 
						||
| 
								 | 
							
								  typedef typename boost::add_reference<T>::type type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = true);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = false);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<class T, class U>
							 | 
						||
| 
								 | 
							
								struct member_pointer<const T U::*> {
							 | 
						||
| 
								 | 
							
								  typedef typename boost::add_reference<const T>::type type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = true);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = false);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<class T, class U>
							 | 
						||
| 
								 | 
							
								struct member_pointer<volatile T U::*> {
							 | 
						||
| 
								 | 
							
								  typedef typename boost::add_reference<volatile T>::type type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = true);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = false);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<class T, class U>
							 | 
						||
| 
								 | 
							
								struct member_pointer<const volatile T U::*> {
							 | 
						||
| 
								 | 
							
								  typedef typename boost::add_reference<const volatile T>::type type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = true);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = false);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// -- nonconst member functions --
							 | 
						||
| 
								 | 
							
								template<class T, class U>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)()> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1)> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2)> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3)> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4)> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5)> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5,
							 | 
						||
| 
								 | 
							
								         class A6>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6)> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5,
							 | 
						||
| 
								 | 
							
								         class A6, class A7>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7)> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5,
							 | 
						||
| 
								 | 
							
								         class A6, class A7, class A8>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8)> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5,
							 | 
						||
| 
								 | 
							
								         class A6, class A7, class A8, class A9>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9)> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								// -- const member functions --
							 | 
						||
| 
								 | 
							
								template<class T, class U>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)() const> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1) const> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2) const> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3) const> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4) const> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5) const> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5,
							 | 
						||
| 
								 | 
							
								         class A6>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6) const> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5,
							 | 
						||
| 
								 | 
							
								         class A6, class A7>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7) const> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5,
							 | 
						||
| 
								 | 
							
								         class A6, class A7, class A8>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8) const> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5,
							 | 
						||
| 
								 | 
							
								         class A6, class A7, class A8, class A9>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9) const> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								  // -- volatile --
							 | 
						||
| 
								 | 
							
								template<class T, class U>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)() volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1) volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2) volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3) volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4) volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5) volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5,
							 | 
						||
| 
								 | 
							
								         class A6>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6) volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5,
							 | 
						||
| 
								 | 
							
								         class A6, class A7>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7) volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5,
							 | 
						||
| 
								 | 
							
								         class A6, class A7, class A8>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8) volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5,
							 | 
						||
| 
								 | 
							
								         class A6, class A7, class A8, class A9>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9) volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								  // -- const volatile
							 | 
						||
| 
								 | 
							
								template<class T, class U>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)() const volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1) const volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2) const volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3) const volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4) const volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5) const volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5,
							 | 
						||
| 
								 | 
							
								         class A6>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6) const volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5,
							 | 
						||
| 
								 | 
							
								         class A6, class A7>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7) const volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5,
							 | 
						||
| 
								 | 
							
								         class A6, class A7, class A8>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8) const volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								template<class T, class U, class A1, class A2, class A3, class A4, class A5,
							 | 
						||
| 
								 | 
							
								         class A6, class A7, class A8, class A9>
							 | 
						||
| 
								 | 
							
								struct member_pointer<T (U::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9) const volatile> {
							 | 
						||
| 
								 | 
							
								  typedef T type;
							 | 
						||
| 
								 | 
							
								  typedef U class_type;
							 | 
						||
| 
								 | 
							
								  typedef const volatile U qualified_class_type;
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_data_member = false);
							 | 
						||
| 
								 | 
							
								  BOOST_STATIC_CONSTANT(bool, is_function_member = true);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} // detail
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace detail {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // this class holds a pointer to a member function and the object.
							 | 
						||
| 
								 | 
							
								  // when called, it just calls the member function with the parameters 
							 | 
						||
| 
								 | 
							
								  // provided
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // It would have been possible to use existing lambda_functors to represent
							 | 
						||
| 
								 | 
							
								  // a bound member function like this, but to have a separate template is 
							 | 
						||
| 
								 | 
							
								  // safer, since now this functor doesn't mix and match with lambda_functors
							 | 
						||
| 
								 | 
							
								  // only thing you can do with this is to call it
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // note that previously instantiated classes 
							 | 
						||
| 
								 | 
							
								  // (other_action<member_pointer_action> and member_pointer_action_helper
							 | 
						||
| 
								 | 
							
								  // guarantee, that A and B are 
							 | 
						||
| 
								 | 
							
								  // such types, that for objects a and b of corresponding types, a->*b leads 
							 | 
						||
| 
								 | 
							
								  // to the builtin ->* to be called. So types that would end in a  call to 
							 | 
						||
| 
								 | 
							
								  // a user defined ->* do not create a member_pointer_caller object.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<class RET, class A, class B>
							 | 
						||
| 
								 | 
							
								class member_pointer_caller {
							 | 
						||
| 
								 | 
							
								  A a; B b;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								  member_pointer_caller(const A& aa, const B& bb) : a(aa), b(bb) {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  RET operator()() const { return (a->*b)(); } 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class A1>
							 | 
						||
| 
								 | 
							
								  RET operator()(const A1& a1) const { return (a->*b)(a1); } 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class A1, class A2>
							 | 
						||
| 
								 | 
							
								  RET operator()(const A1& a1, const A2& a2) const { return (a->*b)(a1, a2); } 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class A1, class A2, class A3>
							 | 
						||
| 
								 | 
							
								  RET operator()(const A1& a1, const A2& a2, const A3& a3) const { 
							 | 
						||
| 
								 | 
							
								    return (a->*b)(a1, a2, a3); 
							 | 
						||
| 
								 | 
							
								  } 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class A1, class A2, class A3, class A4>
							 | 
						||
| 
								 | 
							
								  RET operator()(const A1& a1, const A2& a2, const A3& a3, 
							 | 
						||
| 
								 | 
							
								                 const A4& a4) const { 
							 | 
						||
| 
								 | 
							
								    return (a->*b)(a1, a2, a3, a4); 
							 | 
						||
| 
								 | 
							
								  } 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class A1, class A2, class A3, class A4, class A5>
							 | 
						||
| 
								 | 
							
								  RET operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4, 
							 | 
						||
| 
								 | 
							
								                 const A5& a5) const { 
							 | 
						||
| 
								 | 
							
								    return (a->*b)(a1, a2, a3, a4, a5); 
							 | 
						||
| 
								 | 
							
								  } 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class A1, class A2, class A3, class A4, class A5, class A6>
							 | 
						||
| 
								 | 
							
								  RET operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4, 
							 | 
						||
| 
								 | 
							
								                 const A5& a5, const A6& a6) const { 
							 | 
						||
| 
								 | 
							
								    return (a->*b)(a1, a2, a3, a4, a5, a6); 
							 | 
						||
| 
								 | 
							
								  } 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class A1, class A2, class A3, class A4, class A5, class A6, 
							 | 
						||
| 
								 | 
							
								           class A7>
							 | 
						||
| 
								 | 
							
								  RET operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4, 
							 | 
						||
| 
								 | 
							
								                 const A5& a5, const A6& a6, const A7& a7) const { 
							 | 
						||
| 
								 | 
							
								    return (a->*b)(a1, a2, a3, a4, a5, a6, a7); 
							 | 
						||
| 
								 | 
							
								  } 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class A1, class A2, class A3, class A4, class A5, class A6, 
							 | 
						||
| 
								 | 
							
								           class A7, class A8>
							 | 
						||
| 
								 | 
							
								  RET operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4, 
							 | 
						||
| 
								 | 
							
								                 const A5& a5, const A6& a6, const A7& a7,
							 | 
						||
| 
								 | 
							
								                 const A8& a8) const { 
							 | 
						||
| 
								 | 
							
								    return (a->*b)(a1, a2, a3, a4, a5, a6, a7, a8); 
							 | 
						||
| 
								 | 
							
								  } 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class A1, class A2, class A3, class A4, class A5, class A6, 
							 | 
						||
| 
								 | 
							
								           class A7, class A8, class A9>
							 | 
						||
| 
								 | 
							
								  RET operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4, 
							 | 
						||
| 
								 | 
							
								                 const A5& a5, const A6& a6, const A7& a7,
							 | 
						||
| 
								 | 
							
								                 const A8& a8, const A9& a9) const { 
							 | 
						||
| 
								 | 
							
								    return (a->*b)(a1, a2, a3, a4, a5, a6, a7, a8, a9); 
							 | 
						||
| 
								 | 
							
								  } 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// helper templates for return type deduction and action classes
							 | 
						||
| 
								 | 
							
								// different cases for data member, function member, neither
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// true-true case
							 | 
						||
| 
								 | 
							
								template <bool Is_data_member, bool Is_function_member>
							 | 
						||
| 
								 | 
							
								struct member_pointer_action_helper;
							 | 
						||
| 
								 | 
							
								  // cannot be both, no body provided
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // data member case
							 | 
						||
| 
								 | 
							
								  // this means, that B is a data member and A is a pointer type,
							 | 
						||
| 
								 | 
							
								  // so either built-in ->* should be called, or there is an error
							 | 
						||
| 
								 | 
							
								template <>
							 | 
						||
| 
								 | 
							
								struct member_pointer_action_helper<true, false> {
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class RET, class A, class B>
							 | 
						||
| 
								 | 
							
								  static RET apply(A& a, B& b) { 
							 | 
						||
| 
								 | 
							
								    return a->*b; 
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class A, class B>
							 | 
						||
| 
								 | 
							
								  struct return_type {
							 | 
						||
| 
								 | 
							
								  private:
							 | 
						||
| 
								 | 
							
								    typedef typename detail::remove_reference_and_cv<B>::type plainB;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    typedef typename detail::member_pointer<plainB>::type type0;
							 | 
						||
| 
								 | 
							
								    // we remove the reference now, as we may have to add cv:s 
							 | 
						||
| 
								 | 
							
								    typedef typename boost::remove_reference<type0>::type type1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // A is a reference to pointer
							 | 
						||
| 
								 | 
							
								    // remove the top level cv qualifiers and reference
							 | 
						||
| 
								 | 
							
								    typedef typename 
							 | 
						||
| 
								 | 
							
								      detail::remove_reference_and_cv<A>::type non_ref_A;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // A is a pointer type, so take the type pointed to
							 | 
						||
| 
								 | 
							
								    typedef typename ::boost::remove_pointer<non_ref_A>::type non_pointer_A; 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  public:
							 | 
						||
| 
								 | 
							
								    // For non-reference types, we must add const and/or volatile if
							 | 
						||
| 
								 | 
							
								    // the pointer type has these qualifiers
							 | 
						||
| 
								 | 
							
								    // If the member is a reference, these do not have any effect
							 | 
						||
| 
								 | 
							
								    //   (cv T == T if T is a reference type)
							 | 
						||
| 
								 | 
							
								    typedef typename detail::IF<
							 | 
						||
| 
								 | 
							
								      ::boost::is_const<non_pointer_A>::value, 
							 | 
						||
| 
								 | 
							
								      typename ::boost::add_const<type1>::type,
							 | 
						||
| 
								 | 
							
								      type1
							 | 
						||
| 
								 | 
							
								    >::RET type2;
							 | 
						||
| 
								 | 
							
								    typedef typename detail::IF<
							 | 
						||
| 
								 | 
							
								      ::boost::is_volatile<non_pointer_A>::value, 
							 | 
						||
| 
								 | 
							
								      typename ::boost::add_volatile<type2>::type,
							 | 
						||
| 
								 | 
							
								      type2
							 | 
						||
| 
								 | 
							
								    >::RET type3;
							 | 
						||
| 
								 | 
							
								    // add reference back
							 | 
						||
| 
								 | 
							
								    typedef typename ::boost::add_reference<type3>::type type;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // neither case
							 | 
						||
| 
								 | 
							
								template <>
							 | 
						||
| 
								 | 
							
								struct member_pointer_action_helper<false, false> {
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								  template<class RET, class A, class B>
							 | 
						||
| 
								 | 
							
								  static RET apply(A& a, B& b) { 
							 | 
						||
| 
								 | 
							
								// not a built in member pointer operator, just call ->*
							 | 
						||
| 
								 | 
							
								    return a->*b; 
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  // an overloaded member pointer operators, user should have specified
							 | 
						||
| 
								 | 
							
								  // the return type
							 | 
						||
| 
								 | 
							
								  // At this point we know that there is no matching specialization for
							 | 
						||
| 
								 | 
							
								  // return_type_2, so try return_type_2_plain
							 | 
						||
| 
								 | 
							
								  template<class A, class B>
							 | 
						||
| 
								 | 
							
								  struct return_type {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    typedef typename plain_return_type_2<
							 | 
						||
| 
								 | 
							
								      other_action<member_pointer_action>, A, B
							 | 
						||
| 
								 | 
							
								    >::type type;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// member pointer function case
							 | 
						||
| 
								 | 
							
								// This is a built in ->* call for a member function, 
							 | 
						||
| 
								 | 
							
								// the only thing that you can do with that, is to give it some arguments
							 | 
						||
| 
								 | 
							
								// note, it is guaranteed that A is a pointer type, and thus it cannot
							 | 
						||
| 
								 | 
							
								// be a call to overloaded ->*
							 | 
						||
| 
								 | 
							
								template <>
							 | 
						||
| 
								 | 
							
								struct member_pointer_action_helper<false, true> {
							 | 
						||
| 
								 | 
							
								  public:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class RET, class A, class B>
							 | 
						||
| 
								 | 
							
								  static RET apply(A& a, B& b) { 
							 | 
						||
| 
								 | 
							
								    typedef typename ::boost::remove_cv<B>::type plainB;
							 | 
						||
| 
								 | 
							
								    typedef typename detail::member_pointer<plainB>::type ret_t; 
							 | 
						||
| 
								 | 
							
								    typedef typename ::boost::remove_cv<A>::type plainA;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // we always strip cv:s to 
							 | 
						||
| 
								 | 
							
								    // make the two routes (calling and type deduction)
							 | 
						||
| 
								 | 
							
								    // to give the same results (and the const does not make any functional
							 | 
						||
| 
								 | 
							
								    // difference)
							 | 
						||
| 
								 | 
							
								    return detail::member_pointer_caller<ret_t, plainA, plainB>(a, b); 
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  template<class A, class B>
							 | 
						||
| 
								 | 
							
								  struct return_type {
							 | 
						||
| 
								 | 
							
								    typedef typename detail::remove_reference_and_cv<B>::type plainB;
							 | 
						||
| 
								 | 
							
								    typedef typename detail::member_pointer<plainB>::type ret_t; 
							 | 
						||
| 
								 | 
							
								    typedef typename detail::remove_reference_and_cv<A>::type plainA; 
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    typedef detail::member_pointer_caller<ret_t, plainA, plainB> type; 
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} // detail
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<> class other_action<member_pointer_action>  {
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								  template<class RET, class A, class B>
							 | 
						||
| 
								 | 
							
								  static RET apply(A& a, B& b) {
							 | 
						||
| 
								 | 
							
								    typedef typename 
							 | 
						||
| 
								 | 
							
								      ::boost::remove_cv<B>::type plainB;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return detail::member_pointer_action_helper<
							 | 
						||
| 
								 | 
							
								        boost::is_pointer<A>::value && 
							 | 
						||
| 
								 | 
							
								          detail::member_pointer<plainB>::is_data_member,
							 | 
						||
| 
								 | 
							
								        boost::is_pointer<A>::value && 
							 | 
						||
| 
								 | 
							
								          detail::member_pointer<plainB>::is_function_member
							 | 
						||
| 
								 | 
							
								      >::template apply<RET>(a, b); 
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // return type deduction --
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // If the right argument is a pointer to data member, 
							 | 
						||
| 
								 | 
							
								  // and the left argument is of compatible pointer to class type
							 | 
						||
| 
								 | 
							
								  // return type is a reference to the data member type
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // if right argument is a pointer to a member function, and the left 
							 | 
						||
| 
								 | 
							
								  // argument is of a compatible type, the return type is a 
							 | 
						||
| 
								 | 
							
								  // member_pointer_caller (see above)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Otherwise, return type deduction fails. There is either an error, 
							 | 
						||
| 
								 | 
							
								  // or the user is trying to call an overloaded ->*
							 | 
						||
| 
								 | 
							
								  // In such a case either ret<> must be used, or a return_type_2 user 
							 | 
						||
| 
								 | 
							
								  // defined specialization must be provided
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<class A, class B>
							 | 
						||
| 
								 | 
							
								struct return_type_2<other_action<member_pointer_action>, A, B> {
							 | 
						||
| 
								 | 
							
								private:
							 | 
						||
| 
								 | 
							
								  typedef typename 
							 | 
						||
| 
								 | 
							
								    detail::remove_reference_and_cv<B>::type plainB;
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								  typedef typename 
							 | 
						||
| 
								 | 
							
								    detail::member_pointer_action_helper<
							 | 
						||
| 
								 | 
							
								      detail::member_pointer<plainB>::is_data_member,
							 | 
						||
| 
								 | 
							
								      detail::member_pointer<plainB>::is_function_member
							 | 
						||
| 
								 | 
							
								    >::template return_type<A, B>::type type; 
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // this is the way the generic lambda_functor_base functions instantiate
							 | 
						||
| 
								 | 
							
								  // return type deduction. We turn it into return_type_2, so that the 
							 | 
						||
| 
								 | 
							
								  // user can provide specializations on that level.
							 | 
						||
| 
								 | 
							
								template<class Args>
							 | 
						||
| 
								 | 
							
								struct return_type_N<other_action<member_pointer_action>, Args> {
							 | 
						||
| 
								 | 
							
								  typedef typename boost::tuples::element<0, Args>::type A;
							 | 
						||
| 
								 | 
							
								  typedef typename boost::tuples::element<1, Args>::type B;
							 | 
						||
| 
								 | 
							
								  typedef typename 
							 | 
						||
| 
								 | 
							
								    return_type_2<other_action<member_pointer_action>, 
							 | 
						||
| 
								 | 
							
								                  typename boost::remove_reference<A>::type, 
							 | 
						||
| 
								 | 
							
								                  typename boost::remove_reference<B>::type
							 | 
						||
| 
								 | 
							
								                 >::type type;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<class Arg1, class Arg2>
							 | 
						||
| 
								 | 
							
								inline const
							 | 
						||
| 
								 | 
							
								lambda_functor<
							 | 
						||
| 
								 | 
							
								  lambda_functor_base<
							 | 
						||
| 
								 | 
							
								    action<2, other_action<member_pointer_action> >,
							 | 
						||
| 
								 | 
							
								    tuple<lambda_functor<Arg1>, typename const_copy_argument<Arg2>::type>
							 | 
						||
| 
								 | 
							
								  >
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								operator->*(const lambda_functor<Arg1>& a1, const Arg2& a2)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  return 
							 | 
						||
| 
								 | 
							
								      lambda_functor_base<
							 | 
						||
| 
								 | 
							
								        action<2, other_action<member_pointer_action> >,
							 | 
						||
| 
								 | 
							
								        tuple<lambda_functor<Arg1>, typename const_copy_argument<Arg2>::type>
							 | 
						||
| 
								 | 
							
								      >
							 | 
						||
| 
								 | 
							
								      (tuple<lambda_functor<Arg1>, 
							 | 
						||
| 
								 | 
							
								             typename const_copy_argument<Arg2>::type>(a1, a2));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<class Arg1, class Arg2>
							 | 
						||
| 
								 | 
							
								inline const
							 | 
						||
| 
								 | 
							
								lambda_functor<
							 | 
						||
| 
								 | 
							
								  lambda_functor_base<
							 | 
						||
| 
								 | 
							
								    action<2, other_action<member_pointer_action> >,
							 | 
						||
| 
								 | 
							
								    tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >
							 | 
						||
| 
								 | 
							
								  >
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								operator->*(const lambda_functor<Arg1>& a1, const lambda_functor<Arg2>& a2)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  return 
							 | 
						||
| 
								 | 
							
								      lambda_functor_base<
							 | 
						||
| 
								 | 
							
								        action<2, other_action<member_pointer_action> >,
							 | 
						||
| 
								 | 
							
								        tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >
							 | 
						||
| 
								 | 
							
								      >
							 | 
						||
| 
								 | 
							
								    (tuple<lambda_functor<Arg1>, lambda_functor<Arg2> >(a1, a2));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<class Arg1, class Arg2>
							 | 
						||
| 
								 | 
							
								inline const
							 | 
						||
| 
								 | 
							
								lambda_functor<
							 | 
						||
| 
								 | 
							
								  lambda_functor_base<
							 | 
						||
| 
								 | 
							
								    action<2, other_action<member_pointer_action> >,
							 | 
						||
| 
								 | 
							
								    tuple<typename const_copy_argument<Arg1>::type, lambda_functor<Arg2> >
							 | 
						||
| 
								 | 
							
								  >
							 | 
						||
| 
								 | 
							
								>
							 | 
						||
| 
								 | 
							
								operator->*(const Arg1& a1, const lambda_functor<Arg2>& a2)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  return 
							 | 
						||
| 
								 | 
							
								      lambda_functor_base<
							 | 
						||
| 
								 | 
							
								        action<2, other_action<member_pointer_action> >,
							 | 
						||
| 
								 | 
							
								        tuple<typename const_copy_argument<Arg1>::type, lambda_functor<Arg2> >
							 | 
						||
| 
								 | 
							
								      >
							 | 
						||
| 
								 | 
							
								      (tuple<typename const_copy_argument<Arg1>::type, 
							 | 
						||
| 
								 | 
							
								             lambda_functor<Arg2> >(a1, a2));
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} // namespace lambda 
							 | 
						||
| 
								 | 
							
								} // namespace boost
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |