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