diff --git a/bind_visitor.cpp b/bind_visitor.cpp index 2a75d0e..c1dee03 100644 --- a/bind_visitor.cpp +++ b/bind_visitor.cpp @@ -8,8 +8,6 @@ // // bind_visitor.cpp - tests bind.hpp with a visitor // -// Version 1.00.0003 (2001-10-18) -// // Copyright (c) 2001 Peter Dimov and Multi Media Ltd. // // Permission to copy, use, modify, sell and distribute this software @@ -20,42 +18,48 @@ #include #include + +#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300) +#pragma warning(push, 3) +#endif + #include #include +#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300) +#pragma warning(pop) +#endif + +// default implementation of visit_each + +namespace boost +{ + template void visit_each(V & v, T const & t, long) + { + v(t, 0); + } +} + +// visitor + int hash = 0; -struct ref_visitor +struct visitor { - template void operator()(boost::_bi::bind_t const & b) const - { - b.accept(*this); - } - - template void operator()(boost::reference_wrapper const & r) const + template void operator()(boost::reference_wrapper const & r, int) const { std::cout << "Reference to " << typeid(T).name() << " @ " << &r.get() << " (with value " << r.get() << ")\n"; hash += r.get(); } -#ifndef BOOST_MSVC - - template void operator()(T const &) const + template void operator()(T const &, long) const { - std::cout << "Catch-all: " << typeid(T).name() << '\n'; + std::cout << "Value of type " << typeid(T).name() << '\n'; + ++hash; } - -#else - - void operator()(...) const - { - } - -#endif - }; -int f(int & i, int & j) +int f(int & i, int & j, int) { ++i; --j; @@ -83,7 +87,8 @@ int main() { using namespace boost; - ref_visitor()(bind(bind(f, ref(x), _1), ref(y))); + visitor v; + visit_each(v, bind(bind(f, ref(x), _1, 42), ref(y)), 0); - return detect_errors(hash == 9); + return detect_errors(hash == 12); } diff --git a/include/boost/bind.hpp b/include/boost/bind.hpp index 8c31bd8..fedd667 100644 --- a/include/boost/bind.hpp +++ b/include/boost/bind.hpp @@ -23,6 +23,14 @@ #include #include +// Borland-specific bug, visit_each() silently fails to produce code + +#if defined(__BORLANDC__) +# define BOOST_BIND_VISIT_EACH boost::visit_each +#else +# define BOOST_BIND_VISIT_EACH visit_each +#endif + namespace boost { @@ -120,10 +128,10 @@ public: #ifdef BOOST_NO_VOID_RETURNS - template struct evaluator - { + template struct evaluator + { typedef evaluator0 type; - }; + }; #endif @@ -157,15 +165,15 @@ public: template void accept(V & v) const { - v(a1_); + BOOST_BIND_VISIT_EACH(v, a1_, 0); } #ifdef BOOST_NO_VOID_RETURNS - template struct evaluator - { + template struct evaluator + { typedef evaluator1 type; - }; + }; #else @@ -206,16 +214,16 @@ public: template void accept(V & v) const { - v(a1_); - v(a2_); + BOOST_BIND_VISIT_EACH(v, a1_, 0); + BOOST_BIND_VISIT_EACH(v, a2_, 0); } #ifdef BOOST_NO_VOID_RETURNS - template struct evaluator - { + template struct evaluator + { typedef evaluator2 type; - }; + }; #else @@ -258,17 +266,17 @@ public: template void accept(V & v) const { - v(a1_); - v(a2_); - v(a3_); + BOOST_BIND_VISIT_EACH(v, a1_, 0); + BOOST_BIND_VISIT_EACH(v, a2_, 0); + BOOST_BIND_VISIT_EACH(v, a3_, 0); } #ifdef BOOST_NO_VOID_RETURNS - template struct evaluator - { + template struct evaluator + { typedef evaluator3 type; - }; + }; #else @@ -313,18 +321,18 @@ public: template void accept(V & v) const { - v(a1_); - v(a2_); - v(a3_); - v(a4_); + 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); } #ifdef BOOST_NO_VOID_RETURNS - template struct evaluator - { + template struct evaluator + { typedef evaluator4 type; - }; + }; #else @@ -371,19 +379,19 @@ public: template void accept(V & v) const { - v(a1_); - v(a2_); - v(a3_); - v(a4_); - v(a5_); + 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); } #ifdef BOOST_NO_VOID_RETURNS - template struct evaluator - { + template struct evaluator + { typedef evaluator5 type; - }; + }; #else @@ -432,20 +440,20 @@ public: template void accept(V & v) const { - v(a1_); - v(a2_); - v(a3_); - v(a4_); - v(a5_); - v(a6_); + 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); } #ifdef BOOST_NO_VOID_RETURNS - template struct evaluator - { + template struct evaluator + { typedef evaluator6 type; - }; + }; #else @@ -496,21 +504,21 @@ public: template void accept(V & v) const { - v(a1_); - v(a2_); - v(a3_); - v(a4_); - v(a5_); - v(a6_); - v(a7_); + 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); } #ifdef BOOST_NO_VOID_RETURNS - template struct evaluator - { + template struct evaluator + { typedef evaluator7 type; - }; + }; #else @@ -563,22 +571,22 @@ public: template void accept(V & v) const { - v(a1_); - v(a2_); - v(a3_); - v(a4_); - v(a5_); - v(a6_); - v(a7_); - v(a8_); + 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); } #ifdef BOOST_NO_VOID_RETURNS - template struct evaluator - { + template struct evaluator + { typedef evaluator8 type; - }; + }; #else @@ -633,23 +641,23 @@ public: template void accept(V & v) const { - v(a1_); - v(a2_); - v(a3_); - v(a4_); - v(a5_); - v(a6_); - v(a7_); - v(a8_); - v(a9_); + 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); } #ifdef BOOST_NO_VOID_RETURNS - template struct evaluator - { + template struct evaluator + { typedef evaluator9 type; - }; + }; #else @@ -1104,6 +1112,18 @@ template void visit_each(V & v, _bi::value const & t, int) +{ + BOOST_BIND_VISIT_EACH(v, t.get(), 0); +} + +template void visit_each(V & v, _bi::bind_t const & t, int) +{ + t.accept(v); +} + // bind #ifndef BOOST_BIND diff --git a/include/boost/bind/bind_template.hpp b/include/boost/bind/bind_template.hpp index 0bfba91..d6e5a3b 100644 --- a/include/boost/bind/bind_template.hpp +++ b/include/boost/bind/bind_template.hpp @@ -1,7 +1,7 @@ // // bind/bind_template.hpp // -// Do not include this header directly. +// Do not include this header directly. // // Copyright (c) 2001 Peter Dimov and Multi Media Ltd. // @@ -147,7 +147,7 @@ template void accept(V & v) const { - v(f_); + BOOST_BIND_VISIT_EACH(v, f_, 0); l_.accept(v); }