X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=boost%2Fboost%2Fbind.hpp;h=6979fecd0576d99747a78e4c3b2b61b3482102bc;hb=b01a9dc187d9cd396a57463ad27511379dcdc9cd;hp=0525e60666fe537bc535825a9041b8e90f8aff42;hpb=085b2cd11f1d045932bb9d1a54073010cbb006be;p=lyx.git diff --git a/boost/boost/bind.hpp b/boost/boost/bind.hpp index 0525e60666..6979fecd05 100644 --- a/boost/boost/bind.hpp +++ b/boost/boost/bind.hpp @@ -12,6 +12,7 @@ // // Copyright (c) 2001-2004 Peter Dimov and Multi Media Ltd. // Copyright (c) 2001 David Abrahams +// Copyright (c) 2005 Peter Dimov // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at @@ -25,8 +26,8 @@ #include #include #include -#include #include +#include // Borland-specific bug, visit_each() silently fails to produce code @@ -36,6 +37,8 @@ # define BOOST_BIND_VISIT_EACH visit_each #endif +#include + #ifdef BOOST_MSVC # pragma warning(push) # pragma warning(disable: 4512) // assignment operator could not be generated @@ -72,12 +75,22 @@ template struct result_traits< unspecified, reference_wrapper > // ref_compare -template bool ref_compare(T const & a, T const & b, long) +template bool ref_compare( T const & a, T const & b, long ) { return a == b; } -template bool ref_compare(reference_wrapper const & a, reference_wrapper const & b, int) +template bool ref_compare( arg const &, arg const &, int ) +{ + return true; +} + +template bool ref_compare( arg (*) (), arg (*) (), int ) +{ + return true; +} + +template bool ref_compare( reference_wrapper const & a, reference_wrapper const & b, int ) { return a.get_pointer() == b.get_pointer(); } @@ -113,38 +126,23 @@ template class type {}; // unwrap -template inline F & unwrap(F * f, long) -{ - return *f; -} - -template inline F & unwrap(reference_wrapper * f, int) +template struct unwrapper { - return f->get(); -} - -template inline F & unwrap(reference_wrapper const * f, int) -{ - return f->get(); -} - -#if !( defined(__MWERKS__) && BOOST_WORKAROUND(__MWERKS__, <= 0x3003) ) - -template inline _mfi::dm unwrap(R T::* * pm, int) -{ - return _mfi::dm(*pm); -} - -#if !BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600)) -// IBM/VisualAge 6.0 is not able to handle this overload. -template inline _mfi::dm unwrap(R T::* const * pm, int) -{ - return _mfi::dm(*pm); -} -#endif + static inline F & unwrap( F & f, long ) + { + return f; + } + template static inline F2 & unwrap( reference_wrapper rf, int ) + { + return rf.get(); + } -#endif + template static inline _mfi::dm unwrap( R T::* pm, int ) + { + return _mfi::dm( pm ); + } +}; // listN @@ -154,9 +152,9 @@ public: list0() {} - template T & operator[] (value & v) const { return v.get(); } + template T & operator[] (_bi::value & v) const { return v.get(); } - template T const & operator[] (value const & v) const { return v.get(); } + template T const & operator[] (_bi::value const & v) const { return v.get(); } template T & operator[] (reference_wrapper const & v) const { return v.get(); } @@ -166,22 +164,22 @@ public: template R operator()(type, F & f, A &, long) { - return unwrap(&f, 0)(); + return unwrapper::unwrap(f, 0)(); } template R operator()(type, F const & f, A &, long) const { - return unwrap(&f, 0)(); + return unwrapper::unwrap(f, 0)(); } template void operator()(type, F & f, A &, int) { - unwrap(&f, 0)(); + unwrapper::unwrap(f, 0)(); } template void operator()(type, F const & f, A &, int) const { - unwrap(&f, 0)(); + unwrapper::unwrap(f, 0)(); } template void accept(V &) const @@ -194,19 +192,23 @@ public: } }; -template class list1 +template< class A1 > class list1: private storage1< A1 > { +private: + + typedef storage1< A1 > base_type; + public: - explicit list1(A1 a1): a1_(a1) {} + explicit list1( A1 a1 ): base_type( a1 ) {} - A1 operator[] (boost::arg<1>) const { return a1_; } + A1 operator[] (boost::arg<1>) const { return base_type::a1_; } - A1 operator[] (boost::arg<1> (*) ()) const { return a1_; } + A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; } - template T & operator[] (value & v) const { return v.get(); } + template T & operator[] ( _bi::value & v ) const { return v.get(); } - template T const & operator[] (value const & v) const { return v.get(); } + template T const & operator[] ( _bi::value const & v ) const { return v.get(); } template T & operator[] (reference_wrapper const & v) const { return v.get(); } @@ -216,54 +218,54 @@ public: template R operator()(type, F & f, A & a, long) { - return unwrap(&f, 0)(a[a1_]); + return unwrapper::unwrap(f, 0)(a[base_type::a1_]); } template R operator()(type, F const & f, A & a, long) const { - return unwrap(&f, 0)(a[a1_]); + return unwrapper::unwrap(f, 0)(a[base_type::a1_]); } template void operator()(type, F & f, A & a, int) { - unwrap(&f, 0)(a[a1_]); + unwrapper::unwrap(f, 0)(a[base_type::a1_]); } template void operator()(type, F const & f, A & a, int) const { - unwrap(&f, 0)(a[a1_]); + unwrapper::unwrap(f, 0)(a[base_type::a1_]); } template void accept(V & v) const { - BOOST_BIND_VISIT_EACH(v, a1_, 0); + base_type::accept(v); } bool operator==(list1 const & rhs) const { - return ref_compare(a1_, rhs.a1_, 0); + return ref_compare(base_type::a1_, rhs.a1_, 0); } +}; +template< class A1, class A2 > class list2: private storage2< A1, A2 > +{ private: - A1 a1_; -}; + typedef storage2< A1, A2 > base_type; -template class list2 -{ public: - list2(A1 a1, A2 a2): a1_(a1), a2_(a2) {} + list2( A1 a1, A2 a2 ): base_type( a1, a2 ) {} - A1 operator[] (boost::arg<1>) const { return a1_; } - A2 operator[] (boost::arg<2>) const { return a2_; } + A1 operator[] (boost::arg<1>) const { return base_type::a1_; } + A2 operator[] (boost::arg<2>) const { return base_type::a2_; } - A1 operator[] (boost::arg<1> (*) ()) const { return a1_; } - A2 operator[] (boost::arg<2> (*) ()) const { return a2_; } + A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; } + A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; } - template T & operator[] (value & v) const { return v.get(); } + template T & operator[] (_bi::value & v) const { return v.get(); } - template T const & operator[] (value const & v) const { return v.get(); } + template T const & operator[] (_bi::value const & v) const { return v.get(); } template T & operator[] (reference_wrapper const & v) const { return v.get(); } @@ -273,58 +275,56 @@ public: template R operator()(type, F & f, A & a, long) { - return unwrap(&f, 0)(a[a1_], a[a2_]); + return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]); } template R operator()(type, F const & f, A & a, long) const { - return unwrap(&f, 0)(a[a1_], a[a2_]); + return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]); } template void operator()(type, F & f, A & a, int) { - unwrap(&f, 0)(a[a1_], a[a2_]); + unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]); } template void operator()(type, F const & f, A & a, int) const { - unwrap(&f, 0)(a[a1_], a[a2_]); + unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]); } template void accept(V & v) const { - BOOST_BIND_VISIT_EACH(v, a1_, 0); - BOOST_BIND_VISIT_EACH(v, a2_, 0); + base_type::accept(v); } bool operator==(list2 const & rhs) const { - return ref_compare(a1_, rhs.a1_, 0) && ref_compare(a2_, rhs.a2_, 0); + return ref_compare(base_type::a1_, rhs.a1_, 0) && ref_compare(base_type::a2_, rhs.a2_, 0); } +}; +template< class A1, class A2, class A3 > class list3: private storage3< A1, A2, A3 > +{ private: - A1 a1_; - A2 a2_; -}; + typedef storage3< A1, A2, A3 > base_type; -template class list3 -{ public: - list3(A1 a1, A2 a2, A3 a3): a1_(a1), a2_(a2), a3_(a3) {} + list3( A1 a1, A2 a2, A3 a3 ): base_type( a1, a2, a3 ) {} - A1 operator[] (boost::arg<1>) const { return a1_; } - A2 operator[] (boost::arg<2>) const { return a2_; } - A3 operator[] (boost::arg<3>) const { return a3_; } + A1 operator[] (boost::arg<1>) const { return base_type::a1_; } + A2 operator[] (boost::arg<2>) const { return base_type::a2_; } + A3 operator[] (boost::arg<3>) const { return base_type::a3_; } - A1 operator[] (boost::arg<1> (*) ()) const { return a1_; } - A2 operator[] (boost::arg<2> (*) ()) const { return a2_; } - A3 operator[] (boost::arg<3> (*) ()) const { return a3_; } + A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; } + A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; } + A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; } - template T & operator[] (value & v) const { return v.get(); } + template T & operator[] (_bi::value & v) const { return v.get(); } - template T const & operator[] (value const & v) const { return v.get(); } + template T const & operator[] (_bi::value const & v) const { return v.get(); } template T & operator[] (reference_wrapper const & v) const { return v.get(); } @@ -334,62 +334,62 @@ public: template R operator()(type, F & f, A & a, long) { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_]); + return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]); } template R operator()(type, F const & f, A & a, long) const { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_]); + return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]); } template void operator()(type, F & f, A & a, int) { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_]); + unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]); } template void operator()(type, F const & f, A & a, int) const { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_]); + unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]); } template void accept(V & v) const { - BOOST_BIND_VISIT_EACH(v, a1_, 0); - BOOST_BIND_VISIT_EACH(v, a2_, 0); - BOOST_BIND_VISIT_EACH(v, a3_, 0); + base_type::accept(v); } bool operator==(list3 const & rhs) const { - return ref_compare(a1_, rhs.a1_, 0) && ref_compare(a2_, rhs.a2_, 0) && ref_compare(a3_, rhs.a3_, 0); + return + + ref_compare( base_type::a1_, rhs.a1_, 0 ) && + ref_compare( base_type::a2_, rhs.a2_, 0 ) && + ref_compare( base_type::a3_, rhs.a3_, 0 ); } +}; +template< class A1, class A2, class A3, class A4 > class list4: private storage4< A1, A2, A3, A4 > +{ private: - A1 a1_; - A2 a2_; - A3 a3_; -}; + typedef storage4< A1, A2, A3, A4 > base_type; -template class list4 -{ public: - list4(A1 a1, A2 a2, A3 a3, A4 a4): a1_(a1), a2_(a2), a3_(a3), a4_(a4) {} + list4( A1 a1, A2 a2, A3 a3, A4 a4 ): base_type( a1, a2, a3, a4 ) {} - A1 operator[] (boost::arg<1>) const { return a1_; } - A2 operator[] (boost::arg<2>) const { return a2_; } - A3 operator[] (boost::arg<3>) const { return a3_; } - A4 operator[] (boost::arg<4>) const { return a4_; } + A1 operator[] (boost::arg<1>) const { return base_type::a1_; } + A2 operator[] (boost::arg<2>) const { return base_type::a2_; } + A3 operator[] (boost::arg<3>) const { return base_type::a3_; } + A4 operator[] (boost::arg<4>) const { return base_type::a4_; } - A1 operator[] (boost::arg<1> (*) ()) const { return a1_; } - A2 operator[] (boost::arg<2> (*) ()) const { return a2_; } - A3 operator[] (boost::arg<3> (*) ()) const { return a3_; } - A4 operator[] (boost::arg<4> (*) ()) const { return a4_; } + A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; } + A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; } + A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; } + A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; } - template T & operator[] (value & v) const { return v.get(); } + template T & operator[] (_bi::value & v) const { return v.get(); } - template T const & operator[] (value const & v) const { return v.get(); } + template T const & operator[] (_bi::value const & v) const { return v.get(); } template T & operator[] (reference_wrapper const & v) const { return v.get(); } @@ -399,68 +399,65 @@ public: template R operator()(type, F & f, A & a, long) { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]); + return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]); } template R operator()(type, F const & f, A & a, long) const { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]); + return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]); } template void operator()(type, F & f, A & a, int) { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]); + unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]); } template void operator()(type, F const & f, A & a, int) const { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_]); + unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]); } template void accept(V & v) const { - BOOST_BIND_VISIT_EACH(v, a1_, 0); - BOOST_BIND_VISIT_EACH(v, a2_, 0); - BOOST_BIND_VISIT_EACH(v, a3_, 0); - BOOST_BIND_VISIT_EACH(v, a4_, 0); + base_type::accept(v); } bool operator==(list4 const & rhs) const { return - ref_compare(a1_, rhs.a1_, 0) && ref_compare(a2_, rhs.a2_, 0) && ref_compare(a3_, rhs.a3_, 0) && - ref_compare(a4_, rhs.a4_, 0); + + ref_compare( base_type::a1_, rhs.a1_, 0 ) && + ref_compare( base_type::a2_, rhs.a2_, 0 ) && + ref_compare( base_type::a3_, rhs.a3_, 0 ) && + ref_compare( base_type::a4_, rhs.a4_, 0 ); } +}; +template< class A1, class A2, class A3, class A4, class A5 > class list5: private storage5< A1, A2, A3, A4, A5 > +{ private: - A1 a1_; - A2 a2_; - A3 a3_; - A4 a4_; -}; + typedef storage5< A1, A2, A3, A4, A5 > base_type; -template class list5 -{ public: - list5(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5): a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5) {} + list5( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ): base_type( a1, a2, a3, a4, a5 ) {} - A1 operator[] (boost::arg<1>) const { return a1_; } - A2 operator[] (boost::arg<2>) const { return a2_; } - A3 operator[] (boost::arg<3>) const { return a3_; } - A4 operator[] (boost::arg<4>) const { return a4_; } - A5 operator[] (boost::arg<5>) const { return a5_; } + A1 operator[] (boost::arg<1>) const { return base_type::a1_; } + A2 operator[] (boost::arg<2>) const { return base_type::a2_; } + A3 operator[] (boost::arg<3>) const { return base_type::a3_; } + A4 operator[] (boost::arg<4>) const { return base_type::a4_; } + A5 operator[] (boost::arg<5>) const { return base_type::a5_; } - A1 operator[] (boost::arg<1> (*) ()) const { return a1_; } - A2 operator[] (boost::arg<2> (*) ()) const { return a2_; } - A3 operator[] (boost::arg<3> (*) ()) const { return a3_; } - A4 operator[] (boost::arg<4> (*) ()) const { return a4_; } - A5 operator[] (boost::arg<5> (*) ()) const { return a5_; } + A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; } + A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; } + A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; } + A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; } + A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; } - template T & operator[] (value & v) const { return v.get(); } + template T & operator[] (_bi::value & v) const { return v.get(); } - template T const & operator[] (value const & v) const { return v.get(); } + template T const & operator[] (_bi::value const & v) const { return v.get(); } template T & operator[] (reference_wrapper const & v) const { return v.get(); } @@ -470,72 +467,68 @@ public: template R operator()(type, F & f, A & a, long) { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]); + 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_]); } template R operator()(type, F const & f, A & a, long) const { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]); + 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_]); } template void operator()(type, F & f, A & a, int) { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]); + unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_]); } template void operator()(type, F const & f, A & a, int) const { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_]); + unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_]); } template void accept(V & v) const { - BOOST_BIND_VISIT_EACH(v, a1_, 0); - BOOST_BIND_VISIT_EACH(v, a2_, 0); - BOOST_BIND_VISIT_EACH(v, a3_, 0); - BOOST_BIND_VISIT_EACH(v, a4_, 0); - BOOST_BIND_VISIT_EACH(v, a5_, 0); + base_type::accept(v); } bool operator==(list5 const & rhs) const { return - ref_compare(a1_, rhs.a1_, 0) && ref_compare(a2_, rhs.a2_, 0) && ref_compare(a3_, rhs.a3_, 0) && - ref_compare(a4_, rhs.a4_, 0) && ref_compare(a5_, rhs.a5_, 0); + + ref_compare( base_type::a1_, rhs.a1_, 0 ) && + ref_compare( base_type::a2_, rhs.a2_, 0 ) && + ref_compare( base_type::a3_, rhs.a3_, 0 ) && + ref_compare( base_type::a4_, rhs.a4_, 0 ) && + ref_compare( base_type::a5_, rhs.a5_, 0 ); } +}; +template class list6: private storage6< A1, A2, A3, A4, A5, A6 > +{ private: - A1 a1_; - A2 a2_; - A3 a3_; - A4 a4_; - A5 a5_; -}; + typedef storage6< A1, A2, A3, A4, A5, A6 > base_type; -template class list6 -{ public: - list6(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6): a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5), a6_(a6) {} + list6( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6 ): base_type( a1, a2, a3, a4, a5, a6 ) {} - A1 operator[] (boost::arg<1>) const { return a1_; } - A2 operator[] (boost::arg<2>) const { return a2_; } - A3 operator[] (boost::arg<3>) const { return a3_; } - A4 operator[] (boost::arg<4>) const { return a4_; } - A5 operator[] (boost::arg<5>) const { return a5_; } - A6 operator[] (boost::arg<6>) const { return a6_; } + A1 operator[] (boost::arg<1>) const { return base_type::a1_; } + A2 operator[] (boost::arg<2>) const { return base_type::a2_; } + A3 operator[] (boost::arg<3>) const { return base_type::a3_; } + A4 operator[] (boost::arg<4>) const { return base_type::a4_; } + A5 operator[] (boost::arg<5>) const { return base_type::a5_; } + A6 operator[] (boost::arg<6>) const { return base_type::a6_; } - A1 operator[] (boost::arg<1> (*) ()) const { return a1_; } - A2 operator[] (boost::arg<2> (*) ()) const { return a2_; } - A3 operator[] (boost::arg<3> (*) ()) const { return a3_; } - A4 operator[] (boost::arg<4> (*) ()) const { return a4_; } - A5 operator[] (boost::arg<5> (*) ()) const { return a5_; } - A6 operator[] (boost::arg<6> (*) ()) const { return a6_; } + A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; } + A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; } + A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; } + A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; } + A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; } + A6 operator[] (boost::arg<6> (*) ()) const { return base_type::a6_; } - template T & operator[] (value & v) const { return v.get(); } + template T & operator[] (_bi::value & v) const { return v.get(); } - template T const & operator[] (value const & v) const { return v.get(); } + template T const & operator[] (_bi::value const & v) const { return v.get(); } template T & operator[] (reference_wrapper const & v) const { return v.get(); } @@ -545,76 +538,71 @@ public: template R operator()(type, F & f, A & a, long) { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]); + 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_]); } template R operator()(type, F const & f, A & a, long) const { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]); + 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_]); } template void operator()(type, F & f, A & a, int) { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]); + 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_]); } template void operator()(type, F const & f, A & a, int) const { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_]); + 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_]); } template void accept(V & v) const { - BOOST_BIND_VISIT_EACH(v, a1_, 0); - BOOST_BIND_VISIT_EACH(v, a2_, 0); - BOOST_BIND_VISIT_EACH(v, a3_, 0); - BOOST_BIND_VISIT_EACH(v, a4_, 0); - BOOST_BIND_VISIT_EACH(v, a5_, 0); - BOOST_BIND_VISIT_EACH(v, a6_, 0); + base_type::accept(v); } bool operator==(list6 const & rhs) const { return - ref_compare(a1_, rhs.a1_, 0) && ref_compare(a2_, rhs.a2_, 0) && ref_compare(a3_, rhs.a3_, 0) && - ref_compare(a4_, rhs.a4_, 0) && ref_compare(a5_, rhs.a5_, 0) && ref_compare(a6_, rhs.a6_, 0); + + ref_compare( base_type::a1_, rhs.a1_, 0 ) && + ref_compare( base_type::a2_, rhs.a2_, 0 ) && + ref_compare( base_type::a3_, rhs.a3_, 0 ) && + ref_compare( base_type::a4_, rhs.a4_, 0 ) && + ref_compare( base_type::a5_, rhs.a5_, 0 ) && + ref_compare( base_type::a6_, rhs.a6_, 0 ); } +}; +template class list7: private storage7< A1, A2, A3, A4, A5, A6, A7 > +{ private: - A1 a1_; - A2 a2_; - A3 a3_; - A4 a4_; - A5 a5_; - A6 a6_; -}; + typedef storage7< A1, A2, A3, A4, A5, A6, A7 > base_type; -template class list7 -{ public: - list7(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7): a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5), a6_(a6), a7_(a7) {} + list7( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7 ): base_type( a1, a2, a3, a4, a5, a6, a7 ) {} - A1 operator[] (boost::arg<1>) const { return a1_; } - A2 operator[] (boost::arg<2>) const { return a2_; } - A3 operator[] (boost::arg<3>) const { return a3_; } - A4 operator[] (boost::arg<4>) const { return a4_; } - A5 operator[] (boost::arg<5>) const { return a5_; } - A6 operator[] (boost::arg<6>) const { return a6_; } - A7 operator[] (boost::arg<7>) const { return a7_; } + A1 operator[] (boost::arg<1>) const { return base_type::a1_; } + A2 operator[] (boost::arg<2>) const { return base_type::a2_; } + A3 operator[] (boost::arg<3>) const { return base_type::a3_; } + A4 operator[] (boost::arg<4>) const { return base_type::a4_; } + A5 operator[] (boost::arg<5>) const { return base_type::a5_; } + A6 operator[] (boost::arg<6>) const { return base_type::a6_; } + A7 operator[] (boost::arg<7>) const { return base_type::a7_; } - A1 operator[] (boost::arg<1> (*) ()) const { return a1_; } - A2 operator[] (boost::arg<2> (*) ()) const { return a2_; } - A3 operator[] (boost::arg<3> (*) ()) const { return a3_; } - A4 operator[] (boost::arg<4> (*) ()) const { return a4_; } - A5 operator[] (boost::arg<5> (*) ()) const { return a5_; } - A6 operator[] (boost::arg<6> (*) ()) const { return a6_; } - A7 operator[] (boost::arg<7> (*) ()) const { return a7_; } + A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; } + A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; } + A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; } + A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; } + A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; } + A6 operator[] (boost::arg<6> (*) ()) const { return base_type::a6_; } + A7 operator[] (boost::arg<7> (*) ()) const { return base_type::a7_; } - template T & operator[] (value & v) const { return v.get(); } + template T & operator[] (_bi::value & v) const { return v.get(); } - template T const & operator[] (value const & v) const { return v.get(); } + template T const & operator[] (_bi::value const & v) const { return v.get(); } template T & operator[] (reference_wrapper const & v) const { return v.get(); } @@ -624,81 +612,74 @@ public: template R operator()(type, F & f, A & a, long) { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_]); + 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_]); } template R operator()(type, F const & f, A & a, long) const { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_]); + 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_]); } template void operator()(type, F & f, A & a, int) { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_]); + 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_]); } template void operator()(type, F const & f, A & a, int) const { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_]); + 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_]); } template void accept(V & v) const { - BOOST_BIND_VISIT_EACH(v, a1_, 0); - BOOST_BIND_VISIT_EACH(v, a2_, 0); - BOOST_BIND_VISIT_EACH(v, a3_, 0); - BOOST_BIND_VISIT_EACH(v, a4_, 0); - BOOST_BIND_VISIT_EACH(v, a5_, 0); - BOOST_BIND_VISIT_EACH(v, a6_, 0); - BOOST_BIND_VISIT_EACH(v, a7_, 0); + base_type::accept(v); } bool operator==(list7 const & rhs) const { return - ref_compare(a1_, rhs.a1_, 0) && ref_compare(a2_, rhs.a2_, 0) && ref_compare(a3_, rhs.a3_, 0) && - ref_compare(a4_, rhs.a4_, 0) && ref_compare(a5_, rhs.a5_, 0) && ref_compare(a6_, rhs.a6_, 0) && - ref_compare(a7_, rhs.a7_, 0); + + ref_compare( base_type::a1_, rhs.a1_, 0 ) && + ref_compare( base_type::a2_, rhs.a2_, 0 ) && + ref_compare( base_type::a3_, rhs.a3_, 0 ) && + ref_compare( base_type::a4_, rhs.a4_, 0 ) && + ref_compare( base_type::a5_, rhs.a5_, 0 ) && + ref_compare( base_type::a6_, rhs.a6_, 0 ) && + ref_compare( base_type::a7_, rhs.a7_, 0 ); } +}; +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 > +{ private: - A1 a1_; - A2 a2_; - A3 a3_; - A4 a4_; - A5 a5_; - A6 a6_; - A7 a7_; -}; + typedef storage8< A1, A2, A3, A4, A5, A6, A7, A8 > base_type; -template class list8 -{ public: - list8(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8): a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5), a6_(a6), a7_(a7), a8_(a8) {} + 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 ) {} - A1 operator[] (boost::arg<1>) const { return a1_; } - A2 operator[] (boost::arg<2>) const { return a2_; } - A3 operator[] (boost::arg<3>) const { return a3_; } - A4 operator[] (boost::arg<4>) const { return a4_; } - A5 operator[] (boost::arg<5>) const { return a5_; } - A6 operator[] (boost::arg<6>) const { return a6_; } - A7 operator[] (boost::arg<7>) const { return a7_; } - A8 operator[] (boost::arg<8>) const { return a8_; } + A1 operator[] (boost::arg<1>) const { return base_type::a1_; } + A2 operator[] (boost::arg<2>) const { return base_type::a2_; } + A3 operator[] (boost::arg<3>) const { return base_type::a3_; } + A4 operator[] (boost::arg<4>) const { return base_type::a4_; } + A5 operator[] (boost::arg<5>) const { return base_type::a5_; } + A6 operator[] (boost::arg<6>) const { return base_type::a6_; } + A7 operator[] (boost::arg<7>) const { return base_type::a7_; } + A8 operator[] (boost::arg<8>) const { return base_type::a8_; } - A1 operator[] (boost::arg<1> (*) ()) const { return a1_; } - A2 operator[] (boost::arg<2> (*) ()) const { return a2_; } - A3 operator[] (boost::arg<3> (*) ()) const { return a3_; } - A4 operator[] (boost::arg<4> (*) ()) const { return a4_; } - A5 operator[] (boost::arg<5> (*) ()) const { return a5_; } - A6 operator[] (boost::arg<6> (*) ()) const { return a6_; } - A7 operator[] (boost::arg<7> (*) ()) const { return a7_; } - A8 operator[] (boost::arg<8> (*) ()) const { return a8_; } + A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; } + A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; } + A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; } + A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; } + A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; } + A6 operator[] (boost::arg<6> (*) ()) const { return base_type::a6_; } + A7 operator[] (boost::arg<7> (*) ()) const { return base_type::a7_; } + A8 operator[] (boost::arg<8> (*) ()) const { return base_type::a8_; } - template T & operator[] (value & v) const { return v.get(); } + template T & operator[] (_bi::value & v) const { return v.get(); } - template T const & operator[] (value const & v) const { return v.get(); } + template T const & operator[] (_bi::value const & v) const { return v.get(); } template T & operator[] (reference_wrapper const & v) const { return v.get(); } @@ -708,85 +689,77 @@ public: template R operator()(type, F & f, A & a, long) { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_]); + 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_]); } template R operator()(type, F const & f, A & a, long) const { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_]); + 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_]); } template void operator()(type, F & f, A & a, int) { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_]); + 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_]); } template void operator()(type, F const & f, A & a, int) const { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_]); + 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_]); } template void accept(V & v) const { - BOOST_BIND_VISIT_EACH(v, a1_, 0); - BOOST_BIND_VISIT_EACH(v, a2_, 0); - BOOST_BIND_VISIT_EACH(v, a3_, 0); - BOOST_BIND_VISIT_EACH(v, a4_, 0); - BOOST_BIND_VISIT_EACH(v, a5_, 0); - BOOST_BIND_VISIT_EACH(v, a6_, 0); - BOOST_BIND_VISIT_EACH(v, a7_, 0); - BOOST_BIND_VISIT_EACH(v, a8_, 0); + base_type::accept(v); } bool operator==(list8 const & rhs) const { return - ref_compare(a1_, rhs.a1_, 0) && ref_compare(a2_, rhs.a2_, 0) && ref_compare(a3_, rhs.a3_, 0) && - ref_compare(a4_, rhs.a4_, 0) && ref_compare(a5_, rhs.a5_, 0) && ref_compare(a6_, rhs.a6_, 0) && - ref_compare(a7_, rhs.a7_, 0) && ref_compare(a8_, rhs.a8_, 0); + + ref_compare( base_type::a1_, rhs.a1_, 0 ) && + ref_compare( base_type::a2_, rhs.a2_, 0 ) && + ref_compare( base_type::a3_, rhs.a3_, 0 ) && + ref_compare( base_type::a4_, rhs.a4_, 0 ) && + ref_compare( base_type::a5_, rhs.a5_, 0 ) && + ref_compare( base_type::a6_, rhs.a6_, 0 ) && + ref_compare( base_type::a7_, rhs.a7_, 0 ) && + ref_compare( base_type::a8_, rhs.a8_, 0 ); } +}; +template class list9: private storage9< A1, A2, A3, A4, A5, A6, A7, A8, A9 > +{ private: - A1 a1_; - A2 a2_; - A3 a3_; - A4 a4_; - A5 a5_; - A6 a6_; - A7 a7_; - A8 a8_; -}; + typedef storage9< A1, A2, A3, A4, A5, A6, A7, A8, A9 > base_type; -template class list9 -{ public: - list9(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9): a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5), a6_(a6), a7_(a7), a8_(a8), a9_(a9) {} + 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 ) {} - A1 operator[] (boost::arg<1>) const { return a1_; } - A2 operator[] (boost::arg<2>) const { return a2_; } - A3 operator[] (boost::arg<3>) const { return a3_; } - A4 operator[] (boost::arg<4>) const { return a4_; } - A5 operator[] (boost::arg<5>) const { return a5_; } - A6 operator[] (boost::arg<6>) const { return a6_; } - A7 operator[] (boost::arg<7>) const { return a7_; } - A8 operator[] (boost::arg<8>) const { return a8_; } - A9 operator[] (boost::arg<9>) const { return a9_; } + A1 operator[] (boost::arg<1>) const { return base_type::a1_; } + A2 operator[] (boost::arg<2>) const { return base_type::a2_; } + A3 operator[] (boost::arg<3>) const { return base_type::a3_; } + A4 operator[] (boost::arg<4>) const { return base_type::a4_; } + A5 operator[] (boost::arg<5>) const { return base_type::a5_; } + A6 operator[] (boost::arg<6>) const { return base_type::a6_; } + A7 operator[] (boost::arg<7>) const { return base_type::a7_; } + A8 operator[] (boost::arg<8>) const { return base_type::a8_; } + A9 operator[] (boost::arg<9>) const { return base_type::a9_; } - A1 operator[] (boost::arg<1> (*) ()) const { return a1_; } - A2 operator[] (boost::arg<2> (*) ()) const { return a2_; } - A3 operator[] (boost::arg<3> (*) ()) const { return a3_; } - A4 operator[] (boost::arg<4> (*) ()) const { return a4_; } - A5 operator[] (boost::arg<5> (*) ()) const { return a5_; } - A6 operator[] (boost::arg<6> (*) ()) const { return a6_; } - A7 operator[] (boost::arg<7> (*) ()) const { return a7_; } - A8 operator[] (boost::arg<8> (*) ()) const { return a8_; } - A9 operator[] (boost::arg<9> (*) ()) const { return a9_; } + A1 operator[] (boost::arg<1> (*) ()) const { return base_type::a1_; } + A2 operator[] (boost::arg<2> (*) ()) const { return base_type::a2_; } + A3 operator[] (boost::arg<3> (*) ()) const { return base_type::a3_; } + A4 operator[] (boost::arg<4> (*) ()) const { return base_type::a4_; } + A5 operator[] (boost::arg<5> (*) ()) const { return base_type::a5_; } + A6 operator[] (boost::arg<6> (*) ()) const { return base_type::a6_; } + A7 operator[] (boost::arg<7> (*) ()) const { return base_type::a7_; } + A8 operator[] (boost::arg<8> (*) ()) const { return base_type::a8_; } + A9 operator[] (boost::arg<9> (*) ()) const { return base_type::a9_; } - template T & operator[] (value & v) const { return v.get(); } + template T & operator[] (_bi::value & v) const { return v.get(); } - template T const & operator[] (value const & v) const { return v.get(); } + template T const & operator[] (_bi::value const & v) const { return v.get(); } template T & operator[] (reference_wrapper const & v) const { return v.get(); } @@ -796,56 +769,43 @@ public: template R operator()(type, F & f, A & a, long) { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_], a[a9_]); + 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_]); } template R operator()(type, F const & f, A & a, long) const { - return unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_], a[a9_]); + 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_]); } template void operator()(type, F & f, A & a, int) { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_], a[a9_]); + 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_]); } template void operator()(type, F const & f, A & a, int) const { - unwrap(&f, 0)(a[a1_], a[a2_], a[a3_], a[a4_], a[a5_], a[a6_], a[a7_], a[a8_], a[a9_]); + 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_]); } template void accept(V & v) const { - BOOST_BIND_VISIT_EACH(v, a1_, 0); - BOOST_BIND_VISIT_EACH(v, a2_, 0); - BOOST_BIND_VISIT_EACH(v, a3_, 0); - BOOST_BIND_VISIT_EACH(v, a4_, 0); - BOOST_BIND_VISIT_EACH(v, a5_, 0); - BOOST_BIND_VISIT_EACH(v, a6_, 0); - BOOST_BIND_VISIT_EACH(v, a7_, 0); - BOOST_BIND_VISIT_EACH(v, a8_, 0); - BOOST_BIND_VISIT_EACH(v, a9_, 0); + base_type::accept(v); } bool operator==(list9 const & rhs) const { return - ref_compare(a1_, rhs.a1_, 0) && ref_compare(a2_, rhs.a2_, 0) && ref_compare(a3_, rhs.a3_, 0) && - ref_compare(a4_, rhs.a4_, 0) && ref_compare(a5_, rhs.a5_, 0) && ref_compare(a6_, rhs.a6_, 0) && - ref_compare(a7_, rhs.a7_, 0) && ref_compare(a8_, rhs.a8_, 0) && ref_compare(a9_, rhs.a9_, 0); - } - -private: - A1 a1_; - A2 a2_; - A3 a3_; - A4 a4_; - A5 a5_; - A6 a6_; - A7 a7_; - A8 a8_; - A9 a9_; + ref_compare( base_type::a1_, rhs.a1_, 0 ) && + ref_compare( base_type::a2_, rhs.a2_, 0 ) && + ref_compare( base_type::a3_, rhs.a3_, 0 ) && + ref_compare( base_type::a4_, rhs.a4_, 0 ) && + ref_compare( base_type::a5_, rhs.a5_, 0 ) && + ref_compare( base_type::a6_, rhs.a6_, 0 ) && + ref_compare( base_type::a7_, rhs.a7_, 0 ) && + ref_compare( base_type::a8_, rhs.a8_, 0 ) && + ref_compare( base_type::a9_, rhs.a9_, 0 ); + } }; // bind_t @@ -920,30 +880,67 @@ public: #endif -// bind_t::operator== +// function_equal + +#ifndef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP + +// put overloads in _bi, rely on ADL + +# ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING + +template bool function_equal( bind_t const & a, bind_t const & b ) +{ + return a.compare(b); +} + +# else -template bool operator==(bind_t const & a, bind_t const & b) +template bool function_equal_impl( bind_t const & a, bind_t const & b, int ) { return a.compare(b); } -template bool operator!=(bind_t const & a, bind_t const & b) +# endif // #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING + +#else // BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP + +// put overloads in boost + +} // namespace _bi + +# ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING + +template bool function_equal( _bi::bind_t const & a, _bi::bind_t const & b ) { - return !a.compare(b); + return a.compare(b); +} + +# else + +template bool function_equal_impl( _bi::bind_t const & a, _bi::bind_t const & b, int ) +{ + return a.compare(b); } +# endif // #ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING + +namespace _bi +{ + +#endif // BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP + // add_value #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) || (__SUNPRO_CC >= 0x530) template struct add_value { - typedef value type; + typedef _bi::value type; }; template struct add_value< value > { - typedef value type; + typedef _bi::value type; }; template struct add_value< reference_wrapper > @@ -1097,20 +1094,108 @@ template type; }; +// operator! + +struct logical_not +{ + template bool operator()(V const & v) const { return !v; } +}; + +template + bind_t< bool, logical_not, list1< bind_t > > + operator! (bind_t const & f) +{ + typedef list1< bind_t > list_type; + return bind_t ( logical_not(), list_type(f) ); +} + +// relational operators + +#define BOOST_BIND_OPERATOR( op, name ) \ +\ +struct name \ +{ \ + template bool operator()(V const & v, W const & w) const { return v op w; } \ +}; \ + \ +template \ + bind_t< bool, name, list2< bind_t, typename add_value::type > > \ + operator op (bind_t const & f, A2 a2) \ +{ \ + typedef typename add_value::type B2; \ + typedef list2< bind_t, B2> list_type; \ + return bind_t ( name(), list_type(f, a2) ); \ +} + +BOOST_BIND_OPERATOR( ==, equal ) +BOOST_BIND_OPERATOR( !=, not_equal ) + +BOOST_BIND_OPERATOR( <, less ) +BOOST_BIND_OPERATOR( <=, less_equal ) + +BOOST_BIND_OPERATOR( >, greater ) +BOOST_BIND_OPERATOR( >=, greater_equal ) + +#undef BOOST_BIND_OPERATOR + +#if defined(__GNUC__) && BOOST_WORKAROUND(__GNUC__, < 3) + +// resolve ambiguity with rel_ops + +#define BOOST_BIND_OPERATOR( op, name ) \ +\ +template \ + bind_t< bool, name, list2< bind_t, bind_t > > \ + operator op (bind_t const & f, bind_t const & g) \ +{ \ + typedef list2< bind_t, bind_t > list_type; \ + return bind_t ( name(), list_type(f, g) ); \ +} + +BOOST_BIND_OPERATOR( !=, not_equal ) +BOOST_BIND_OPERATOR( <=, less_equal ) +BOOST_BIND_OPERATOR( >, greater ) +BOOST_BIND_OPERATOR( >=, greater_equal ) + +#endif + +// visit_each, ADL + +#if !defined( BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP ) && !defined( __BORLANDC__ ) \ + && !(defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3) + +template void visit_each( V & v, value const & t, int ) +{ + using boost::visit_each; + BOOST_BIND_VISIT_EACH( v, t.get(), 0 ); +} + +template void visit_each( V & v, bind_t const & t, int ) +{ + t.accept( v ); +} + +#endif + } // namespace _bi -// visit_each +// visit_each, no ADL + +#if defined( BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP ) || defined( __BORLANDC__ ) \ + || (defined(__GNUC__) && __GNUC__ == 3 && __GNUC_MINOR__ <= 3) -template void visit_each(V & v, _bi::value const & t, int) +template void visit_each( V & v, _bi::value const & t, int ) { - BOOST_BIND_VISIT_EACH(v, t.get(), 0); + BOOST_BIND_VISIT_EACH( v, t.get(), 0 ); } -template void visit_each(V & v, _bi::bind_t const & t, int) +template void visit_each( V & v, _bi::bind_t const & t, int ) { - t.accept(v); + t.accept( v ); } +#endif + // bind #ifndef BOOST_BIND @@ -1423,6 +1508,18 @@ template + +#undef BOOST_BIND_MF_NAME +#undef BOOST_BIND_MF_CC + +#endif + #ifdef BOOST_MEM_FN_ENABLE_STDCALL #define BOOST_BIND_MF_NAME(X) X##_stdcall @@ -1449,63 +1546,95 @@ template +_bi::bind_t< R, _mfi::dm, typename _bi::list_av_1::type > + BOOST_BIND(R T::*f, A1 a1) +{ + typedef _mfi::dm F; + typedef typename _bi::list_av_1::type list_type; + return _bi::bind_t( F(f), list_type(a1) ); +} + +#else namespace _bi { -template struct add_cref +template< class Pm, int I > struct add_cref; + +template< class M, class T > struct add_cref< M T::*, 0 > { - typedef T const & type; + typedef M type; }; -template struct add_cref< T & > +template< class M, class T > struct add_cref< M T::*, 1 > { - typedef T const & type; + typedef M const & type; }; -template<> struct add_cref +template< class R, class T > struct add_cref< R (T::*) (), 1 > { typedef void type; }; -} // namespace _bi +#if !( defined(__IBMCPP__) && BOOST_WORKAROUND( __IBMCPP__, BOOST_TESTED_AT(600) ) ) -template -_bi::bind_t< typename _bi::add_cref::type, _mfi::dm, typename _bi::list_av_1::type > - BOOST_BIND(R T::*f, A1 a1) +template< class R, class T > struct add_cref< R (T::*) () const, 1 > { - typedef _mfi::dm F; - typedef typename _bi::list_av_1::type list_type; - return _bi::bind_t::type, F, list_type>(F(f), list_type(a1)); -} + typedef void type; +}; -#else +#endif // __IBMCPP__ -template -_bi::bind_t< R const &, _mfi::dm, typename _bi::list_av_1::type > - BOOST_BIND(R T::*f, A1 a1) +template struct isref { - typedef _mfi::dm F; - typedef typename _bi::list_av_1::type list_type; - return _bi::bind_t(F(f), list_type(a1)); -} + enum value_type { value = 0 }; +}; -#endif +template struct isref< R& > +{ + enum value_type { value = 1 }; +}; -*/ +template struct isref< R* > +{ + enum value_type { value = 1 }; +}; -template -_bi::bind_t< R, _mfi::dm, typename _bi::list_av_1::type > - BOOST_BIND(R T::*f, A1 a1) +template struct dm_result { - typedef _mfi::dm F; + typedef typename add_cref< Pm, 1 >::type type; +}; + +template struct dm_result< Pm, bind_t > +{ + typedef typename bind_t::result_type result_type; + typedef typename add_cref< Pm, isref< result_type >::value >::type type; +}; + +} // namespace _bi + +template< class A1, class M, class T > + +_bi::bind_t< + typename _bi::dm_result< M T::*, A1 >::type, + _mfi::dm, + typename _bi::list_av_1::type +> + +BOOST_BIND( M T::*f, A1 a1 ) +{ + typedef typename _bi::dm_result< M T::*, A1 >::type result_type; + typedef _mfi::dm F; typedef typename _bi::list_av_1::type list_type; - return _bi::bind_t( F(f), list_type(a1) ); + return _bi::bind_t< result_type, F, list_type >( F( f ), list_type( a1 ) ); } +#endif + } // namespace boost #ifndef BOOST_BIND_NO_PLACEHOLDERS