1
0
forked from boostorg/bind

visit_each support added.

[SVN r11784]
This commit is contained in:
Peter Dimov
2001-11-26 13:28:16 +00:00
parent f17fa79f2b
commit 46a32f7547
3 changed files with 127 additions and 102 deletions

View File

@@ -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 <boost/bind.hpp>
#include <boost/ref.hpp>
#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
#pragma warning(push, 3)
#endif
#include <iostream>
#include <typeinfo>
int hash = 0;
#if defined(BOOST_MSVC) && (BOOST_MSVC < 1300)
#pragma warning(pop)
#endif
struct ref_visitor
// default implementation of visit_each
namespace boost
{
template<class R, class F, class L> void operator()(boost::_bi::bind_t<R, F, L> const & b) const
template<class V, class T> void visit_each(V & v, T const & t, long)
{
b.accept(*this);
v(t, 0);
}
}
template<class T> void operator()(boost::reference_wrapper<T> const & r) const
// visitor
int hash = 0;
struct visitor
{
template<class T> void operator()(boost::reference_wrapper<T> 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<class T> void operator()(T const &) const
template<class T> 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<int>(bind(f, ref(x), _1), ref(y)));
visitor v;
visit_each(v, bind<int>(bind(f, ref(x), _1, 42), ref(y)), 0);
return detect_errors(hash == 9);
return detect_errors(hash == 12);
}

View File

@@ -23,6 +23,14 @@
#include <boost/ref.hpp>
#include <boost/mem_fn.hpp>
// 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
{
@@ -157,7 +165,7 @@ public:
template<class V> void accept(V & v) const
{
v(a1_);
BOOST_BIND_VISIT_EACH(v, a1_, 0);
}
#ifdef BOOST_NO_VOID_RETURNS
@@ -206,8 +214,8 @@ public:
template<class V> 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
@@ -258,9 +266,9 @@ public:
template<class V> 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
@@ -313,10 +321,10 @@ public:
template<class V> 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
@@ -371,11 +379,11 @@ public:
template<class V> 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
@@ -432,12 +440,12 @@ public:
template<class V> 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
@@ -496,13 +504,13 @@ public:
template<class V> 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
@@ -563,14 +571,14 @@ public:
template<class V> 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
@@ -633,15 +641,15 @@ public:
template<class V> 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
@@ -1104,6 +1112,18 @@ template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, c
} // namespace _bi
// visit_each
template<class V, class T> void visit_each(V & v, _bi::value<T> const & t, int)
{
BOOST_BIND_VISIT_EACH(v, t.get(), 0);
}
template<class V, class R, class F, class L> void visit_each(V & v, _bi::bind_t<R, F, L> const & t, int)
{
t.accept(v);
}
// bind
#ifndef BOOST_BIND

View File

@@ -147,7 +147,7 @@
template<class V> void accept(V & v) const
{
v(f_);
BOOST_BIND_VISIT_EACH(v, f_, 0);
l_.accept(v);
}