X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=boost%2Fboost%2Fbind.hpp;h=6979fecd0576d99747a78e4c3b2b61b3482102bc;hb=b01a9dc187d9cd396a57463ad27511379dcdc9cd;hp=5480d1f2f8f9aa613c9b97afffa5474ea0619482;hpb=69862d12f457dd5dbf509c4d46a0399d4b16cfc7;p=lyx.git diff --git a/boost/boost/bind.hpp b/boost/boost/bind.hpp index 5480d1f2f8..6979fecd05 100644 --- a/boost/boost/bind.hpp +++ b/boost/boost/bind.hpp @@ -1,20 +1,22 @@ #ifndef BOOST_BIND_HPP_INCLUDED #define BOOST_BIND_HPP_INCLUDED -#if _MSC_VER >= 1020 -#pragma once +// MS compatible compilers support #pragma once + +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +# pragma once #endif // // bind.hpp - binds function objects to arguments // -// Copyright (c) 2001, 2002 Peter Dimov and Multi Media Ltd. +// Copyright (c) 2001-2004 Peter Dimov and Multi Media Ltd. // Copyright (c) 2001 David Abrahams +// Copyright (c) 2005 Peter Dimov // -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. +// Distributed under the Boost Software License, Version 1.0. (See +// accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/bind/bind.html for documentation. // @@ -22,7 +24,10 @@ #include #include #include +#include #include +#include +#include // Borland-specific bug, visit_each() silently fails to produce code @@ -32,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 @@ -66,6 +73,28 @@ template struct result_traits< unspecified, reference_wrapper > #endif +// ref_compare + +template bool ref_compare( T const & a, T const & b, long ) +{ + return a == b; +} + +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(); +} + // bind_t forward declaration for listN template class bind_t; @@ -81,6 +110,11 @@ public: T & get() { return t_; } T const & get() const { return t_; } + bool operator==(value const & rhs) const + { + return t_ == rhs.t_; + } + private: T t_; @@ -92,47 +126,35 @@ template class type {}; // unwrap -template inline F & unwrap(F & f, long) +template struct unwrapper { - return f; -} + static inline F & unwrap( F & f, long ) + { + return f; + } -template inline F & unwrap(reference_wrapper & f, int) -{ - return f; -} + template static inline F2 & unwrap( reference_wrapper rf, int ) + { + return rf.get(); + } -template inline F & unwrap(reference_wrapper const & f, int) -{ - return f; -} + template static inline _mfi::dm unwrap( R T::* pm, int ) + { + return _mfi::dm( pm ); + } +}; // listN -#ifdef BOOST_NO_VOID_RETURNS - -template struct evaluator0; -template struct evaluator1; -template struct evaluator2; -template struct evaluator3; -template struct evaluator4; -template struct evaluator5; -template struct evaluator6; -template struct evaluator7; -template struct evaluator8; -template struct evaluator9; - -#endif - class list0 { 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(); } @@ -140,39 +162,53 @@ public: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } - template R operator()(type, F f, A &) const + template R operator()(type, F & f, A &, long) { - return unwrap(f, 0)(); + return unwrapper::unwrap(f, 0)(); } - template void accept(V &) const + template R operator()(type, F const & f, A &, long) const { + return unwrapper::unwrap(f, 0)(); } -#ifdef BOOST_NO_VOID_RETURNS + template void operator()(type, F & f, A &, int) + { + unwrapper::unwrap(f, 0)(); + } - template struct evaluator + template void operator()(type, F const & f, A &, int) const { - typedef evaluator0 type; - }; + unwrapper::unwrap(f, 0)(); + } -#endif + template void accept(V &) const + { + } + bool operator==(list0 const &) const + { + return true; + } }; -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[] (arg<1>) const { return a1_; } + A1 operator[] (boost::arg<1>) const { return base_type::a1_; } - A1 operator[] (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(); } @@ -180,99 +216,56 @@ public: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } - template R operator()(type, F f, A & a) const + 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 void accept(V & v) const + template R operator()(type, F const & f, A & a, long) const { - BOOST_BIND_VISIT_EACH(v, a1_, 0); + return unwrapper::unwrap(f, 0)(a[base_type::a1_]); } -#ifdef BOOST_NO_VOID_RETURNS - - template struct evaluator + template void operator()(type, F & f, A & a, int) { - typedef evaluator1 type; - }; - -#else - -private: - -#endif - - A1 a1_; -}; - -template class list2 -{ -public: - - list2(A1 a1, A2 a2): a1_(a1), a2_(a2) {} - - A1 operator[] (arg<1>) const { return a1_; } - A2 operator[] (arg<2>) const { return a2_; } - - A1 operator[] (arg<1> (*) ()) const { return a1_; } - A2 operator[] (arg<2> (*) ()) const { return a2_; } - - template T & operator[] (value & v) const { return v.get(); } - - template T const & operator[] (value const & v) const { return v.get(); } - - template T & operator[] (reference_wrapper const & v) const { return v.get(); } - - template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } - - template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + unwrapper::unwrap(f, 0)(a[base_type::a1_]); + } - template R operator()(type, F f, A & a) const + template void operator()(type, F const & f, A & a, int) const { - return unwrap(f, 0)(a[a1_], a[a2_]); + unwrapper::unwrap(f, 0)(a[base_type::a1_]); } template void accept(V & v) const { - BOOST_BIND_VISIT_EACH(v, a1_, 0); - BOOST_BIND_VISIT_EACH(v, a2_, 0); + base_type::accept(v); } -#ifdef BOOST_NO_VOID_RETURNS - - template struct evaluator + bool operator==(list1 const & rhs) const { - typedef evaluator2 type; - }; - -#else + return ref_compare(base_type::a1_, rhs.a1_, 0); + } +}; +template< class A1, class A2 > class list2: private storage2< A1, A2 > +{ private: -#endif - - A1 a1_; - A2 a2_; -}; + typedef storage2< A1, A2 > base_type; -template class list3 -{ public: - list3(A1 a1, A2 a2, A3 a3): a1_(a1), a2_(a2), a3_(a3) {} + list2( A1 a1, A2 a2 ): base_type( a1, a2 ) {} - A1 operator[] (arg<1>) const { return a1_; } - A2 operator[] (arg<2>) const { return a2_; } - A3 operator[] (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_; } - A1 operator[] (arg<1> (*) ()) const { return a1_; } - A2 operator[] (arg<2> (*) ()) const { return a2_; } - A3 operator[] (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_; } - 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(); } @@ -280,55 +273,58 @@ public: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } - template R operator()(type, F f, A & a) const + 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_]); } - template void accept(V & v) const + template R operator()(type, F const & f, A & a, long) const { - BOOST_BIND_VISIT_EACH(v, a1_, 0); - BOOST_BIND_VISIT_EACH(v, a2_, 0); - BOOST_BIND_VISIT_EACH(v, a3_, 0); + return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]); } -#ifdef BOOST_NO_VOID_RETURNS - - template struct evaluator + template void operator()(type, F & f, A & a, int) { - typedef evaluator3 type; - }; - -#else + unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]); + } -private: + template void operator()(type, F const & f, A & a, int) const + { + unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_]); + } -#endif + template void accept(V & v) const + { + base_type::accept(v); + } - A1 a1_; - A2 a2_; - A3 a3_; + bool operator==(list2 const & rhs) const + { + return ref_compare(base_type::a1_, rhs.a1_, 0) && ref_compare(base_type::a2_, rhs.a2_, 0); + } }; -template class list4 +template< class A1, class A2, class A3 > class list3: private storage3< A1, A2, A3 > { +private: + + typedef storage3< A1, A2, A3 > base_type; + public: - list4(A1 a1, A2 a2, A3 a3, A4 a4): a1_(a1), a2_(a2), a3_(a3), a4_(a4) {} + list3( A1 a1, A2 a2, A3 a3 ): base_type( a1, a2, a3 ) {} - A1 operator[] (arg<1>) const { return a1_; } - A2 operator[] (arg<2>) const { return a2_; } - A3 operator[] (arg<3>) const { return a3_; } - A4 operator[] (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_; } - A1 operator[] (arg<1> (*) ()) const { return a1_; } - A2 operator[] (arg<2> (*) ()) const { return a2_; } - A3 operator[] (arg<3> (*) ()) const { return a3_; } - A4 operator[] (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_; } - 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(); } @@ -336,59 +332,64 @@ public: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } - template R operator()(type, F f, A & a) const + 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_]); } - template void accept(V & v) const + template R operator()(type, F const & f, A & a, long) 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); + return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]); } -#ifdef BOOST_NO_VOID_RETURNS - - template struct evaluator + template void operator()(type, F & f, A & a, int) { - typedef evaluator4 type; - }; - -#else + unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]); + } -private: + template void operator()(type, F const & f, A & a, int) const + { + unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_]); + } -#endif + template void accept(V & v) const + { + base_type::accept(v); + } - A1 a1_; - A2 a2_; - A3 a3_; - A4 a4_; + bool operator==(list3 const & rhs) const + { + 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 list5 +template< class A1, class A2, class A3, class A4 > class list4: private storage4< A1, A2, A3, A4 > { +private: + + typedef storage4< A1, A2, A3, A4 > base_type; + public: - list5(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5): a1_(a1), a2_(a2), a3_(a3), a4_(a4), a5_(a5) {} + list4( A1 a1, A2 a2, A3 a3, A4 a4 ): base_type( a1, a2, a3, a4 ) {} - A1 operator[] (arg<1>) const { return a1_; } - A2 operator[] (arg<2>) const { return a2_; } - A3 operator[] (arg<3>) const { return a3_; } - A4 operator[] (arg<4>) const { return a4_; } - A5 operator[] (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_; } - A1 operator[] (arg<1> (*) ()) const { return a1_; } - A2 operator[] (arg<2> (*) ()) const { return a2_; } - A3 operator[] (arg<3> (*) ()) const { return a3_; } - A4 operator[] (arg<4> (*) ()) const { return a4_; } - A5 operator[] (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_; } - 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(); } @@ -396,63 +397,67 @@ public: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } - template R operator()(type, F f, A & a) const + 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_]); } - template void accept(V & v) const + template R operator()(type, F const & f, A & a, long) 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); + return unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]); } -#ifdef BOOST_NO_VOID_RETURNS - - template struct evaluator + template void operator()(type, F & f, A & a, int) { - typedef evaluator5 type; - }; + unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]); + } -#else + template void operator()(type, F const & f, A & a, int) const + { + unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_]); + } -private: + template void accept(V & v) const + { + base_type::accept(v); + } -#endif + bool operator==(list4 const & rhs) const + { + return - A1 a1_; - A2 a2_; - A3 a3_; - A4 a4_; - A5 a5_; + 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 list6 +template< class A1, class A2, class A3, class A4, class A5 > class list5: private storage5< A1, A2, A3, A4, A5 > { +private: + + typedef storage5< A1, A2, A3, A4, A5 > base_type; + 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) {} + list5( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5 ): base_type( a1, a2, a3, a4, a5 ) {} - A1 operator[] (arg<1>) const { return a1_; } - A2 operator[] (arg<2>) const { return a2_; } - A3 operator[] (arg<3>) const { return a3_; } - A4 operator[] (arg<4>) const { return a4_; } - A5 operator[] (arg<5>) const { return a5_; } - A6 operator[] (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_; } - A1 operator[] (arg<1> (*) ()) const { return a1_; } - A2 operator[] (arg<2> (*) ()) const { return a2_; } - A3 operator[] (arg<3> (*) ()) const { return a3_; } - A4 operator[] (arg<4> (*) ()) const { return a4_; } - A5 operator[] (arg<5> (*) ()) const { return a5_; } - A6 operator[] (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_; } - 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(); } @@ -460,67 +465,70 @@ public: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } - template R operator()(type, F f, A & a) const + 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_]); } - template void accept(V & v) const + template R operator()(type, F const & f, A & a, long) 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); + 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_]); } -#ifdef BOOST_NO_VOID_RETURNS - - template struct evaluator + template void operator()(type, F & f, A & a, int) { - typedef evaluator6 type; - }; + unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_]); + } -#else + template void operator()(type, F const & f, A & a, int) const + { + unwrapper::unwrap(f, 0)(a[base_type::a1_], a[base_type::a2_], a[base_type::a3_], a[base_type::a4_], a[base_type::a5_]); + } -private: + template void accept(V & v) const + { + base_type::accept(v); + } -#endif + bool operator==(list5 const & rhs) const + { + return - A1 a1_; - A2 a2_; - A3 a3_; - A4 a4_; - A5 a5_; - A6 a6_; + 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 list7 +template class list6: private storage6< A1, A2, A3, A4, A5, A6 > { +private: + + typedef storage6< A1, A2, A3, A4, A5, A6 > base_type; + 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) {} + list6( A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6 ): base_type( a1, a2, a3, a4, a5, a6 ) {} - A1 operator[] (arg<1>) const { return a1_; } - A2 operator[] (arg<2>) const { return a2_; } - A3 operator[] (arg<3>) const { return a3_; } - A4 operator[] (arg<4>) const { return a4_; } - A5 operator[] (arg<5>) const { return a5_; } - A6 operator[] (arg<6>) const { return a6_; } - A7 operator[] (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_; } - A1 operator[] (arg<1> (*) ()) const { return a1_; } - A2 operator[] (arg<2> (*) ()) const { return a2_; } - A3 operator[] (arg<3> (*) ()) const { return a3_; } - A4 operator[] (arg<4> (*) ()) const { return a4_; } - A5 operator[] (arg<5> (*) ()) const { return a5_; } - A6 operator[] (arg<6> (*) ()) const { return a6_; } - A7 operator[] (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_; } - 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(); } @@ -528,71 +536,73 @@ public: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } - template R operator()(type, F f, A & a) const + 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_]); } - template void accept(V & v) const + template R operator()(type, F const & f, A & a, long) 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); + 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_]); } -#ifdef BOOST_NO_VOID_RETURNS - - template struct evaluator + template void operator()(type, F & f, A & a, int) { - typedef evaluator7 type; - }; - -#else + 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_]); + } -private: + template void operator()(type, F const & f, A & a, int) const + { + 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_]); + } -#endif + template void accept(V & v) const + { + base_type::accept(v); + } - A1 a1_; - A2 a2_; - A3 a3_; - A4 a4_; - A5 a5_; - A6 a6_; - A7 a7_; + bool operator==(list6 const & rhs) const + { + 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 ) && + 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 list8 +template class list7: private storage7< A1, A2, A3, A4, A5, A6, A7 > { +private: + + typedef storage7< A1, A2, A3, A4, A5, A6, A7 > base_type; + 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) {} + 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[] (arg<1>) const { return a1_; } - A2 operator[] (arg<2>) const { return a2_; } - A3 operator[] (arg<3>) const { return a3_; } - A4 operator[] (arg<4>) const { return a4_; } - A5 operator[] (arg<5>) const { return a5_; } - A6 operator[] (arg<6>) const { return a6_; } - A7 operator[] (arg<7>) const { return a7_; } - A8 operator[] (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_; } - A1 operator[] (arg<1> (*) ()) const { return a1_; } - A2 operator[] (arg<2> (*) ()) const { return a2_; } - A3 operator[] (arg<3> (*) ()) const { return a3_; } - A4 operator[] (arg<4> (*) ()) const { return a4_; } - A5 operator[] (arg<5> (*) ()) const { return a5_; } - A6 operator[] (arg<6> (*) ()) const { return a6_; } - A7 operator[] (arg<7> (*) ()) const { return a7_; } - A8 operator[] (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_; } - 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(); } @@ -600,75 +610,76 @@ public: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } - template R operator()(type, F f, A & a) const + 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_]); } - template void accept(V & v) const + template R operator()(type, F const & f, A & a, long) 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); + 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_]); } -#ifdef BOOST_NO_VOID_RETURNS - - template struct evaluator + template void operator()(type, F & f, A & a, int) { - typedef evaluator8 type; - }; - -#else + 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_]); + } -private: + template void operator()(type, F const & f, A & a, int) const + { + 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_]); + } -#endif + template void accept(V & v) const + { + base_type::accept(v); + } - A1 a1_; - A2 a2_; - A3 a3_; - A4 a4_; - A5 a5_; - A6 a6_; - A7 a7_; - A8 a8_; + bool operator==(list7 const & rhs) const + { + 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 ) && + 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 list9 +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: + + typedef storage8< A1, A2, A3, A4, A5, A6, A7, A8 > base_type; + 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) {} + 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[] (arg<1>) const { return a1_; } - A2 operator[] (arg<2>) const { return a2_; } - A3 operator[] (arg<3>) const { return a3_; } - A4 operator[] (arg<4>) const { return a4_; } - A5 operator[] (arg<5>) const { return a5_; } - A6 operator[] (arg<6>) const { return a6_; } - A7 operator[] (arg<7>) const { return a7_; } - A8 operator[] (arg<8>) const { return a8_; } - A9 operator[] (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_; } - A1 operator[] (arg<1> (*) ()) const { return a1_; } - A2 operator[] (arg<2> (*) ()) const { return a2_; } - A3 operator[] (arg<3> (*) ()) const { return a3_; } - A4 operator[] (arg<4> (*) ()) const { return a4_; } - A5 operator[] (arg<5> (*) ()) const { return a5_; } - A6 operator[] (arg<6> (*) ()) const { return a6_; } - A7 operator[] (arg<7> (*) ()) const { return a7_; } - A8 operator[] (arg<8> (*) ()) const { return a8_; } - A9 operator[] (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_; } - 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(); } @@ -676,232 +687,127 @@ public: template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } - template R operator()(type, F f, A & a) const + 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_]); } - template void accept(V & v) const + template R operator()(type, F const & f, A & a, long) 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); + 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_]); } -#ifdef BOOST_NO_VOID_RETURNS - - template struct evaluator + template void operator()(type, F & f, A & a, int) { - typedef evaluator9 type; - }; - -#else - -private: - -#endif - - A1 a1_; - A2 a2_; - A3 a3_; - A4 a4_; - A5 a5_; - A6 a6_; - A7 a7_; - A8 a8_; - A9 a9_; -}; - -#ifdef BOOST_NO_VOID_RETURNS - -template struct evaluator0 -{ - template - static R eval(L const&, F f, A &) - { - return unwrap(f, 0)(); + 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 <> struct evaluator0 -{ - template - static void eval(L const&, F f, A &) + template void operator()(type, F const & f, A & a, int) const { - unwrap(f, 0)(); + 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 struct evaluator1 -{ - template - static R eval(L const& l, F f, A & a) + template void accept(V & v) const { - return unwrap(f, 0)(a[l.a1_]); + base_type::accept(v); } -}; -template <> struct evaluator1 -{ - template - static void eval(L const& l, F f, A & a) + bool operator==(list8 const & rhs) const { - unwrap(f, 0)(a[l.a1_]); + 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 ) && + 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 struct evaluator2 +template class list9: private storage9< A1, A2, A3, A4, A5, A6, A7, A8, A9 > { - template - static R eval(L const& l, F f, A & a) - { - return unwrap(f, 0)(a[l.a1_], a[l.a2_]); - } -}; +private: -template <> struct evaluator2 -{ - template - static void eval(L const& l, F f, A & a) - { - unwrap(f, 0)(a[l.a1_], a[l.a2_]); - } -}; + typedef storage9< A1, A2, A3, A4, A5, A6, A7, A8, A9 > base_type; -template struct evaluator3 -{ - template - static R eval(L const& l, F f, A & a) - { - return unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_]); - } -}; +public: -template <> struct evaluator3 -{ - template - static void eval(L const& l, F f, A & a) - { - unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_]); - } -}; + 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 ) {} -template struct evaluator4 -{ - template - static R eval(L const& l, F f, A & a) - { - return unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.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_; } + 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 <> struct evaluator4 -{ - template - static void eval(L const& l, F f, A & a) - { - unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.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_; } + 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 struct evaluator5 -{ - template - static R eval(L const& l, F f, A & a) - { - return unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_]); - } -}; + template T & operator[] (_bi::value & v) const { return v.get(); } -template <> struct evaluator5 -{ - template - static void eval(L const& l, F f, A & a) - { - unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_]); - } -}; + template T const & operator[] (_bi::value const & v) const { return v.get(); } -template struct evaluator6 -{ - template - static R eval(L const& l, F f, A & a) - { - return unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_]); - } -}; + template T & operator[] (reference_wrapper const & v) const { return v.get(); } -template <> struct evaluator6 -{ - template - static void eval(L const& l, F f, A & a) - { - unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_]); - } -}; + template typename result_traits::type operator[] (bind_t & b) const { return b.eval(*this); } -template struct evaluator7 -{ - template - static R eval(L const& l, F f, A & a) + template typename result_traits::type operator[] (bind_t const & b) const { return b.eval(*this); } + + template R operator()(type, F & f, A & a, long) { - return unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_], a[l.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_], a[base_type::a8_], a[base_type::a9_]); } -}; -template <> struct evaluator7 -{ - template - static void eval(L const& l, F f, A & a) + template R operator()(type, F const & f, A & a, long) const { - unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_], a[l.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_], a[base_type::a8_], a[base_type::a9_]); } -}; -template struct evaluator8 -{ - template - static R eval(L const& l, F f, A & a) + template void operator()(type, F & f, A & a, int) { - return unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_], a[l.a7_], a[l.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_], a[base_type::a9_]); } -}; -template <> struct evaluator8 -{ - template - static void eval(L const& l, F f, A & a) + template void operator()(type, F const & f, A & a, int) const { - unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_], a[l.a7_], a[l.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_], a[base_type::a9_]); } -}; -template struct evaluator9 -{ - template - static R eval(L const& l, F f, A & a) + template void accept(V & v) const { - return unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_], a[l.a7_], a[l.a8_], a[l.a9_]); + base_type::accept(v); } -}; -template <> struct evaluator9 -{ - template - static void eval(L const& l, F f, A & a) + bool operator==(list9 const & rhs) const { - unwrap(f, 0)(a[l.a1_], a[l.a2_], a[l.a3_], a[l.a4_], a[l.a5_], a[l.a6_], a[l.a7_], a[l.a8_], a[l.a9_]); + 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 ) && + 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 ); } }; -#endif - // bind_t #ifndef BOOST_NO_VOID_RETURNS @@ -910,11 +816,13 @@ template class bind_t { public: + typedef bind_t this_type; + bind_t(F f, L const & l): f_(f), l_(l) {} -#define BOOST_BIND_EVALUATE return l_(type(), f_, a) +#define BOOST_BIND_RETURN return #include -#undef BOOST_BIND_EVALUATE +#undef BOOST_BIND_RETURN }; @@ -927,11 +835,13 @@ template class implementation { public: + typedef implementation this_type; + implementation(F f, L const & l): f_(f), l_(l) {} -#define BOOST_BIND_EVALUATE return L::BOOST_NESTED_TEMPLATE evaluator::type::eval(l_, f_, a); +#define BOOST_BIND_RETURN return #include -#undef BOOST_BIND_EVALUATE +#undef BOOST_BIND_RETURN }; @@ -948,11 +858,13 @@ private: public: + typedef implementation this_type; + implementation(F f, L const & l): f_(f), l_(l) {} -#define BOOST_BIND_EVALUATE L::BOOST_NESTED_TEMPLATE evaluator::type::eval(l_, f_, a); +#define BOOST_BIND_RETURN #include -#undef BOOST_BIND_EVALUATE +#undef BOOST_BIND_RETURN }; @@ -968,18 +880,67 @@ public: #endif +// 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 function_equal_impl( bind_t const & a, bind_t const & b, int ) +{ + return a.compare(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); +} + +# 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 > @@ -989,12 +950,12 @@ template struct add_value< reference_wrapper > template struct add_value< arg > { - typedef arg type; + typedef boost::arg type; }; template struct add_value< arg (*) () > { - typedef arg (*type) (); + typedef boost::arg (*type) (); }; template struct add_value< bind_t > @@ -1133,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 @@ -1235,6 +1284,88 @@ template(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9)); } +// generic function objects, alternative syntax + +template + _bi::bind_t + BOOST_BIND(boost::type, F f) +{ + typedef _bi::list0 list_type; + return _bi::bind_t (f, list_type()); +} + +template + _bi::bind_t::type> + BOOST_BIND(boost::type, F f, A1 a1) +{ + typedef typename _bi::list_av_1::type list_type; + return _bi::bind_t (f, list_type(a1)); +} + +template + _bi::bind_t::type> + BOOST_BIND(boost::type, F f, A1 a1, A2 a2) +{ + typedef typename _bi::list_av_2::type list_type; + return _bi::bind_t (f, list_type(a1, a2)); +} + +template + _bi::bind_t::type> + BOOST_BIND(boost::type, F f, A1 a1, A2 a2, A3 a3) +{ + typedef typename _bi::list_av_3::type list_type; + return _bi::bind_t(f, list_type(a1, a2, a3)); +} + +template + _bi::bind_t::type> + BOOST_BIND(boost::type, F f, A1 a1, A2 a2, A3 a3, A4 a4) +{ + typedef typename _bi::list_av_4::type list_type; + return _bi::bind_t(f, list_type(a1, a2, a3, a4)); +} + +template + _bi::bind_t::type> + BOOST_BIND(boost::type, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) +{ + typedef typename _bi::list_av_5::type list_type; + return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5)); +} + +template + _bi::bind_t::type> + BOOST_BIND(boost::type, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) +{ + typedef typename _bi::list_av_6::type list_type; + return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5, a6)); +} + +template + _bi::bind_t::type> + BOOST_BIND(boost::type, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) +{ + typedef typename _bi::list_av_7::type list_type; + return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5, a6, a7)); +} + +template + _bi::bind_t::type> + BOOST_BIND(boost::type, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) +{ + typedef typename _bi::list_av_8::type list_type; + return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8)); +} + +template + _bi::bind_t::type> + BOOST_BIND(boost::type, F f, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) +{ + typedef typename _bi::list_av_9::type list_type; + return _bi::bind_t(f, list_type(a1, a2, a3, a4, a5, a6, a7, a8, a9)); +} + #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) // adaptable function objects @@ -1377,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 @@ -1403,15 +1546,95 @@ template - _bi::bind_t< R, _mfi::dm, typename _bi::list_av_1::type > +_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)); + return _bi::bind_t( F(f), list_type(a1) ); } +#else + +namespace _bi +{ + +template< class Pm, int I > struct add_cref; + +template< class M, class T > struct add_cref< M T::*, 0 > +{ + typedef M type; +}; + +template< class M, class T > struct add_cref< M T::*, 1 > +{ + typedef M const & type; +}; + +template< class R, class T > struct add_cref< R (T::*) (), 1 > +{ + typedef void type; +}; + +#if !( defined(__IBMCPP__) && BOOST_WORKAROUND( __IBMCPP__, BOOST_TESTED_AT(600) ) ) + +template< class R, class T > struct add_cref< R (T::*) () const, 1 > +{ + typedef void type; +}; + +#endif // __IBMCPP__ + +template struct isref +{ + enum value_type { value = 0 }; +}; + +template struct isref< R& > +{ + enum value_type { value = 1 }; +}; + +template struct isref< R* > +{ + enum value_type { value = 1 }; +}; + +template struct dm_result +{ + 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< result_type, F, list_type >( F( f ), list_type( a1 ) ); +} + +#endif + } // namespace boost #ifndef BOOST_BIND_NO_PLACEHOLDERS