You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
86 lines
2.4 KiB
86 lines
2.4 KiB
// Copyright David Abrahams 2003. |
|
// 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) |
|
#ifndef DEF_VISITOR_DWA2003810_HPP |
|
# define DEF_VISITOR_DWA2003810_HPP |
|
|
|
# include <boost/python/detail/prefix.hpp> |
|
# include <boost/detail/workaround.hpp> |
|
|
|
namespace boost { namespace python { |
|
|
|
template <class DerivedVisitor> class def_visitor; |
|
template <class T, class X1, class X2, class X3> class class_; |
|
|
|
class def_visitor_access |
|
{ |
|
# if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) \ |
|
|| BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) |
|
// Tasteless as this may seem, making all members public allows member templates |
|
// to work in the absence of member template friends. |
|
public: |
|
# else |
|
template <class Derived> friend class def_visitor; |
|
# endif |
|
|
|
// unnamed visit, c.f. init<...>, container suites |
|
template <class V, class classT> |
|
static void visit(V const& v, classT& c) |
|
{ |
|
v.derived_visitor().visit(c); |
|
} |
|
|
|
// named visit, c.f. object, pure_virtual |
|
template <class V, class classT, class OptionalArgs> |
|
static void visit( |
|
V const& v |
|
, classT& c |
|
, char const* name |
|
, OptionalArgs const& options |
|
) |
|
{ |
|
v.derived_visitor().visit(c, name, options); |
|
} |
|
|
|
}; |
|
|
|
|
|
template <class DerivedVisitor> |
|
class def_visitor |
|
{ |
|
friend class def_visitor_access; |
|
|
|
# if defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) \ |
|
|| BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551)) |
|
// Tasteless as this may seem, making all members public allows member templates |
|
// to work in the absence of member template friends. |
|
public: |
|
# else |
|
template <class T, class X1, class X2, class X3> friend class class_; |
|
# endif |
|
|
|
// unnamed visit, c.f. init<...>, container suites |
|
template <class classT> |
|
void visit(classT& c) const |
|
{ |
|
def_visitor_access::visit(*this, c); |
|
} |
|
|
|
// named visit, c.f. object, pure_virtual |
|
template <class classT, class OptionalArgs> |
|
void visit(classT& c, char const* name, OptionalArgs const& options) const |
|
{ |
|
def_visitor_access::visit(*this, c, name, options); |
|
} |
|
|
|
protected: |
|
DerivedVisitor const& derived_visitor() const |
|
{ |
|
return static_cast<DerivedVisitor const&>(*this); |
|
} |
|
}; |
|
|
|
}} // namespace boost::python |
|
|
|
#endif // DEF_VISITOR_DWA2003810_HPP
|
|
|