| // 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 |