williamr@4: #ifndef BOOST_BIND_HPP_INCLUDED williamr@4: #define BOOST_BIND_HPP_INCLUDED williamr@2: williamr@4: // MS compatible compilers support #pragma once williamr@2: williamr@4: #if defined(_MSC_VER) && (_MSC_VER >= 1020) williamr@4: # pragma once williamr@4: #endif williamr@2: williamr@2: // williamr@4: // bind.hpp - binds function objects to arguments williamr@4: // williamr@4: // Copyright (c) 2001-2004 Peter Dimov and Multi Media Ltd. williamr@4: // Copyright (c) 2001 David Abrahams williamr@4: // Copyright (c) 2005 Peter Dimov williamr@4: // williamr@4: // Distributed under the Boost Software License, Version 1.0. (See williamr@4: // accompanying file LICENSE_1_0.txt or copy at williamr@2: // http://www.boost.org/LICENSE_1_0.txt) williamr@2: // williamr@4: // See http://www.boost.org/libs/bind/bind.html for documentation. williamr@4: // williamr@2: williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@4: #include williamr@2: williamr@4: // Borland-specific bug, visit_each() silently fails to produce code williamr@4: williamr@4: #if defined(__BORLANDC__) williamr@4: # define BOOST_BIND_VISIT_EACH boost::visit_each williamr@4: #else williamr@4: # define BOOST_BIND_VISIT_EACH visit_each williamr@2: #endif williamr@2: williamr@4: #include williamr@2: williamr@4: #ifdef BOOST_MSVC williamr@4: # pragma warning(push) williamr@4: # pragma warning(disable: 4512) // assignment operator could not be generated williamr@4: #endif williamr@2: williamr@4: namespace boost williamr@4: { williamr@4: williamr@4: namespace _bi // implementation details williamr@4: { williamr@4: williamr@4: // result_traits williamr@4: williamr@4: template struct result_traits williamr@4: { williamr@4: typedef R type; williamr@4: }; williamr@4: williamr@4: #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) williamr@4: williamr@4: struct unspecified {}; williamr@4: williamr@4: template struct result_traits williamr@4: { williamr@4: typedef typename F::result_type type; williamr@4: }; williamr@4: williamr@4: template struct result_traits< unspecified, reference_wrapper > williamr@4: { williamr@4: typedef typename F::result_type type; williamr@4: }; williamr@4: williamr@4: #endif williamr@4: williamr@4: // ref_compare williamr@4: williamr@4: template bool ref_compare( T const & a, T const & b, long ) williamr@4: { williamr@4: return a == b; williamr@4: } williamr@4: williamr@4: template bool ref_compare( arg const &, arg const &, int ) williamr@4: { williamr@4: return true; williamr@4: } williamr@4: williamr@4: template bool ref_compare( arg (*) (), arg (*) (), int ) williamr@4: { williamr@4: return true; williamr@4: } williamr@4: williamr@4: template bool ref_compare( reference_wrapper const & a, reference_wrapper const & b, int ) williamr@4: { williamr@4: return a.get_pointer() == b.get_pointer(); williamr@4: } williamr@4: williamr@4: // bind_t forward declaration for listN williamr@4: williamr@4: template class bind_t; williamr@4: williamr@4: // value williamr@4: williamr@4: template class value williamr@4: { williamr@4: public: williamr@4: williamr@4: value(T const & t): t_(t) {} williamr@4: williamr@4: T & get() { return t_; } williamr@4: T const & get() const { return t_; } williamr@4: williamr@4: bool operator==(value const & rhs) const williamr@4: { williamr@4: return t_ == rhs.t_; williamr@4: } williamr@4: williamr@4: private: williamr@4: williamr@4: T t_; williamr@4: }; williamr@4: williamr@4: // type williamr@4: williamr@4: template class type {}; williamr@4: williamr@4: // unwrap williamr@4: williamr@4: template struct unwrapper williamr@4: { williamr@4: static inline F & unwrap( F & f, long ) williamr@4: { williamr@4: return f; williamr@4: } williamr@4: williamr@4: template static inline F2 & unwrap( reference_wrapper rf, int ) williamr@4: { williamr@4: return rf.get(); williamr@4: } williamr@4: williamr@4: template static inline _mfi::dm unwrap( R T::* pm, int ) williamr@4: { williamr@4: return _mfi::dm( pm ); williamr@4: } williamr@4: }; williamr@4: williamr@4: // listN williamr@4: williamr@4: class list0 williamr@4: { williamr@4: public: williamr@4: williamr@4: list0() {} williamr@4: williamr@4: template T & operator[] (_bi::value & v) const { return v.get(); } williamr@4: williamr@4: template T const & operator[] (_bi::value const & v) const { return v.get(); } williamr@4: williamr@4: template T & operator[] (reference_wrapper const & v) const { return v.get(); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } williamr@4: williamr@4: template R operator()(type, F & f, A &, long) williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(); williamr@4: } williamr@4: williamr@4: template R operator()(type, F const & f, A &, long) const williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(); williamr@4: } williamr@4: williamr@4: template void operator()(type, F & f, A &, int) williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(); williamr@4: } williamr@4: williamr@4: template void operator()(type, F const & f, A &, int) const williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(); williamr@4: } williamr@4: williamr@4: template void accept(V &) const williamr@4: { williamr@4: } williamr@4: williamr@4: bool operator==(list0 const &) const williamr@4: { williamr@4: return true; williamr@4: } williamr@4: }; williamr@4: williamr@4: template< class A1 > class list1: private storage1< A1 > williamr@4: { williamr@4: private: williamr@4: williamr@4: typedef storage1< A1 > base_type; williamr@4: williamr@4: public: williamr@4: williamr@4: explicit list1( A1 a1 ): base_type( a1 ) {} williamr@4: williamr@4: A1 operator[] (boost::arg<1>) const { return base_type::a1_; } williamr@4: williamr@4: A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; } williamr@4: williamr@4: template T & operator[] ( _bi::value & v ) const { return v.get(); } williamr@4: williamr@4: template T const & operator[] ( _bi::value const & v ) const { return v.get(); } williamr@4: williamr@4: template T & operator[] (reference_wrapper const & v) const { return v.get(); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } williamr@4: williamr@4: template R operator()(type, F & f, A & a, long) williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(a[base_type::a1_]); williamr@4: } williamr@4: williamr@4: template R operator()(type, F const & f, A & a, long) const williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(a[base_type::a1_]); williamr@4: } williamr@4: williamr@4: template void operator()(type, F & f, A & a, int) williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(a[base_type::a1_]); williamr@4: } williamr@4: williamr@4: template void operator()(type, F const & f, A & a, int) const williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(a[base_type::a1_]); williamr@4: } williamr@4: williamr@4: template void accept(V & v) const williamr@4: { williamr@4: base_type::accept(v); williamr@4: } williamr@4: williamr@4: bool operator==(list1 const & rhs) const williamr@4: { williamr@4: return ref_compare(base_type::a1_, rhs.a1_, 0); williamr@4: } williamr@4: }; williamr@4: williamr@4: template< class A1, class A2 > class list2: private storage2< A1, A2 > williamr@4: { williamr@4: private: williamr@4: williamr@4: typedef storage2< A1, A2 > base_type; williamr@4: williamr@4: public: williamr@4: williamr@4: list2( A1 a1, A2 a2 ): base_type( a1, a2 ) {} williamr@4: williamr@4: A1 operator[] (boost::arg<1>) const { return base_type::a1_; } williamr@4: A2 operator[] (boost::arg<2>) const { return base_type::a2_; } williamr@4: williamr@4: A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; } williamr@4: A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; } williamr@4: williamr@4: template T & operator[] (_bi::value & v) const { return v.get(); } williamr@4: williamr@4: template T const & operator[] (_bi::value const & v) const { return v.get(); } williamr@4: williamr@4: template T & operator[] (reference_wrapper const & v) const { return v.get(); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } williamr@4: williamr@4: template R operator()(type, F & f, A & a, long) williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]); williamr@4: } williamr@4: williamr@4: template R operator()(type, F const & f, A & a, long) const williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]); williamr@4: } williamr@4: williamr@4: template void operator()(type, F & f, A & a, int) williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]); williamr@4: } williamr@4: williamr@4: template void operator()(type, F const & f, A & a, int) const williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]); williamr@4: } williamr@4: williamr@4: template void accept(V & v) const williamr@4: { williamr@4: base_type::accept(v); williamr@4: } williamr@4: williamr@4: bool operator==(list2 const & rhs) const williamr@4: { williamr@4: return ref_compare(base_type::a1_, rhs.a1_, 0) && ref_compare(base_type::a2_, rhs.a2_, 0); williamr@4: } williamr@4: }; williamr@4: williamr@4: template< class A1, class A2, class A3 > class list3: private storage3< A1, A2, A3 > williamr@4: { williamr@4: private: williamr@4: williamr@4: typedef storage3< A1, A2, A3 > base_type; williamr@4: williamr@4: public: williamr@4: williamr@4: list3( A1 a1, A2 a2, A3 a3 ): base_type( a1, a2, a3 ) {} williamr@4: williamr@4: A1 operator[] (boost::arg<1>) const { return base_type::a1_; } williamr@4: A2 operator[] (boost::arg<2>) const { return base_type::a2_; } williamr@4: A3 operator[] (boost::arg<3>) const { return base_type::a3_; } williamr@4: williamr@4: A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; } williamr@4: A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; } williamr@4: A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; } williamr@4: williamr@4: template T & operator[] (_bi::value & v) const { return v.get(); } williamr@4: williamr@4: template T const & operator[] (_bi::value const & v) const { return v.get(); } williamr@4: williamr@4: template T & operator[] (reference_wrapper const & v) const { return v.get(); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } williamr@4: williamr@4: template R operator()(type, F & f, A & a, long) williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]); williamr@4: } williamr@4: williamr@4: template R operator()(type, F const & f, A & a, long) const williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]); williamr@4: } williamr@4: williamr@4: template void operator()(type, F & f, A & a, int) williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]); williamr@4: } williamr@4: williamr@4: template void operator()(type, F const & f, A & a, int) const williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]); williamr@4: } williamr@4: williamr@4: template void accept(V & v) const williamr@4: { williamr@4: base_type::accept(v); williamr@4: } williamr@4: williamr@4: bool operator==(list3 const & rhs) const williamr@4: { williamr@4: return williamr@4: williamr@4: ref_compare( base_type::a1_, rhs.a1_, 0 ) && williamr@4: ref_compare( base_type::a2_, rhs.a2_, 0 ) && williamr@4: ref_compare( base_type::a3_, rhs.a3_, 0 ); williamr@4: } williamr@4: }; williamr@4: williamr@4: template< class A1, class A2, class A3, class A4 > class list4: private storage4< A1, A2, A3, A4 > williamr@4: { williamr@4: private: williamr@4: williamr@4: typedef storage4< A1, A2, A3, A4 > base_type; williamr@4: williamr@4: public: williamr@4: williamr@4: list4( A1 a1, A2 a2, A3 a3, A4 a4 ): base_type( a1, a2, a3, a4 ) {} williamr@4: williamr@4: A1 operator[] (boost::arg<1>) const { return base_type::a1_; } williamr@4: A2 operator[] (boost::arg<2>) const { return base_type::a2_; } williamr@4: A3 operator[] (boost::arg<3>) const { return base_type::a3_; } williamr@4: A4 operator[] (boost::arg<4>) const { return base_type::a4_; } williamr@4: williamr@4: A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; } williamr@4: A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; } williamr@4: A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; } williamr@4: A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; } williamr@4: williamr@4: template T & operator[] (_bi::value & v) const { return v.get(); } williamr@4: williamr@4: template T const & operator[] (_bi::value const & v) const { return v.get(); } williamr@4: williamr@4: template T & operator[] (reference_wrapper const & v) const { return v.get(); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } williamr@4: williamr@4: template R operator()(type, F & f, A & a, long) williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]); williamr@4: } williamr@4: williamr@4: template R operator()(type, F const & f, A & a, long) const williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]); williamr@4: } williamr@4: williamr@4: template void operator()(type, F & f, A & a, int) williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]); williamr@4: } williamr@4: williamr@4: template void operator()(type, F const & f, A & a, int) const williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]); williamr@4: } williamr@4: williamr@4: template void accept(V & v) const williamr@4: { williamr@4: base_type::accept(v); williamr@4: } williamr@4: williamr@4: bool operator==(list4 const & rhs) const williamr@4: { williamr@4: return williamr@4: williamr@4: ref_compare( base_type::a1_, rhs.a1_, 0 ) && williamr@4: ref_compare( base_type::a2_, rhs.a2_, 0 ) && williamr@4: ref_compare( base_type::a3_, rhs.a3_, 0 ) && williamr@4: ref_compare( base_type::a4_, rhs.a4_, 0 ); williamr@4: } williamr@4: }; williamr@4: williamr@4: template< class A1, class A2, class A3, class A4, class A5 > class list5: private storage5< A1, A2, A3, A4, A5 > williamr@4: { williamr@4: private: williamr@4: williamr@4: typedef storage5< A1, A2, A3, A4, A5 > base_type; williamr@4: williamr@4: public: williamr@4: williamr@4: list5( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ): base_type( a1, a2, a3, a4, a5 ) {} williamr@4: williamr@4: A1 operator[] (boost::arg<1>) const { return base_type::a1_; } williamr@4: A2 operator[] (boost::arg<2>) const { return base_type::a2_; } williamr@4: A3 operator[] (boost::arg<3>) const { return base_type::a3_; } williamr@4: A4 operator[] (boost::arg<4>) const { return base_type::a4_; } williamr@4: A5 operator[] (boost::arg<5>) const { return base_type::a5_; } williamr@4: williamr@4: A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; } williamr@4: A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; } williamr@4: A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; } williamr@4: A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; } williamr@4: A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; } williamr@4: williamr@4: template T & operator[] (_bi::value & v) const { return v.get(); } williamr@4: williamr@4: template T const & operator[] (_bi::value const & v) const { return v.get(); } williamr@4: williamr@4: template T & operator[] (reference_wrapper const & v) const { return v.get(); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } williamr@4: williamr@4: template R operator()(type, F & f, A & a, long) williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_]); williamr@4: } williamr@4: williamr@4: template R operator()(type, F const & f, A & a, long) const williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_]); williamr@4: } williamr@4: williamr@4: template void operator()(type, F & f, A & a, int) williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_]); williamr@4: } williamr@4: williamr@4: template void operator()(type, F const & f, A & a, int) const williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_]); williamr@4: } williamr@4: williamr@4: template void accept(V & v) const williamr@4: { williamr@4: base_type::accept(v); williamr@4: } williamr@4: williamr@4: bool operator==(list5 const & rhs) const williamr@4: { williamr@4: return williamr@4: williamr@4: ref_compare( base_type::a1_, rhs.a1_, 0 ) && williamr@4: ref_compare( base_type::a2_, rhs.a2_, 0 ) && williamr@4: ref_compare( base_type::a3_, rhs.a3_, 0 ) && williamr@4: ref_compare( base_type::a4_, rhs.a4_, 0 ) && williamr@4: ref_compare( base_type::a5_, rhs.a5_, 0 ); williamr@4: } williamr@4: }; williamr@4: williamr@4: template class list6: private storage6< A1, A2, A3, A4, A5, A6 > williamr@4: { williamr@4: private: williamr@4: williamr@4: typedef storage6< A1, A2, A3, A4, A5, A6 > base_type; williamr@4: williamr@4: public: williamr@4: williamr@4: list6( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6 ): base_type( a1, a2, a3, a4, a5, a6 ) {} williamr@4: williamr@4: A1 operator[] (boost::arg<1>) const { return base_type::a1_; } williamr@4: A2 operator[] (boost::arg<2>) const { return base_type::a2_; } williamr@4: A3 operator[] (boost::arg<3>) const { return base_type::a3_; } williamr@4: A4 operator[] (boost::arg<4>) const { return base_type::a4_; } williamr@4: A5 operator[] (boost::arg<5>) const { return base_type::a5_; } williamr@4: A6 operator[] (boost::arg<6>) const { return base_type::a6_; } williamr@4: williamr@4: A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; } williamr@4: A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; } williamr@4: A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; } williamr@4: A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; } williamr@4: A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; } williamr@4: A6 operator[] (boost::arg<6> (*) ()) const { return base_type::a6_; } williamr@4: williamr@4: template T & operator[] (_bi::value & v) const { return v.get(); } williamr@4: williamr@4: template T const & operator[] (_bi::value const & v) const { return v.get(); } williamr@4: williamr@4: template T & operator[] (reference_wrapper const & v) const { return v.get(); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } williamr@4: williamr@4: template R operator()(type, F & f, A & a, long) williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_]); williamr@4: } williamr@4: williamr@4: template R operator()(type, F const & f, A & a, long) const williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_]); williamr@4: } williamr@4: williamr@4: template void operator()(type, F & f, A & a, int) williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_]); williamr@4: } williamr@4: williamr@4: template void operator()(type, F const & f, A & a, int) const williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_]); williamr@4: } williamr@4: williamr@4: template void accept(V & v) const williamr@4: { williamr@4: base_type::accept(v); williamr@4: } williamr@4: williamr@4: bool operator==(list6 const & rhs) const williamr@4: { williamr@4: return williamr@4: williamr@4: ref_compare( base_type::a1_, rhs.a1_, 0 ) && williamr@4: ref_compare( base_type::a2_, rhs.a2_, 0 ) && williamr@4: ref_compare( base_type::a3_, rhs.a3_, 0 ) && williamr@4: ref_compare( base_type::a4_, rhs.a4_, 0 ) && williamr@4: ref_compare( base_type::a5_, rhs.a5_, 0 ) && williamr@4: ref_compare( base_type::a6_, rhs.a6_, 0 ); williamr@4: } williamr@4: }; williamr@4: williamr@4: template class list7: private storage7< A1, A2, A3, A4, A5, A6, A7 > williamr@4: { williamr@4: private: williamr@4: williamr@4: typedef storage7< A1, A2, A3, A4, A5, A6, A7 > base_type; williamr@4: williamr@4: public: williamr@4: williamr@4: list7( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7 ): base_type( a1, a2, a3, a4, a5, a6, a7 ) {} williamr@4: williamr@4: A1 operator[] (boost::arg<1>) const { return base_type::a1_; } williamr@4: A2 operator[] (boost::arg<2>) const { return base_type::a2_; } williamr@4: A3 operator[] (boost::arg<3>) const { return base_type::a3_; } williamr@4: A4 operator[] (boost::arg<4>) const { return base_type::a4_; } williamr@4: A5 operator[] (boost::arg<5>) const { return base_type::a5_; } williamr@4: A6 operator[] (boost::arg<6>) const { return base_type::a6_; } williamr@4: A7 operator[] (boost::arg<7>) const { return base_type::a7_; } williamr@4: williamr@4: A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; } williamr@4: A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; } williamr@4: A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; } williamr@4: A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; } williamr@4: A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; } williamr@4: A6 operator[] (boost::arg<6> (*) ()) const { return base_type::a6_; } williamr@4: A7 operator[] (boost::arg<7> (*) ()) const { return base_type::a7_; } williamr@4: williamr@4: template T & operator[] (_bi::value & v) const { return v.get(); } williamr@4: williamr@4: template T const & operator[] (_bi::value const & v) const { return v.get(); } williamr@4: williamr@4: template T & operator[] (reference_wrapper const & v) const { return v.get(); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } williamr@4: williamr@4: template R operator()(type, F & f, A & a, long) williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_]); williamr@4: } williamr@4: williamr@4: template R operator()(type, F const & f, A & a, long) const williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_]); williamr@4: } williamr@4: williamr@4: template void operator()(type, F & f, A & a, int) williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_]); williamr@4: } williamr@4: williamr@4: template void operator()(type, F const & f, A & a, int) const williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_]); williamr@4: } williamr@4: williamr@4: template void accept(V & v) const williamr@4: { williamr@4: base_type::accept(v); williamr@4: } williamr@4: williamr@4: bool operator==(list7 const & rhs) const williamr@4: { williamr@4: return williamr@4: williamr@4: ref_compare( base_type::a1_, rhs.a1_, 0 ) && williamr@4: ref_compare( base_type::a2_, rhs.a2_, 0 ) && williamr@4: ref_compare( base_type::a3_, rhs.a3_, 0 ) && williamr@4: ref_compare( base_type::a4_, rhs.a4_, 0 ) && williamr@4: ref_compare( base_type::a5_, rhs.a5_, 0 ) && williamr@4: ref_compare( base_type::a6_, rhs.a6_, 0 ) && williamr@4: ref_compare( base_type::a7_, rhs.a7_, 0 ); williamr@4: } williamr@4: }; williamr@4: williamr@4: template< class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8 > class list8: private storage8< A1, A2, A3, A4, A5, A6, A7, A8 > williamr@4: { williamr@4: private: williamr@4: williamr@4: typedef storage8< A1, A2, A3, A4, A5, A6, A7, A8 > base_type; williamr@4: williamr@4: public: williamr@4: williamr@4: list8( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8 ): base_type( a1, a2, a3, a4, a5, a6, a7, a8 ) {} williamr@4: williamr@4: A1 operator[] (boost::arg<1>) const { return base_type::a1_; } williamr@4: A2 operator[] (boost::arg<2>) const { return base_type::a2_; } williamr@4: A3 operator[] (boost::arg<3>) const { return base_type::a3_; } williamr@4: A4 operator[] (boost::arg<4>) const { return base_type::a4_; } williamr@4: A5 operator[] (boost::arg<5>) const { return base_type::a5_; } williamr@4: A6 operator[] (boost::arg<6>) const { return base_type::a6_; } williamr@4: A7 operator[] (boost::arg<7>) const { return base_type::a7_; } williamr@4: A8 operator[] (boost::arg<8>) const { return base_type::a8_; } williamr@4: williamr@4: A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; } williamr@4: A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; } williamr@4: A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; } williamr@4: A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; } williamr@4: A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; } williamr@4: A6 operator[] (boost::arg<6> (*) ()) const { return base_type::a6_; } williamr@4: A7 operator[] (boost::arg<7> (*) ()) const { return base_type::a7_; } williamr@4: A8 operator[] (boost::arg<8> (*) ()) const { return base_type::a8_; } williamr@4: williamr@4: template T & operator[] (_bi::value & v) const { return v.get(); } williamr@4: williamr@4: template T const & operator[] (_bi::value const & v) const { return v.get(); } williamr@4: williamr@4: template T & operator[] (reference_wrapper const & v) const { return v.get(); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } williamr@4: williamr@4: template R operator()(type, F & f, A & a, long) williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_], a[base_type::a8_]); williamr@4: } williamr@4: williamr@4: template R operator()(type, F const & f, A & a, long) const williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_], a[base_type::a8_]); williamr@4: } williamr@4: williamr@4: template void operator()(type, F & f, A & a, int) williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_], a[base_type::a8_]); williamr@4: } williamr@4: williamr@4: template void operator()(type, F const & f, A & a, int) const williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_], a[base_type::a8_]); williamr@4: } williamr@4: williamr@4: template void accept(V & v) const williamr@4: { williamr@4: base_type::accept(v); williamr@4: } williamr@4: williamr@4: bool operator==(list8 const & rhs) const williamr@4: { williamr@4: return williamr@4: williamr@4: ref_compare( base_type::a1_, rhs.a1_, 0 ) && williamr@4: ref_compare( base_type::a2_, rhs.a2_, 0 ) && williamr@4: ref_compare( base_type::a3_, rhs.a3_, 0 ) && williamr@4: ref_compare( base_type::a4_, rhs.a4_, 0 ) && williamr@4: ref_compare( base_type::a5_, rhs.a5_, 0 ) && williamr@4: ref_compare( base_type::a6_, rhs.a6_, 0 ) && williamr@4: ref_compare( base_type::a7_, rhs.a7_, 0 ) && williamr@4: ref_compare( base_type::a8_, rhs.a8_, 0 ); williamr@4: } williamr@4: }; williamr@4: williamr@4: template class list9: private storage9< A1, A2, A3, A4, A5, A6, A7, A8, A9 > williamr@4: { williamr@4: private: williamr@4: williamr@4: typedef storage9< A1, A2, A3, A4, A5, A6, A7, A8, A9 > base_type; williamr@4: williamr@4: public: williamr@4: williamr@4: list9( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9 ): base_type( a1, a2, a3, a4, a5, a6, a7, a8, a9 ) {} williamr@4: williamr@4: A1 operator[] (boost::arg<1>) const { return base_type::a1_; } williamr@4: A2 operator[] (boost::arg<2>) const { return base_type::a2_; } williamr@4: A3 operator[] (boost::arg<3>) const { return base_type::a3_; } williamr@4: A4 operator[] (boost::arg<4>) const { return base_type::a4_; } williamr@4: A5 operator[] (boost::arg<5>) const { return base_type::a5_; } williamr@4: A6 operator[] (boost::arg<6>) const { return base_type::a6_; } williamr@4: A7 operator[] (boost::arg<7>) const { return base_type::a7_; } williamr@4: A8 operator[] (boost::arg<8>) const { return base_type::a8_; } williamr@4: A9 operator[] (boost::arg<9>) const { return base_type::a9_; } williamr@4: williamr@4: A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; } williamr@4: A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; } williamr@4: A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; } williamr@4: A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; } williamr@4: A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; } williamr@4: A6 operator[] (boost::arg<6> (*) ()) const { return base_type::a6_; } williamr@4: A7 operator[] (boost::arg<7> (*) ()) const { return base_type::a7_; } williamr@4: A8 operator[] (boost::arg<8> (*) ()) const { return base_type::a8_; } williamr@4: A9 operator[] (boost::arg<9> (*) ()) const { return base_type::a9_; } williamr@4: williamr@4: template T & operator[] (_bi::value & v) const { return v.get(); } williamr@4: williamr@4: template T const & operator[] (_bi::value const & v) const { return v.get(); } williamr@4: williamr@4: template T & operator[] (reference_wrapper const & v) const { return v.get(); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } williamr@4: williamr@4: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } williamr@4: williamr@4: template R operator()(type, F & f, A & a, long) williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_], a[base_type::a8_], a[base_type::a9_]); williamr@4: } williamr@4: williamr@4: template R operator()(type, F const & f, A & a, long) const williamr@4: { williamr@4: return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_], a[base_type::a8_], a[base_type::a9_]); williamr@4: } williamr@4: williamr@4: template void operator()(type, F & f, A & a, int) williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_], a[base_type::a8_], a[base_type::a9_]); williamr@4: } williamr@4: williamr@4: template void operator()(type, F const & f, A & a, int) const williamr@4: { williamr@4: unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_], a[base_type::a6_], a[base_type::a7_], a[base_type::a8_], a[base_type::a9_]); williamr@4: } williamr@4: williamr@4: template void accept(V & v) const williamr@4: { williamr@4: base_type::accept(v); williamr@4: } williamr@4: williamr@4: bool operator==(list9 const & rhs) const williamr@4: { williamr@4: return williamr@4: williamr@4: ref_compare( base_type::a1_, rhs.a1_, 0 ) && williamr@4: ref_compare( base_type::a2_, rhs.a2_, 0 ) && williamr@4: ref_compare( base_type::a3_, rhs.a3_, 0 ) && williamr@4: ref_compare( base_type::a4_, rhs.a4_, 0 ) && williamr@4: ref_compare( base_type::a5_, rhs.a5_, 0 ) && williamr@4: ref_compare( base_type::a6_, rhs.a6_, 0 ) && williamr@4: ref_compare( base_type::a7_, rhs.a7_, 0 ) && williamr@4: ref_compare( base_type::a8_, rhs.a8_, 0 ) && williamr@4: ref_compare( base_type::a9_, rhs.a9_, 0 ); williamr@4: } williamr@4: }; williamr@4: williamr@4: // bind_t williamr@4: williamr@4: #ifndef BOOST_NO_VOID_RETURNS williamr@4: williamr@4: template class bind_t williamr@4: { williamr@4: public: williamr@4: williamr@4: typedef bind_t this_type; williamr@4: williamr@4: bind_t(F f, L const & l): f_(f), l_(l) {} williamr@4: williamr@4: #define BOOST_BIND_RETURN return williamr@4: #include williamr@4: #undef BOOST_BIND_RETURN williamr@4: williamr@4: }; williamr@2: williamr@2: #else williamr@2: williamr@4: template struct bind_t_generator williamr@4: { williamr@2: williamr@4: template class implementation williamr@4: { williamr@4: public: williamr@2: williamr@4: typedef implementation this_type; williamr@2: williamr@4: implementation(F f, L const & l): f_(f), l_(l) {} williamr@2: williamr@4: #define BOOST_BIND_RETURN return williamr@4: #include williamr@4: #undef BOOST_BIND_RETURN williamr@2: williamr@4: }; williamr@2: williamr@4: }; williamr@2: williamr@4: template<> struct bind_t_generator williamr@4: { williamr@2: williamr@4: template class implementation williamr@4: { williamr@4: private: williamr@2: williamr@4: typedef void R; williamr@4: williamr@4: public: williamr@4: williamr@4: typedef implementation this_type; williamr@4: williamr@4: implementation(F f, L const & l): f_(f), l_(l) {} williamr@4: williamr@4: #define BOOST_BIND_RETURN williamr@4: #include williamr@4: #undef BOOST_BIND_RETURN williamr@4: williamr@4: }; williamr@4: williamr@4: }; williamr@4: williamr@4: template class bind_t: public bind_t_generator::BOOST_NESTED_TEMPLATE implementation williamr@4: { williamr@4: public: williamr@4: williamr@4: bind_t(F f, L const & l): bind_t_generator::BOOST_NESTED_TEMPLATE implementation(f, l) {} williamr@4: williamr@4: }; williamr@4: williamr@2: #endif williamr@2: williamr@4: // function_equal williamr@2: williamr@4: #ifndef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP williamr@2: williamr@4: // put overloads in _bi, rely on ADL williamr@4: williamr@4: # ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING williamr@4: williamr@4: template bool function_equal( bind_t const & a, bind_t const & b ) williamr@2: { williamr@4: return a.compare(b); williamr@4: } williamr@4: williamr@4: # else williamr@4: williamr@4: template bool function_equal_impl( bind_t const & a, bind_t const & b, int ) williamr@4: { williamr@4: return a.compare(b); williamr@4: } williamr@4: williamr@4: # endif // #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING williamr@4: williamr@4: #else // BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP williamr@4: williamr@4: // put overloads in boost williamr@4: williamr@4: } // namespace _bi williamr@4: williamr@4: # ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING williamr@4: williamr@4: template bool function_equal( _bi::bind_t const & a, _bi::bind_t const & b ) williamr@4: { williamr@4: return a.compare(b); williamr@4: } williamr@4: williamr@4: # else williamr@4: williamr@4: template bool function_equal_impl( _bi::bind_t const & a, _bi::bind_t const & b, int ) williamr@4: { williamr@4: return a.compare(b); williamr@4: } williamr@4: williamr@4: # endif // #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING williamr@4: williamr@4: namespace _bi williamr@4: { williamr@4: williamr@4: #endif // BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP williamr@4: williamr@4: // add_value williamr@4: williamr@4: #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) || (__SUNPRO_CC >= 0x530) williamr@4: williamr@4: template struct add_value williamr@4: { williamr@4: typedef _bi::value type; williamr@2: }; williamr@2: williamr@4: template struct add_value< value > williamr@2: { williamr@4: typedef _bi::value type; williamr@2: }; williamr@2: williamr@4: template struct add_value< reference_wrapper > williamr@2: { williamr@4: typedef reference_wrapper type; williamr@2: }; williamr@2: williamr@4: template struct add_value< arg > williamr@2: { williamr@4: typedef boost::arg type; williamr@2: }; williamr@2: williamr@4: template struct add_value< arg (*) () > williamr@2: { williamr@4: typedef boost::arg (*type) (); williamr@2: }; williamr@2: williamr@4: template struct add_value< bind_t > williamr@4: { williamr@4: typedef bind_t type; williamr@4: }; williamr@2: williamr@4: #else williamr@4: williamr@4: template struct _avt_0; williamr@4: williamr@4: template<> struct _avt_0<1> williamr@2: { williamr@4: template struct inner williamr@2: { williamr@2: typedef T type; williamr@2: }; williamr@2: }; williamr@2: williamr@4: template<> struct _avt_0<2> williamr@2: { williamr@4: template struct inner williamr@2: { williamr@4: typedef value type; williamr@2: }; williamr@2: }; williamr@2: williamr@4: typedef char (&_avt_r1) [1]; williamr@4: typedef char (&_avt_r2) [2]; williamr@2: williamr@4: template _avt_r1 _avt_f(value); williamr@4: template _avt_r1 _avt_f(reference_wrapper); williamr@4: template _avt_r1 _avt_f(arg); williamr@4: template _avt_r1 _avt_f(arg (*) ()); williamr@4: template _avt_r1 _avt_f(bind_t); williamr@4: williamr@4: _avt_r2 _avt_f(...); williamr@4: williamr@4: template struct add_value williamr@2: { williamr@4: static T t(); williamr@4: typedef typename _avt_0::template inner::type type; williamr@2: }; williamr@2: williamr@4: #endif williamr@2: williamr@4: // list_av_N williamr@4: williamr@4: template struct list_av_1 williamr@2: { williamr@4: typedef typename add_value::type B1; williamr@4: typedef list1 type; williamr@2: }; williamr@2: williamr@4: template struct list_av_2 williamr@2: { williamr@4: typedef typename add_value::type B1; williamr@4: typedef typename add_value::type B2; williamr@4: typedef list2 type; williamr@2: }; williamr@2: williamr@4: template struct list_av_3 williamr@2: { williamr@4: typedef typename add_value::type B1; williamr@4: typedef typename add_value::type B2; williamr@4: typedef typename add_value::type B3; williamr@4: typedef list3 type; williamr@2: }; williamr@2: williamr@4: template struct list_av_4 williamr@4: { williamr@4: typedef typename add_value::type B1; williamr@4: typedef typename add_value::type B2; williamr@4: typedef typename add_value::type B3; williamr@4: typedef typename add_value::type B4; williamr@4: typedef list4 type; williamr@4: }; williamr@2: williamr@4: template struct list_av_5 williamr@4: { williamr@4: typedef typename add_value::type B1; williamr@4: typedef typename add_value::type B2; williamr@4: typedef typename add_value::type B3; williamr@4: typedef typename add_value::type B4; williamr@4: typedef typename add_value::type B5; williamr@4: typedef list5 type; williamr@4: }; williamr@2: williamr@4: template struct list_av_6 williamr@4: { williamr@4: typedef typename add_value::type B1; williamr@4: typedef typename add_value::type B2; williamr@4: typedef typename add_value::type B3; williamr@4: typedef typename add_value::type B4; williamr@4: typedef typename add_value::type B5; williamr@4: typedef typename add_value::type B6; williamr@4: typedef list6 type; williamr@4: }; williamr@2: williamr@4: template struct list_av_7 williamr@4: { williamr@4: typedef typename add_value::type B1; williamr@4: typedef typename add_value::type B2; williamr@4: typedef typename add_value::type B3; williamr@4: typedef typename add_value::type B4; williamr@4: typedef typename add_value::type B5; williamr@4: typedef typename add_value::type B6; williamr@4: typedef typename add_value::type B7; williamr@4: typedef list7 type; williamr@4: }; williamr@4: williamr@4: template struct list_av_8 williamr@4: { williamr@4: typedef typename add_value::type B1; williamr@4: typedef typename add_value::type B2; williamr@4: typedef typename add_value::type B3; williamr@4: typedef typename add_value::type B4; williamr@4: typedef typename add_value::type B5; williamr@4: typedef typename add_value::type B6; williamr@4: typedef typename add_value::type B7; williamr@4: typedef typename add_value::type B8; williamr@4: typedef list8 type; williamr@4: }; williamr@4: williamr@4: template struct list_av_9 williamr@4: { williamr@4: typedef typename add_value::type B1; williamr@4: typedef typename add_value::type B2; williamr@4: typedef typename add_value::type B3; williamr@4: typedef typename add_value::type B4; williamr@4: typedef typename add_value::type B5; williamr@4: typedef typename add_value::type B6; williamr@4: typedef typename add_value::type B7; williamr@4: typedef typename add_value::type B8; williamr@4: typedef typename add_value::type B9; williamr@4: typedef list9 type; williamr@4: }; williamr@4: williamr@4: // operator! williamr@4: williamr@4: struct logical_not williamr@4: { williamr@4: template bool operator()(V const & v) const { return !v; } williamr@4: }; williamr@4: williamr@4: template williamr@4: bind_t< bool, logical_not, list1< bind_t > > williamr@4: operator! (bind_t const & f) williamr@4: { williamr@4: typedef list1< bind_t > list_type; williamr@4: return bind_t ( logical_not(), list_type(f) ); williamr@4: } williamr@4: williamr@4: // relational operators williamr@4: williamr@4: #define BOOST_BIND_OPERATOR( op, name ) \ williamr@4: \ williamr@4: struct name \ williamr@4: { \ williamr@4: template bool operator()(V const & v, W const & w) const { return v op w; } \ williamr@4: }; \ williamr@4: \ williamr@4: template \ williamr@4: bind_t< bool, name, list2< bind_t, typename add_value::type > > \ williamr@4: operator op (bind_t const & f, A2 a2) \ williamr@4: { \ williamr@4: typedef typename add_value::type B2; \ williamr@4: typedef list2< bind_t, B2> list_type; \ williamr@4: return bind_t ( name(), list_type(f, a2) ); \ williamr@4: } williamr@4: williamr@4: BOOST_BIND_OPERATOR( ==, equal ) williamr@4: BOOST_BIND_OPERATOR( !=, not_equal ) williamr@4: williamr@4: BOOST_BIND_OPERATOR( <, less ) williamr@4: BOOST_BIND_OPERATOR( <=, less_equal ) williamr@4: williamr@4: BOOST_BIND_OPERATOR( >, greater ) williamr@4: BOOST_BIND_OPERATOR( >=, greater_equal ) williamr@4: williamr@4: #undef BOOST_BIND_OPERATOR williamr@4: williamr@4: #if defined(__GNUC__) && BOOST_WORKAROUND(__GNUC__, < 3) williamr@4: williamr@4: // resolve ambiguity with rel_ops williamr@4: williamr@4: #define BOOST_BIND_OPERATOR( op, name ) \ williamr@4: \ williamr@4: template \ williamr@4: bind_t< bool, name, list2< bind_t, bind_t > > \ williamr@4: operator op (bind_t const & f, bind_t const & g) \ williamr@4: { \ williamr@4: typedef list2< bind_t, bind_t > list_type; \ williamr@4: return bind_t ( name(), list_type(f, g) ); \ williamr@4: } williamr@4: williamr@4: BOOST_BIND_OPERATOR( !=, not_equal ) williamr@4: BOOST_BIND_OPERATOR( <=, less_equal ) williamr@4: BOOST_BIND_OPERATOR( >, greater ) williamr@4: BOOST_BIND_OPERATOR( >=, greater_equal ) williamr@4: williamr@2: #endif williamr@2: williamr@4: // visit_each, ADL williamr@2: williamr@4: #if !defined( BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP ) && !defined( __BORLANDC__ ) \ williamr@4: && !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3) williamr@4: williamr@4: template void visit_each( V & v, value const & t, int ) williamr@2: { williamr@4: using boost::visit_each; williamr@4: BOOST_BIND_VISIT_EACH( v, t.get(), 0 ); williamr@4: } williamr@2: williamr@4: template void visit_each( V & v, bind_t const & t, int ) williamr@2: { williamr@4: t.accept( v ); williamr@4: } williamr@2: williamr@2: #endif williamr@2: williamr@4: } // namespace _bi williamr@2: williamr@4: // visit_each, no ADL williamr@4: williamr@4: #if defined( BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP ) || defined( __BORLANDC__ ) \ williamr@4: || (defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3) williamr@4: williamr@4: template void visit_each( V & v, _bi::value const & t, int ) williamr@4: { williamr@4: BOOST_BIND_VISIT_EACH( v, t.get(), 0 ); williamr@2: } williamr@2: williamr@4: template void visit_each( V & v, _bi::bind_t const & t, int ) williamr@4: { williamr@4: t.accept( v ); williamr@4: } williamr@4: williamr@4: #endif williamr@4: williamr@2: // bind williamr@4: williamr@4: #ifndef BOOST_BIND williamr@4: #define BOOST_BIND bind williamr@4: #endif williamr@4: williamr@4: // generic function objects williamr@4: williamr@4: template williamr@4: _bi::bind_t williamr@4: BOOST_BIND(F f) williamr@2: { williamr@4: typedef _bi::list0 list_type; williamr@4: return _bi::bind_t (f, list_type()); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t::type> williamr@4: BOOST_BIND(F f, A1 a1) williamr@4: { williamr@4: typedef typename _bi::list_av_1::type list_type; williamr@4: return _bi::bind_t (f, list_type(a1)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t::type> williamr@4: BOOST_BIND(F f, A1 a1, A2 a2) williamr@4: { williamr@4: typedef typename _bi::list_av_2::type list_type; williamr@4: return _bi::bind_t (f, list_type(a1, a2)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t::type> williamr@4: BOOST_BIND(F f, A1 a1, A2 a2, A3 a3) williamr@4: { williamr@4: typedef typename _bi::list_av_3::type list_type; williamr@4: return _bi::bind_t(f, list_type(a1, a2, a3)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t::type> williamr@4: BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4) williamr@4: { williamr@4: typedef typename _bi::list_av_4::type list_type; williamr@4: return _bi::bind_t(f, list_type(a1, a2, a3, a4)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t::type> williamr@4: BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) williamr@4: { williamr@4: typedef typename _bi::list_av_5::type list_type; williamr@4: return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t::type> williamr@4: BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) williamr@4: { williamr@4: typedef typename _bi::list_av_6::type list_type; williamr@4: return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5, a6)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t::type> williamr@4: BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) williamr@4: { williamr@4: typedef typename _bi::list_av_7::type list_type; williamr@4: return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5, a6, a7)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t::type> williamr@4: BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) williamr@4: { williamr@4: typedef typename _bi::list_av_8::type list_type; williamr@4: return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t::type> williamr@4: BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) williamr@4: { williamr@4: typedef typename _bi::list_av_9::type list_type; williamr@4: return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9)); williamr@4: } williamr@2: williamr@4: // generic function objects, alternative syntax williamr@2: williamr@4: template williamr@4: _bi::bind_t williamr@4: BOOST_BIND(boost::type, F f) williamr@4: { williamr@4: typedef _bi::list0 list_type; williamr@4: return _bi::bind_t (f, list_type()); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t::type> williamr@4: BOOST_BIND(boost::type, F f, A1 a1) williamr@4: { williamr@4: typedef typename _bi::list_av_1::type list_type; williamr@4: return _bi::bind_t (f, list_type(a1)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t::type> williamr@4: BOOST_BIND(boost::type, F f, A1 a1, A2 a2) williamr@4: { williamr@4: typedef typename _bi::list_av_2::type list_type; williamr@4: return _bi::bind_t (f, list_type(a1, a2)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t::type> williamr@4: BOOST_BIND(boost::type, F f, A1 a1, A2 a2, A3 a3) williamr@2: { williamr@4: typedef typename _bi::list_av_3::type list_type; williamr@4: return _bi::bind_t(f, list_type(a1, a2, a3)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t::type> williamr@4: BOOST_BIND(boost::type, F f, A1 a1, A2 a2, A3 a3, A4 a4) williamr@4: { williamr@4: typedef typename _bi::list_av_4::type list_type; williamr@4: return _bi::bind_t(f, list_type(a1, a2, a3, a4)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t::type> williamr@4: BOOST_BIND(boost::type, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) williamr@4: { williamr@4: typedef typename _bi::list_av_5::type list_type; williamr@4: return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t::type> williamr@4: BOOST_BIND(boost::type, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) williamr@4: { williamr@4: typedef typename _bi::list_av_6::type list_type; williamr@4: return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5, a6)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t::type> williamr@4: BOOST_BIND(boost::type, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) williamr@4: { williamr@4: typedef typename _bi::list_av_7::type list_type; williamr@4: return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5, a6, a7)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t::type> williamr@4: BOOST_BIND(boost::type, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) williamr@2: { williamr@4: typedef typename _bi::list_av_8::type list_type; williamr@4: return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t::type> williamr@4: BOOST_BIND(boost::type, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) williamr@4: { williamr@4: typedef typename _bi::list_av_9::type list_type; williamr@4: return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9)); williamr@4: } williamr@2: williamr@4: #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) williamr@2: williamr@4: // adaptable function objects williamr@2: williamr@4: template williamr@4: _bi::bind_t<_bi::unspecified, F, _bi::list0> williamr@4: BOOST_BIND(F f) williamr@4: { williamr@4: typedef _bi::list0 list_type; williamr@4: return _bi::bind_t<_bi::unspecified, F, list_type> (f, list_type()); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_1::type> williamr@4: BOOST_BIND(F f, A1 a1) williamr@4: { williamr@4: typedef typename _bi::list_av_1::type list_type; williamr@4: return _bi::bind_t<_bi::unspecified, F, list_type> (f, list_type(a1)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_2::type> williamr@4: BOOST_BIND(F f, A1 a1, A2 a2) williamr@4: { williamr@4: typedef typename _bi::list_av_2::type list_type; williamr@4: return _bi::bind_t<_bi::unspecified, F, list_type> (f, list_type(a1, a2)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_3::type> williamr@4: BOOST_BIND(F f, A1 a1, A2 a2, A3 a3) williamr@4: { williamr@4: typedef typename _bi::list_av_3::type list_type; williamr@4: return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_4::type> williamr@4: BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4) williamr@4: { williamr@4: typedef typename _bi::list_av_4::type list_type; williamr@4: return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3, a4)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_5::type> williamr@4: BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) williamr@4: { williamr@4: typedef typename _bi::list_av_5::type list_type; williamr@4: return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3, a4, a5)); williamr@4: } williamr@2: williamr@4: template williamr@4: _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_6::type> williamr@4: BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) williamr@2: { williamr@4: typedef typename _bi::list_av_6::type list_type; williamr@4: return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6)); williamr@4: } williamr@4: williamr@4: template williamr@4: _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_7::type> williamr@4: BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) williamr@4: { williamr@4: typedef typename _bi::list_av_7::type list_type; williamr@4: return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7)); williamr@4: } williamr@4: williamr@4: template williamr@4: _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_8::type> williamr@4: BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) williamr@4: { williamr@4: typedef typename _bi::list_av_8::type list_type; williamr@4: return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8)); williamr@4: } williamr@4: williamr@4: template williamr@4: _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_9::type> williamr@4: BOOST_BIND(F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) williamr@4: { williamr@4: typedef typename _bi::list_av_9::type list_type; williamr@4: return _bi::bind_t<_bi::unspecified, F, list_type>(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9)); williamr@4: } williamr@4: williamr@4: #endif // !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) williamr@4: williamr@4: // function pointers williamr@4: williamr@4: #define BOOST_BIND_CC williamr@4: #define BOOST_BIND_ST williamr@4: williamr@4: #include williamr@4: williamr@4: #undef BOOST_BIND_CC williamr@4: #undef BOOST_BIND_ST williamr@4: williamr@4: #ifdef BOOST_BIND_ENABLE_STDCALL williamr@4: williamr@4: #define BOOST_BIND_CC __stdcall williamr@4: #define BOOST_BIND_ST williamr@4: williamr@4: #include williamr@4: williamr@4: #undef BOOST_BIND_CC williamr@4: #undef BOOST_BIND_ST williamr@4: williamr@4: #endif williamr@4: williamr@4: #ifdef BOOST_BIND_ENABLE_FASTCALL williamr@4: williamr@4: #define BOOST_BIND_CC __fastcall williamr@4: #define BOOST_BIND_ST williamr@4: williamr@4: #include williamr@4: williamr@4: #undef BOOST_BIND_CC williamr@4: #undef BOOST_BIND_ST williamr@4: williamr@4: #endif williamr@4: williamr@4: #ifdef BOOST_BIND_ENABLE_PASCAL williamr@4: williamr@4: #define BOOST_BIND_ST pascal williamr@4: #define BOOST_BIND_CC williamr@4: williamr@4: #include williamr@4: williamr@4: #undef BOOST_BIND_ST williamr@4: #undef BOOST_BIND_CC williamr@4: williamr@4: #endif williamr@4: williamr@4: // member function pointers williamr@4: williamr@4: #define BOOST_BIND_MF_NAME(X) X williamr@4: #define BOOST_BIND_MF_CC williamr@4: williamr@4: #include williamr@4: williamr@4: #undef BOOST_BIND_MF_NAME williamr@4: #undef BOOST_BIND_MF_CC williamr@4: williamr@4: #ifdef BOOST_MEM_FN_ENABLE_CDECL williamr@4: williamr@4: #define BOOST_BIND_MF_NAME(X) X##_cdecl williamr@4: #define BOOST_BIND_MF_CC __cdecl williamr@4: williamr@4: #include williamr@4: williamr@4: #undef BOOST_BIND_MF_NAME williamr@4: #undef BOOST_BIND_MF_CC williamr@4: williamr@4: #endif williamr@4: williamr@4: #ifdef BOOST_MEM_FN_ENABLE_STDCALL williamr@4: williamr@4: #define BOOST_BIND_MF_NAME(X) X##_stdcall williamr@4: #define BOOST_BIND_MF_CC __stdcall williamr@4: williamr@4: #include williamr@4: williamr@4: #undef BOOST_BIND_MF_NAME williamr@4: #undef BOOST_BIND_MF_CC williamr@4: williamr@4: #endif williamr@4: williamr@4: #ifdef BOOST_MEM_FN_ENABLE_FASTCALL williamr@4: williamr@4: #define BOOST_BIND_MF_NAME(X) X##_fastcall williamr@4: #define BOOST_BIND_MF_CC __fastcall williamr@4: williamr@4: #include williamr@4: williamr@4: #undef BOOST_BIND_MF_NAME williamr@4: #undef BOOST_BIND_MF_CC williamr@4: williamr@4: #endif williamr@4: williamr@4: // data member pointers williamr@4: williamr@4: #if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) || defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \ williamr@4: || ( defined(__BORLANDC__) && BOOST_WORKAROUND( __BORLANDC__, < 0x600 ) ) williamr@4: williamr@4: template williamr@4: _bi::bind_t< R, _mfi::dm, typename _bi::list_av_1::type > williamr@4: BOOST_BIND(R T::*f, A1 a1) williamr@4: { williamr@4: typedef _mfi::dm F; williamr@4: typedef typename _bi::list_av_1::type list_type; williamr@4: return _bi::bind_t( F(f), list_type(a1) ); williamr@4: } williamr@2: williamr@2: #else williamr@2: williamr@4: namespace _bi williamr@4: { williamr@2: williamr@4: template< class Pm, int I > struct add_cref; williamr@2: williamr@4: template< class M, class T > struct add_cref< M T::*, 0 > williamr@4: { williamr@4: typedef M type; williamr@4: }; williamr@2: williamr@4: template< class M, class T > struct add_cref< M T::*, 1 > williamr@4: { williamr@4: typedef M const & type; williamr@4: }; williamr@2: williamr@4: template< class R, class T > struct add_cref< R (T::*) (), 1 > williamr@2: { williamr@4: typedef void type; williamr@2: }; williamr@4: williamr@4: #if !( defined(__IBMCPP__) && BOOST_WORKAROUND( __IBMCPP__, BOOST_TESTED_AT(600) ) ) williamr@4: williamr@4: template< class R, class T > struct add_cref< R (T::*) () const, 1 > williamr@2: { williamr@4: typedef void type; williamr@2: }; williamr@4: williamr@4: #endif // __IBMCPP__ williamr@4: williamr@4: template struct isref williamr@4: { williamr@4: enum value_type { value = 0 }; williamr@4: }; williamr@4: williamr@4: template struct isref< R& > williamr@4: { williamr@4: enum value_type { value = 1 }; williamr@4: }; williamr@4: williamr@4: template struct isref< R* > williamr@4: { williamr@4: enum value_type { value = 1 }; williamr@4: }; williamr@4: williamr@4: template struct dm_result williamr@4: { williamr@4: typedef typename add_cref< Pm, 1 >::type type; williamr@4: }; williamr@4: williamr@4: template struct dm_result< Pm, bind_t > williamr@4: { williamr@4: typedef typename bind_t::result_type result_type; williamr@4: typedef typename add_cref< Pm, isref< result_type >::value >::type type; williamr@4: }; williamr@4: williamr@4: } // namespace _bi williamr@4: williamr@4: template< class A1, class M, class T > williamr@4: williamr@4: _bi::bind_t< williamr@4: typename _bi::dm_result< M T::*, A1 >::type, williamr@4: _mfi::dm, williamr@4: typename _bi::list_av_1::type williamr@4: > williamr@4: williamr@4: BOOST_BIND( M T::*f, A1 a1 ) williamr@4: { williamr@4: typedef typename _bi::dm_result< M T::*, A1 >::type result_type; williamr@4: typedef _mfi::dm F; williamr@4: typedef typename _bi::list_av_1::type list_type; williamr@4: return _bi::bind_t< result_type, F, list_type >( F( f ), list_type( a1 ) ); williamr@4: } williamr@4: williamr@2: #endif williamr@2: williamr@4: } // namespace boost williamr@2: williamr@4: #ifndef BOOST_BIND_NO_PLACEHOLDERS williamr@2: williamr@4: # include williamr@2: williamr@4: #endif williamr@2: williamr@4: #ifdef BOOST_MSVC williamr@4: # pragma warning(default: 4512) // assignment operator could not be generated williamr@4: # pragma warning(pop) williamr@4: #endif williamr@2: williamr@4: #endif // #ifndef BOOST_BIND_HPP_INCLUDED